【问题标题】:Toggle a popup and toggle it when clicked outside切换弹出窗口并在外部单击时切换它
【发布时间】:2013-01-29 08:23:38
【问题描述】:

我有一个问题,

我正在尝试使用toggleClass 进行弹出式切换。但是,我还制定了一条从 StackOverflow 获得的规则,当在外部单击时弹出窗口消失。

但是,当我单击登录按钮时,它会出现,但我无法再使用登录按钮使其消失。但我已经制定了规则:

$('a#inloggen').click(function() {
    $('.inloggen').toggleClass('active');
});

但他似乎忽略了这一点......

也许你们可以发现我看不到的问题。

HTML

<div id="usermenu">
<div class="inloggen"><h2 class=" swe-editable" _sweid="17" _sweclass="nl swe swe-snippet swe-h2 ">
Inloggen</h2>

this is the popup!
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Wachtwoord vergeten? <a href="#">Klik hier</a>.</p></div>

</div>  
<ul class="menu">
  <li class="first"><a href="#" id="inloggen">login</a></li>
</ul>

jQuery

$('a#inloggen').click(function() {
    $('.inloggen').toggleClass('active');
  });

  $(document).mouseup(function (e)
  {
      var container = $('.inloggen');

      if (container.has(e.target).length === 0)
      {
          container.removeClass('active');
      }

  });

  if ($('#project_user_loginform-name').hasClass('error') || $('#project_user_loginform-password').hasClass('error')) {
    $('.inloggen').addClass('active');
  };




我尝试了什么?
我试图向在 div 外部单击时使 div 消失的函数添加一个异常,但这似乎只是逆转了进度。
var container2 = $('a#inloggen');
if (container.has(e.target).length === 0 && container2.has(e.target).length !== 0)

更新:
我在进展中更进一步,将 mouseup 更改为 mousedown 并更改了函数的顺序。这让我更接近解决方案,但它还不能完美地工作。

$(document).mousedown(function (e)
  {
      var container = $('.inloggen');

      if (container.has(e.target).length === 0)
      {
          container.removeClass('active');
      }

  });

  $('a#inloggen').click(function() {
    $('.inloggen').toggleClass('active');
  });

示例
http://codepen.io/anon/pen/ghpwr

【问题讨论】:

  • 帮自己一个忙,使用 CSS3 处理这样的低级内容。
  • @jsksma2 这是一个需要兼容IE8的网站。我确实主要使用 CSS3。
  • 我可能是错的,但 CSS3 不兼容 IE8 吗?我想我记得在 IE8 首次发布时成功使用过它。考虑编写 IE 条件并为 IE 设置单独的样式表。它会让你的生活更轻松。
  • @jsksma2 据我所知,CSS3 从 9 版开始就与 IE 兼容。

标签: javascript jquery html popup


【解决方案1】:

我相信完成您想要做的事情的更简单方法是创建一个可以切换弹出窗口的空白 div。基本上像弹出窗口一样隐藏它,当点击登录链接时,有掩码 div &lt;div class="mask"&gt;&lt;/div&gt; 显示,但在 z-index:-1;。这样页面上的链接仍然被识别为链接,但 div 仍然是可点击的。

这是新版本的代码,建议的更改已实施:link

【讨论】:

  • 不错的尝试,但在真实站点中,用户菜单要小得多....这使得掩码 div 仅占站点的一小部分,因为它具有 position:relative;
  • 当我将掩码 div 放置在站点之外时,它确实可以工作......但是它会干扰站点上的许多其他链接/元素。不是正确的解决方案。
  • 可能你错过了我的css,蒙版有绝对位置。
  • 我没有。但是父母有亲戚……所以绝对是观看用户菜单,这是大网站上的一个小盒子。当我把它放在外面时,它似乎适用于网站的特定部分。
  • 我再次查看了您的答案,并通过一些更改来解决问题...
【解决方案2】:

看起来下面一行打破了切换,虽然我不完全确定为什么。

if (container.has(e.target).length === 0) {
  container.removeClass('active');
}

我的猜测是链接被认为是文档的一部分,因此当用户单击链接时,首先删除该类,然后切换,重新添加该类。

【讨论】:

  • 具有挑战性的问题不是吗?我已经为这个问题忙了 1 个多小时了......仍然没有结果。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多