preventDefault()和return false是防止发生默认事件的不同方法。
例如,当用户单击外部链接时,我们应该显示一个确认模式,询问用户是否重定向到外部网站:
hyperlink.addEventListener('click', function (e) {
// Don't redirect the user to the link
e.preventDefault();
});
或者我们不想在单击表单的提交按钮时提交表单。相反,我们希望首先验证表单:
submitButton.addEventListener('click', function (e) {
// Don't submit the form when clicking a submit
e.preventDefault();
});
差异
如果使用addEventListener方法处理事件,return false对默认行为没有任何影响。它仅在事件处理程序声明为元素的属性时有效:
hyperlink.addEventListener('click', function (e) {
// Does NOT work
return false;
});
// Work
hyperlink.onclick = function (e) {
return false;
};
根据HTML5规范,返回false将取消除mouseover事件之外的事件。
良好做法
建议在事件处理程序中使用preventDefault方法,而不是返回false。因为后者只能使用onclick属性,该属性将删除同一事件的其他处理程序。如果您使用jQuery来管理事件,则可以在事件处理程序中使用return false:
$(element).on('click', function (e) {
return false;
});
在返回值false之前,处理程序将执行其他操作。问题是,如果处理程序中发生任何运行时错误,我们将无法在结尾处返回false语句。
在这种情况下,将采用默认行为:
$(element).on('click', function (e) {
// Do something here, but if there's an error at runtime
// ...
return false;
});
我们可以在执行任何自定义处理程序之前使用preventDefault方法来避免这种情况:
$(element).on('click', function (e) {
e.preventDefault();
// Do something here
// The default behavior is prevented regardless of errors at runtime
// ...
});
很高兴知道
如果您使用jQuery来管理事件,那么return false的行为将与preventDefault()和stopPropagation()方法相同:
$(element).on('click', function (e) {
// Prevent the default event from happening and
// prevent the event from bubbling up to the parent element
return false;
});