您是否曾经在 jQuery 中看到过这两件事(标题中)?这是一个简单的例子
$("a").click(function() {
$("body").append($(this).attr("href"));
return false;
}
该代码将在每次点击链接时将href属性作为文本附加到 body 中,但**不会**实际跳转到该链接。“return false;”代码部分阻止浏览器执行该链接的默认操作。这与下面的代码作用相同:
$("a").click(function(e) {
$("body").append($(this).attr("href"));
e.preventDefault();
}
那么有什么区别呢?
区别在于return false;更进一步,它还阻止了该事件在 DOM 中传播(或“冒泡”)。您可能不知道的是,每当某个元素上发生事件时,该事件也会在每个父元素上触发。因此,假设您在一个盒子里面嵌套另一个盒子,两个盒子都绑定了点击事件。当您点击内层盒子时,外层盒子的点击事件也会触发,除非您阻止传播。如下所示:
换句话说
function() {
return false;
}
// IS EQUAL TO
function(e) {
e.preventDefault();
e.stopPropagation();
}
这一切可能比这复杂得多,并且文章 如这篇 可能更好地解释了所有内容。
我以前一直不知道“return false”的作用。它是否总是阻止默认操作,或者取决于上下文?
哥们,你是刚开始学习网页开发吗?
return false 是编程中最古老的语句之一。
上帝保佑所有那些不懂编程的“网页开发者”。
从他名字下的链接来看,我想他可能是个电影人,我不会期望他对网页开发有任何了解。
第一个回复完全没有必要。人们来到 CSS-Tricks 是为了学习,而不是被那些自以为无所不知的人嘲笑。
我已经从 Chris 那里学到了很多基础知识,我相信其他人(甚至是专业人士)也都有同样的体验。
是啊,我也不知道!我想,那么,最好是阻止默认操作而不是停止所有传播(某种意义上的跟随流程……)
感谢 Chris 解释了区别。我一直以为它们是一样的 :P
我以前从未理解“冒泡”!
这是否意味着 return false 方法更快或更少占用 js 资源?
显然,是的
“…如果您的文档结构非常复杂……您可以通过关闭冒泡来节省系统资源。”
— 如这篇
我写了一个关于事件的教程,也许第 11 步可以澄清一些事情,即使它关于 ActionScript 3.0,冒泡(事件流)背后的理论也是一样的。
http://active.tutsplus.com/tutorials/actionscript/a-close-look-at-the-actionscript-30-event-framework/
如果页面中存在 JavaScript 错误,使用 return false 浏览器将执行默认操作。这可以通过使用 preventDefault() 来避免。
示例
不错。
这是一个很好的例子,强调了 e.preventDefault() 的灵活性。即它可以在任何时候被调用。代码可以全部放在前面、后面,甚至可以放在它周围。(例如在 if() 语句中)
如果在一个元素上绑定了两个处理程序,return false 也会阻止第二个处理程序的执行。我认为 return false 是阻止在同一元素上执行其他处理程序的唯一方法。
至少我找到了。return false 的正确工作方式是(jQuery)
function() {
return false;
}
// 等于
function(e) {
e.preventDefault();
e.stopImmediatePropagation();
}
我前几天还在想这个问题!!我几乎总是使用 `return false;`,从不知道它们之间的区别。
以前不知道,谢谢你的信息。
我最喜欢的展示这个的例子是这样的
哥,你写的代码我看不懂啊,真让人蛋疼!!!!讲中文塞!!!
不错。现在我已经学到了今天的东西,我要回去睡觉了。 :)
有用的提示,谢谢 Chris :)
非常有用!谢谢。我现在要多用 e.preventDefault() 了 :)
这可能有点过头了,但为了安全起见,可以尝试一下
e.preventDefault(); 实际上可以用来在触摸屏设备上创建拖放界面,以防止默认的滚动或缩放行为。它非常好用。
一如既往,Chris,很棒的文章。
我一直使用 return false;
我甚至都不知道 e.preventDefault();
所以再次感谢!继续努力!!
我想了解更多关于 JavaScript 的知识。但我还没有找到简单有效的方法来学习。有人可以帮助我吗?
我可以。
说的真好。就是这么回事。i am from China
这篇文章值得一读。我不确定为什么,但我总是使用 preventDefault。我相信我现在会使用 return false,因为这应该是更快、更有效的方法。感谢 Chris 的帖子。
我通常使用 return false,但我认为 feroc1ty 和 Mark 给出了在不正确选择时的一些很好的例子。
谢谢 Chris!我还有一个问题,"e" 到底是什么?
它是一个任意的变量名。
“e” 是一个参数变量的名称。此变量是一个 jQuery `event` 对象,其中包含有关事件的所有信息。jQuery 中的所有事件处理程序都将其作为第一个参数接收。
深入了解,`stopPropagation`、`preventDefault` 是此事件对象的 方法。
更多详情
event.preventDefault();
例如,阻止点击事件被触发,但是如果用于点击事件的选择器在另一个函数的范围内,event.preventDefault() 将不起作用,因为事件正在向作用域上层“冒泡”,而 event.stopPropagation 将“终止”事件,即使在更远的范围。
我更喜欢使用 event.stopPropagation() 而不是 event.preventDefault() 来阻止事件冒泡。
删除链接和JS确认的示例
JS
或
你好,Chris。
我正在做一个示例,需要在某个div上添加“active”类,并在第二次点击时移除该类。但是,如果点击div内部的某个链接,我不想移除“active”类。“return false”用于这些内部链接是否是我的最佳解决方案?它确实有效,我只是想知道它是否是最佳解决方案。
这里关于在事件中使用
return false
存在一个主要的误解。jQuery 将 return false 作为内部标志处理——用它来表示“阻止默认操作并停止传播”。原生事件监听器不会以相同的方式处理它。
如果您没有使用 jQuery,那么在
addEventListener
中使用 return false 仅仅是遗留问题——它是e.returnValue = false
的简写,后者是已弃用的语法。它在不同浏览器之间的行为不一致,但无论如何您都不需要使用它。如果您没有使用 jQuery,则根本不要返回任何值,请使用以下任何或所有方法:
preventDefault()
阻止默认操作,stopPropagation()
停止事件冒泡,或stopImmediatePropagation()
停止事件分派到同一元素上的其他处理程序(尽管最后一个方法的浏览器支持度不高)。如果您使用的是 jQuery,则 return false 等效于调用
e.preventDefault(); e.stopPropagation();
(即,jQuery 中的 return false 只是一个专有的快捷方式,它本身没有任何含义)
可能值得一提的是,在当前版本的 jQuery 中,以这种方式使用 return false 已被弃用,并会导致错误记录到控制台(这会导致旧版本的 IE 抛出错误,因为不支持 console.log())。您应该使用 e.preventDefault()。
这个例子在 Firefox 24.6.0 上似乎根本不起作用?