jQuery return false
在jQuery代码中,我们常见用return false来阻止浏览器的默认行为。例如点击链接,浏览器默认打开一个新窗口/标签,为了阻止浏览器的默认行为,我们往往这样操作:
$("a.toggle").click(function() {
$("#mydiv").toggle();
return false;
});
这段代码的作用是通过点击toggle来隐藏或显示#mydiv,并阻止浏览器继续访问href指定链接。测试如下:
点击上一行的toggle,这段文字将被显示或隐藏。
return false达到了我们想要的目的,但这并不是阻止浏览器执行默认行为的正确方法。调用return false,它实际完成了3件事:
- event.preventDefault()
- event.stopPropagation()
- 停止回调函数执行并立即返回。
我们真正的目的是event.preventDefault(),后两者可不是我们想要的。JavaScript事件有两种,一种称为事件冒泡(event bubbling),一种称为事件捕捉(event capturing)。事件冒泡指事件在初始DOM上触发,通过DOM树往上在每一级父元素上触发;当事件向下冒泡时,我们则称之为事件捕获。
因为return false多做了两件事,由此为代码埋下隐患。下面有一个简单的例子,点击一个链接,加载新的页面内容到当前页面:
<div class="post">
<a href="/js/loadp1.txt">Click here to load page1</a>
<div class="content">
</div>
</div> <div class="post">
<a href="/js/loadp2.txt">Click here to load page2</a>
<div class="content">
</div>
</div> $("div.post a").click(function() {
var href = $(this).attr("href");
$(this).next().load(href);
return false;
});
测试如下:
点击链接就能加载页面内容到当前页,一切都OK。现在我们想要加一个新功能,例如论坛帖子的浏览,只有当前点击的帖子内容才会显示,其他帖子都隐藏。为此我们需要为div.post加一个click()事件处理:
$("div.post").click(function(){
$("div.post .content").hide(); // hide all content
$(this).children(".content").show(); // show this one
});
添加完这段代码后,我们发现它不生效,缘故是因为$("div.post a").click(function() { return false; });,由于return false执行了event.stopPropagation(),因此事件不能冒泡到上一级DOM,即$("div.post").click()不会被事件触发。要达成我们的任务,应该把return false替换为event.preventDefault():
$("div.post a").click(function(e) {
var href = $(this).attr("href");
$(this).next().load(href);
e.preventDefault();
});
测试修改后的代码:
如果把return false和live/delegate事件混用,情况就更糟糕了:
$("a").click(function(){
// do something
return false;
});
$("a").live("click", function(){
// this won't fire
});
如果确实需要阻止事件冒泡,也应该显式地调用:
$("div.post").click(function(){
// do something
});
$("div.post a").click(function(e){
// 浏览器跳转到新页面(默认行为)
// 但阻止事件冒泡,即不会执行$("div.post").click()
e.stopPropagation();
});
event.stopPropagation()用于阻止事件冒泡,jQuery中还有另一个函数:event.stopImmediatePropagation(),它用于阻止一个事件的继续执行,即使当前对象上还绑定了其他处理函数:
$("div a").click(function(){
// do something
});
$("div a").click(function(e){
// stop immediate propagation
e.stopImmediatePropagation();
});
$("div a").click(function(){
// never fires
});
$("div a").click(function(){
// never fires
});
最后结论是:理解return false,尽量避免使用它,请用event.preventDefault()替代return false。
参考
此篇笔记来自jQuery事件处理:别再乱用"return false"了,它的原文又来自Douglas Neiner的jQuery Events: Stop (Mis)Using Return False。
原文地址:http://www.berlinix.com/js/jquery-return-false.php
jQuery return false的更多相关文章
- 原生js使用forEach()与jquery使用each遍历数组,return false 的区别
原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24]; $.e ...
- jquery 中的 return false 不起作用
jquery 中的 return false 不起作用 $(".lcId").each(function(e) { if ($(this).attr("checked& ...
- jquery事件函数和原生事件绑定函数中return false的区别
一直听说jquery中事件函数返回false,相当于调用了event.preventDefault()和event.stopPropagation()两个方法,今天就想看看dom中0级.1级.2级事件 ...
- jQuery中的 return false, e.preventDefault(), e.stopPropagation()的区别
e.stopPropagation()阻止事件冒泡 <html><head> <title></title> <script sr ...
- 在jquery中each循环中,要用return false代替break,return true代替continue。
在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...
- js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 for循环
js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 $(".progressName").each(f ...
- jQuery js 中return false,e.preventDefault(),e.stopPropagation()的区别(事件冒泡)
有时候遇到冒泡事件很烦人,真的..... 1.e.stopPropagation()阻止事件冒泡 <head> <title></title> <script ...
- jQuery中return false,e.preventDefault(),e.stopPropagation()的区别
e.stopPropagation()阻止事件冒泡 <head> <title></title> <script src="Scripts/jQue ...
- jquery中return false的作用
jquery中的return false既阻止默认事件,又阻止冒泡: 在原生的js中,return false只有一个功能,那就是阻止默认事件. <!DOCTYPE html> <h ...
随机推荐
- Intellij编译时报“java: System Java Compiler was not found in classpath”
问题如下: http://stackoverflow.com/questions/19889145/setting-up-intellij-12-idea-with-java-1-7-and-reso ...
- BZOJ 4011 落忆枫音
几个重点: 1.从每个点任选一条入边,都可以成为一个树形图. 2.于是考虑所有答案减去有环的答案. 3.将要求的东西形式化表示出来,然后发现可以直接dp.. 好厉害啊.. #include<io ...
- Java Proxy
Client---->Interface A -- -- 代理类 Class AImpl 代理类是动态生成的,借助Proxy类和InvocationHandler接口进行实 ...
- cout 计算顺序问题
cout输出流的执行顺序 下面是IBM的一道笔试题 #include <iostream> using namespace std; int fun( ) { cout << ...
- array_count_values函数
array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数. 例子 <?php $a=array ...
- 让所有浏览器包括IE6即支持最大宽度又支持最小宽度。
让所有浏览器包括IE6即支持最大宽度又支持最小宽度. _height _width:针对ie6 css hack .yangshi{max-width:620px;min-width:1px;_wi ...
- 30道四则运算<2>单元测试
该测试未实现除法 该测试中间多了/)两个符号,而且没有等号和回车. 该测试也没有符合除法要求 该测试也没有满足除法要求 该测试满足要求. 总结:程序中涉及到有除法的输出都有问题,多次改正未果:其他条件 ...
- Linux 基础入门(新版)(实验一至实验四)
1.实验一 Lniux简介 操作系统:系统调用+内核 Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺:有全球所有的 Linux ...
- HDU 4850
http://acm.hdu.edu.cn/showproblem.php?pid=4850 西安邀请赛当时没做出来的银牌门坎题 题意:构造一个长度n的字符串,长度>=4的子串只能出现一次 题解 ...
- Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建
/*********************************************************************************** * * linux 3.5,U ...