【问题标题】:block parent jquery functions when calling child function调用子函数时阻止父 jquery 函数
【发布时间】:2015-04-13 02:24:25
【问题描述】:

我遇到了与父/子 jquery 函数冲突的问题。子函数是引导函数,父函数是自定义函数。这个想法是父 div(参见下面的代码)可能包含太多数据,因此应该限制高度。当您单击 div 时有一个切换开关,可以展开它,但是当我单击子元素时不应该发生这种情况,因为这个也会折叠下来。

<div id="items" class="semiCollapsed">
  <span data-toggle="collapse" data-target="#x" > an item</span>
  <div id="x" class="collapse">description of item</div>
  ... more items ...
</div>

我的父 JQuery 的功能是:

jQuery(document).ready(function() {
  jQuery('#items').click(function(event) {
    event.preventDefault();
    $("#items").toggleClass("semiCollapsed");
  })
});

和css:

.semiCollapsed {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-height:110px;
}

引导折叠:

http://pastebin.com/Xfnq7R4i

我遇到的问题是,当我调用子函数时,父函数会被调用。如何解决这个问题?

JSFiddle:

http://jsfiddle.net/7fdjL3qx/

【问题讨论】:

  • 为什么要用JQuery来实现这么简单的事情?你可以毫不费力地用纯 JavaScript 做同样的事情。

标签: javascript jquery html css twitter-bootstrap


【解决方案1】:

如果点击的项目不是目标,我们必须返回。 if (event.target !== this) return;

    jQuery('#items').on('click', function (event) {
        if (event.target !== this) return;
        event.preventDefault();
        $(this).toggleClass("semiCollapsed");
    });

小提琴: http://jsfiddle.net/abhiklpm/7fdjL3qx/1/

【讨论】:

    【解决方案2】:

    使用event.stopPropagation(); 而不是event.preventDefault();

    因为发生在子节点上的事件会传递给父节点,所以绑定在父节点上的所有事件也会被执行。

    因此,要阻止事件冒泡到父级,您需要在子级点击事件上设置event.stopPropagation()

    【讨论】:

    • 这有相反的效果:当点击孩子时,父母仍然可以工作,但孩子却不行。
    • @pidgey 您的孩子点击事件在哪里?这是上面发布的问题吗?还是其他?
    • 抱歉,我发布的代码部分错误。我编辑了它。孩子在父母之内
    • 注意:要阻止事件冒泡到父级,您需要在子级点击事件上设置 event.stopPropagation()。 我写的最后一行。停止传播必须用于子点击事件。
    • 但是孩子是默认引导程序。我可以在不更改引导代码的情况下覆盖它吗?
    【解决方案3】:

    您可以在 click 元素内使用检查 event.target.id,如果是 items,则只能切换类。

    jQuery(document).ready(function() {
      jQuery('#items').click(function(event) {
        event.preventDefault();
        if(event.target.id=="items")
       {
        //use this for clicked element instead of finding it again using id
        $(this).toggleClass("semiCollapsed");
       }
      });
    });
    

    【讨论】:

    • 这有相反的效果:当点击孩子时,父母仍然可以工作,但孩子却不行。
    • 我在您共享的 html 中找不到任何带有 id="vuln-conf" 的元素。是vuln-conf 是父母和孩子是别的吗?
    • 哦,对了,我为 stackoverflow 编写了一些更通用的代码,让我编辑它...抱歉
    • 问题是(我对结果的解释)子元素被认为是父元素的一部分,因为它只是文本......
    • 你能在你的问题陈述中分享一个 jsfiddle 链接吗
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2016-11-19
    相关资源
    最近更新 更多