Javascript 为什么返回false会阻止jQuery的传播,而它不会';你不喜欢POJ吗?
下面是一个使用POJS的JSFIDLE,显示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</
返回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();
}
}