2021-11-03 10:05:10 +08:00

170 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 阻止事件默认行为
## 经典真题
- 如何阻止默认事件?
## 什么是默认行为
所谓默认行为,一般是指 *HTML* 元素所自带的行为。例如点击一个 *a* 元素表示的是跳转:
```html
<a href="https://www.baidu.com">百度一下</a>
```
在上面的代码中,设置了 *a* 元素的 *href* 属性指向百度,当用户点击该 *a* 元素时,就会跳转至百度。
在例如:
```html
<form action=""></form>
```
上面的代码中我们书写了一个 *form* 元素,该元素有一个 *action* 属性,指的是表单内容要提交的地址。而当用户点击表单元素中嵌套的提交按钮时,就会进行一个默认的提交操作。
这些,就是 *HTML* 元素中的默认行为。
但是有些时候,我们是不需要这些默认行为的,例如,用户在填写了一个表单后,提交信息时我们采用 *ajax* 来异步发送到服务器,此时就不需要表单 *form* 元素默认的提交跳转这个行为了。
所以此时,我们就需要阻止默认行为。
## 阻止默认行为的方式汇总
下面我们来对阻止默认行为的方式进行一个总结。
**1*cancelable* 属性**
首先要介绍的是 *cancelable* 属性,该属性返回一个布尔值,表示事件是否可以取消。
该属性为只读属性。返回 *true* 时,表示可以取消。否则,表示不可取消。
```html
<a id="test" href="https://www.baidu.com">百度</a>
```
```js
var test = document.getElementById("test");
test.onclick = function (event) {
test.innerHTML = event.cancelable; // true
}
```
在上面的代码中,我们为 *a* 元素绑定了一个点击事件,点击之后通过 *event* 对象的 *cancelable* 属性来查看该元素的默认行为是否能阻止。
最终返回的是 *true*,说明是能够阻止的。
**2*preventDefault* 方法**
*preventDefault* 方法是 *DOM* 中最常见,也是最标准的取消浏览器默认行为的方式,无返回值。
```js
var test = document.getElementById("test");
test.onclick = function(event){
event.preventDefault();
}
```
在上面的代码中,我们仍然是通过 *event* 对象来调用的 *preventDefault* 方法,从而阻止了 *a* 元素的默认跳转行为。
**3*returnValue* 属性**
这种方式使用的人比较少,知道这种方式的人也比较少。
首先 *returnValue* 是一个 *event* 对象上面的属性。该属性可读可写,默认值是 *true*,将其设置为 *false* 就可以取消事件的默认行为,与 *preventDefault* 方法的作用相同。
该属性最早是在 *IE* 的事件对象中,实现了这种取消默认行为的方式,但是现在大多数浏览器都实现了该方式。
```js
var test = document.getElementById("test");
test.onclick = function(event){
event.returnValue = false;
}
```
**4*return false***
*return false* 是一条语句,该语句写在事件处理函数中也可以阻止默认行为。
但是需要注意的是,如果该条语句写在 *jQuery* 代码中,能够同时阻止默认行为和阻止冒泡,但是在原生 *JavaScript* 中只能阻止默认行为。
```js
var test = document.getElementById("test");
test.onclick = function(){
return false;
}
```
**5*defaultPrevented* 方法**
*defaultPrevented* 属性也是 *event* 对象上面的一个属性。该属性表示默认行为是否被阻止,返回 *true* 表示被阻止,返回 *false* 表示未被阻止。
```js
var test = document.getElementById("test");
test.onclick = function (event) {
// 采用两种不同的方式来阻止浏览器默认行为,这是为了照顾其兼容性
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
// 将是否阻止默认行为的结果赋值给 <a> 标签的文本内容
test.innerHTML = event.defaultPrevented;
}
```
在上面的代码中,我们点击 *a* 元素时,使用 *preventDefault* 方法阻止了浏览器默认行为。
之后访问 *event.defaultPrevented* 属性会得到 *true*,说明默认行为已经被阻止。
## 真题解答
- 如何阻止默认事件?
> 参考答案:
>
> ```js
> // 方法一:全支持
> event.preventDefault();
> // 方法二:该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。
> event.returnValue = false;
> // 方法三不建议滥用jQuery 中可以同时阻止冒泡和默认事件
> return false;
> ```
-*EOF*-