event.preventDefault() 和 return false 都可以终止程序,二者有什么异同点?
为了彻底弄清楚它们之间的区别,我不得不要先说一下 中两种事件传播模式:
- 捕获模式(capturing)
- 冒泡模式(bubbling)
捕获模式又称为“滴流模式”(trickling),个人认为滴流模式更好理解,滴流就是“从上向下”,而冒泡就是“从下向上”,好了,先记住这两种模式的特点。
同时你还要记住,这两种模式是为了干什么的?
这两种模式就是为了一点:决定html中“元素”(比如div, p, button)接收到事件的“顺序”!当然接收到事件的顺序不同,自然事件监听函数被触发的顺序就不同了,于是间接地就出现了监听函数被执行顺序的不同。
说一下事件传送机制就可以明白了
事件传递机制:
例如鼠标被按下后,mousedown事件被触发。
事件先从document->ancestor element->...->parent->event.target(在此元素上按下的鼠标)->parent->...->ancestor element->document.
事件走了一个循环(从documet到event.target再回到document),从documet到event.target的过程叫做捕获模式,从event.target到document的过程叫做冒泡模式。
下面我们再来了解一下e.preventDefault() e.stopPropagation()和return false的区别
- event.stopPropagation(); 事件停止冒泡到,即不让事件再向上传递到document,但是此事件的默认行为仍然被执行,如点击一个链接,调用了event.stopPropagation(),链接仍然会被打开。
- event.preventDefault(); 取消了事件的默认行为,如点击一个链接,链接不会被打开,但是此事件仍然会传递给更上一层的先辈元素。
- return false; 相当于同时调用了event.stopPropagation()和event.preventDefault(),事件的默认行为不会被执行,事件也不会冒泡向上传递。
实例讲解:
假如有这样一个页面:
<!DOCTYPE>
<html :lang=\"zh\" lang=\"zh\">
<head>
< >test js 事件阻止</ >
< http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"/>
< type=\"text/ \" src=\"http://code.jquery.com/jquery.js\"></ >
$(function(){
$(\"#parent\").bind(\'click\', fun_p);
$(\"#child\").bind(\'click\', fun_c);
$(\"#lnk\").bind(\'click\', fun_a);
});
function fun_p()
{
alert(\'parent\');
}
function fun_c()
{
alert(\'child\');
}
function fun_a()
{
alert(\' \');
}
</head>
<body>
<div id=\"parent\">
<div id=\"child\">
<a href=\"http://www.manongjc.com\" id=\"lnk\">码农教程</a>
</div>
</div>
</body>
</html>
在浏览器中打开html文件,点击其中的 ("码农教程"),依次执行以下操作:
- 触发 的click事件alert(' ')
- 向上传递click事件到父元素div(id为child的div),触发此div的click事件alert('child')
- 继续传递click事件到父元素div(id为parent的div),触发此div的click事件alert('parent')
- 执行 的默认动作,即跳转到码农教程
下面我们来修改一下代码:
修改一:在function fun_a里追加一行return false;
function fun_a()
{
alert(\' \');
return false;
}
在浏览器中打开html文件,点击其中的 ("码农教程"),依次执行以下操作:
- 触发 的click事件alert(' ')
上面的2,3,4步被阻止了
修改二:
在function fun_a里追加一行event.preventDefault():
function fun_a()
{
alert(\' \');
event.preventDefault();
}
在浏览器中打开html文件,点击其中的 ("码农教程"),依次执行以下操作:
- 触发 的click事件alert(' ')
- 向上传递click事件到父元素div(id为child的div),触发此div的click事件alert('child')
- 继续传递click事件到父元素div(id为parent的div),触发此div的click事件alert('parent')
的默认动作被函数[preventDefault()]阻止了
修改三:
function fun_a里追加一行event.stopPragation():
function fun_a()
{
alert(\' \');
event.stopPropagation();
}
在浏览器中打开html文件,点击其中的 ("码农教程"),依次执行以下操作:
- 触发 的click事件alert(' ')
- 执行 的默认动作,即跳转到码农教程
向上传递事件被函数[stopPragation()]阻止了
修改四:
在function fun_a里追加两行event.preventDefault()和event.stopPragation()
function fun_a()
{
alert(\' \');
event.preventDefault();
event.stopPropagation();
}
在浏览器中打开html文件,点击其中的 ("码农教程"),依次执行以下操作:
- 触发 的click事件alert(' ')
与修改一种的结果一样,说明了return false;是包含了preventDefault和stopPragation两个功能的。
总结:
e.preventDefault(); //阻止事件的默认行为,比如a标签的转向,但不阻止事件的冒泡传播 e.stopPropagation() //阻止事件的冒泡传播,但不阻止其默认行为 returne false; //阻止两者(e.preventDefault()和e.stopPropagation())
继续阅读与本文标签相同的文章
-
健乐教学机器人可开展的教学实训内容
2026-05-14栏目: 教程
-
5G套餐曝光遭“吐槽”,iphone11受追捧,导致苹果11销量比较高
2026-05-14栏目: 教程
-
为什么修电脑的叫自己不要杀毒和清理垃圾?
2026-05-14栏目: 教程
-
当水乡建筑遇上机器人,成就乌镇又一网红景点
2026-05-14栏目: 教程
-
惊险!手刹失灵,郴州一货车开启“无人驾驶”模式……
2026-05-14栏目: 教程
