Javascript 为什么返回false会阻止jQuery的传播,而它不会';你不喜欢POJ吗?

Javascript 为什么返回false会阻止jQuery的传播,而它不会';你不喜欢POJ吗?,javascript,jquery,Javascript,Jquery,下面是一个使用POJS的JSFIDLE,显示返回false不停止事件的传播: 下面是另一个使用jQuery的例子,显示返回false是否停止事件的传播: Edit:向我解释jQuery为什么会这样做的人——故意与原始行为不同——(以及在代码中的位置)得到了答案 下面是代码(很长,但很容易阅读): 两个版本的HTML: <div id="parent1"> <div id="child1"><a href="#" id="a1">child1</

下面是一个使用POJS的JSFIDLE,显示
返回false不停止事件的传播:

下面是另一个使用jQuery的例子,显示
返回false是否停止事件的传播:

Edit:向我解释jQuery为什么会这样做的人——故意与原始行为不同——(以及在代码中的位置)得到了答案

下面是代码(很长,但很容易阅读):

  • 两个版本的HTML:

    <div id="parent1">
        <div id="child1"><a href="#" id="a1">child1</a></div>
    </div>
    
    <div id="parent2">
        <div id="child2"><a href="#" id="a2">child2</a></div>
    </div>
    
    <div id="parent3">
        <div id="child3"><a href="#" id="a3">child3</a></div>
    </div>
    
  • jQuery版本:

    $( '#child1' ).click( function( e ) {
        console.log( 'child1' );
        e.preventDefault();
    });
    
    $( '#parent1' ).click( function( e ) {
        console.log( 'parent1' );
    });
    
    $( '#child2' ).click( function( e ) {
        console.log( 'child2' );
        return false;
    });
    
    $( '#parent2' ).click( function( e ) {
        console.log( 'parent2' );
    });
    
    $( '#child3' ).click( function( e ) {
        console.log( 'child3' );
        e.stopPropagation();
    });
    
    $( '#parent3' ).click( function( e ) {
        console.log( 'parent3' );
    });
    
在的第3331行,在
jQuery.event.dispatch
中:

ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
         .apply( matched.elem, args );

if ( ret !== undefined ) {
    event.result = ret;
    if ( ret === false ) {
        event.preventDefault();
        event.stopPropagation();
    }
}
在这一行之前已经进行了很多打包,但基本上,它使用
apply
运行处理函数(原始函数或
handler对象的
memeber函数)。如果该调用的结果为false,则会执行
preventDefault
stopPropagation

文件中提到了这一点:

从事件处理程序返回
false
将自动调用
event.stopPropagation()
event.preventDefault()

至于他们为什么这么做?我不知道,因为我不是jQuery设计团队,但我认为这只是因为
returnfalse
event.preventDefault()键入要快得多;event.stopPropagation()。(如果jQuery不是为了确保您可以少输入一些内容,那么我不确定它是关于什么的。)


我不相信事件处理程序的返回值在POJS中的任何地方都被实际使用过(如果这是错误的,有人会纠正!)。因此,jQuery可以安全地使用
return
语句在处理程序中造成副作用(因为在POJS处理程序中返回false是没有意义的,POJS功能不会受到损害)。

我想知道jQuery的事件处理是否接收到了return false并在那里停止传播……如果是这样的话,我想看看在哪里:-),它为什么要这样做?啊,可能就是这样。转到jQuery源代码(),搜索“event.stopPropagation”,这是在条件检查返回值是否为false之后发生的。奇怪的是,
e.stopPropagation()
是唯一适用于POJS示例的方法。从(事件处理程序及其环境下的倒数第二段)开始:“从事件处理程序返回
false
将自动调用
event.stopPropagation()
event.preventDefault()
“为什么它会这样做?这是我的主要问题(但是+1表示代码中的确切位置)。嘿,我想我忘记了座右铭。谢谢!因为通常人们都这么说”丢弃此事件,不要对其进行任何进一步处理“当它们
返回false时在处理程序中。我添加了一点进一步的细化,这有点推测性。如果我对POJS中事件处理程序的返回值有错误,请告诉我。您在文章的第一部分是对的,但POJS确实将
return false
视为
e.preventDefault()
,但仅当在*
处理程序中使用时。(并且
返回false
,即使在*
处理程序上的
内部,也不会对停止冒泡或捕获传播产生影响。)请参阅以获取一些示例。
ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
         .apply( matched.elem, args );

if ( ret !== undefined ) {
    event.result = ret;
    if ( ret === false ) {
        event.preventDefault();
        event.stopPropagation();
    }
}