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 ...
随机推荐
- META标签的NAME变量
META标签的NAME变量语法格式是: <META NAME=xxx CONTENT=xxxxxxxxxxxxxxxxxx> 其中xxx主要有下面几种参数: 1. Keywords(关键字 ...
- UIWebView stringByEvaluatingJavaScriptFromString的使用方法
stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载 ...
- MATLAB做主成分分析(PCA)
简单的主成分分析.第一次见识PCA,我的认识是,尽量用更少的维度来描述数据,以达到理想(虽不是最好,但是''性价比''最高)的效果. %% 主成分分析降维 clear; % 参数初始化 inputfi ...
- Redis - sort set类型操作
sort set操作:sort set在set基础上增加了一列用于存储顺序序列设置操作:zadd key: zadd key sortnum value 指定key增加元素 ...
- 超链接访问过后hover样式就不出现的问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- C/C++学习之路----volatile
因为经常看见volatile这个关键词,想想自己对这个volatile也不是很清楚,仅仅知道它表明变量是易于变化的和防止编译器优化.所以就在网上找了一些其他道友对于volatile的理解,仔仔细细看了 ...
- 二分查找(Binary Search)
二分查找(Binary Search): int BinarySearch(int *array, int N, int key) { ; int left, right, mid; left = ; ...
- 输出NSRange类型的数据
如果你想知道字符串内的某处是否包含其他字符串,使用rangeOfString: 方法 -(NSRange)rangeOfString :(NSString *)aString; NSString *n ...
- 199. Binary Tree Right Side View
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...