Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery.live()工作不正常_Javascript_Jquery - Fatal编程技术网

Javascript JQuery.live()工作不正常

Javascript JQuery.live()工作不正常,javascript,jquery,Javascript,Jquery,我知道live在1.7版中被弃用,在1.9版中被删除,不再推荐使用。但是,由于我正在准备面试机器测试,因此我试图了解直播和上的之间的区别。说 在事件处理程序中调用event.stopperPagation()对于停止连接在事件处理程序下部的事件处理程序无效 文件;事件已传播到文档 所以我试过这个。 标记: 我使用的是Jquery版本1.7,其中live和on都存在 发生了什么: span的live没有被调用,而是直接调用单击a的 如果我删除了除live之外的所有其他事件,则会调用它 正如doc所

我知道
live
在1.7版中被弃用,在1.9版中被删除,不再推荐使用。但是,由于我正在准备面试机器测试,因此我试图了解
直播
和上的
之间的区别。说

在事件处理程序中调用event.stopperPagation()对于停止连接在事件处理程序下部的事件处理程序无效 文件;事件已传播到文档

所以我试过这个。 标记:

我使用的是Jquery版本1.7,其中
live
on
都存在

发生了什么:

  • span的
    live
    没有被调用,而是直接调用
    单击
    a的
  • 如果我删除了除
    live
    之外的所有其他事件,则会调用它
  • 正如doc所说,它的作用正好相反,即如果我使用
    event.stopPropagation(),它将停止事件冒泡

  • live
    附加的事件处理程序始终附加到
    文档
    。如果在
    live
    的回调中调用
    event.stopPropagation
    ,则此事件已经冒泡到文档中,因此它对直接连接的事件处理程序没有影响

    当事件到达
    h1
    元素时,将调用您的
    event.stopPropagation()
    ,因此它永远不会到达
    文档
    中附加了
    live
    事件处理程序的位置

    通过启用
    可以创建jQuery支持的所有类型的事件处理。如果您查看jQuery的源代码,可以看到在1.7中,
    live
    函数只映射到on:

    live: function( types, data, fn ) {
       jQuery( this.context ).on( types, this.selector, data, fn );
       return this;
    }
    
    删除
    live
    的原因是为了使api更清晰、更符合逻辑,以确定事件发生的时间和捕获的位置

    编辑

    您的DOM和事件处理程序连接到的位置:

     document    $('span').live("click") **not called**  (equal to: $(document).on('click', 'span') ) 
        |
       div       $('div').click() **not called**
        |
        h1       $('h1').click() + event.stopPropagation() **the propagation (bubbling)  is stopped here not reaching the document**
        |
        a        $('a').click()
        |
       span      **event happens here and bubbles up**
    

    在事件处理程序中调用event.stopPropagation()在停止文档中较低位置附加的事件处理程序时无效JSFIDLE中的行为是正确的。它可以阻止事件在文档中冒泡,但是在阻止附加到子dom的事件时效率很低,这就是为什么h1和a上的事件需要回复的原因,但是第一点呢?为什么span
    live
    没有被呼叫?@Imad抱歉,关于3的
    应该被删除。这与这三个方面有关。
    live
    回调始终是为给定事件调用的最后一个回调,因为它们附加到
    文档中,该文档是冒泡阶段的最后一个元素。先生,但我找不到这一点的答案,可能是我误解了完整的概念。@Imad我在答案中添加了一个编辑,将我所写的可视化。谢谢,现在我明白了。
    
    live: function( types, data, fn ) {
       jQuery( this.context ).on( types, this.selector, data, fn );
       return this;
    }
    
     document    $('span').live("click") **not called**  (equal to: $(document).on('click', 'span') ) 
        |
       div       $('div').click() **not called**
        |
        h1       $('h1').click() + event.stopPropagation() **the propagation (bubbling)  is stopped here not reaching the document**
        |
        a        $('a').click()
        |
       span      **event happens here and bubbles up**