二者很像,只是有一些语法上的不同。html
click 事件和 href 的优先级:react
click >>> href浏览器
若是在后面写 return false
能够阻止默认事件。注意只能是字符串形式的 js 代码,方法调用不行。bash
<span onclick="console.log('我被点击了!!!')">Click me</span>
复制代码
<span onclick="handle()">Click me</span>
function handle() {
console.log('我被点击了!!!); } 复制代码
此时返回 false 能够阻止默认事件。dom
elementObject.onclick = function(){
// 事件处理代码
}
复制代码
Dom 2 的写法:异步
ele.addEventListener(‘click’, handle, false);
复制代码
不管在DOM0仍是DOM2仍是DOM3中都会在事件函数中传入事件对象;函数
经常使用属性:ui
currentTarget : 当前时间程序正在处理的元素, 和this同样的;
target || srcElement: 事件的目标
view : 与元素关联的window, 咱们可能跨iframe;
eventPhase: 若是值为1表示处于捕获阶段, 值为2表示处于目标阶段,值为三表示在冒泡阶段
preventDefault() 取消默认事件;
stopPropagation() 取消冒泡或者捕获;
stopImmediatePropagation 阻止绑定在事件触发元素其余同类事件的callback的运行
trusted: 为ture是浏览器生成的,为false是开发人员建立的(DOM3)
复制代码
事件目的地节点既绑定了冒泡事件也绑定了捕获事件,若是是同一类型则按照代码执行顺序执行this
除了阻止事件的冒泡,还阻止事件的继续捕获,简而言之就是阻止事件的进一步传播。spa
接口和原来的 dom 事件一致。绑定处理函数分两种状况:
包装了浏览器的原生的事件,而且是跨浏览器的。
<div className="box1" onClick={this.handleClickOne}>
复制代码
1. 箭头函数:<div className="box2" onClick={e => this.handleClickTwo(e)}
2. bind 方法:<div className="box2" onClick={this.handleClickTwo.bind(this, e, others)}
复制代码
Event Pooling:事件池
react 中的事件会被重用,每一次事件对应的回调函数执行后事件上的全部属性都会失效。
好比经过 setTimeout 异步方式访问事件会报错。
此时的解决方法是调用 persist() 方法移出事件池从而保留事件对象。
事件处理函数都是在冒泡阶段执行,若是要让事件处理函数在捕获阶段执行,事件名后面加 Capture
就行。
onClick ==> onClickCapture
复制代码
合成事件中的 currentTarget 指向当前 dom 元素,可是 nativeEvent 的 currentTarget 指向 document
nativeEvent 的 currentTarget 指向 document
e.nativeEvent.stopImmediatePropagation();
复制代码
document.body.addEventListener('click',e=>{
// 经过e.target判断阻止冒泡
if(e.target&&e.target.matches('a')){
return;
}
console.log('body');
})
复制代码
使用到的事件对象有 Event
和 CustomEvent
自定义事件和触发事件:
// 经过 Event 建立新的事件
const event = new Event('newEvent');
box1.addEventListener('newEvent', function() {
console.log('newEvent 事件被触发了!!!!')
});
setTimeout(function() {
// 经过调用元素的 dispatchEvent 方法在该元素上面触发该事件
box1.dispatchEvent(event);
}, 2000);
复制代码
自定义事件的时候,为事件对象添加数据:
const customEvent = new CustomEvent('customEvent', { 'data': '2121212' });
box1.addEventListener('customEvent', function(e) {
console.log('customEvent 事件被触发了!!!!', e, customEvent)
});
setTimeout(function() {
box1.dispatchEvent(customEvent);
}, 2000);
复制代码
box1.addEventListener('click', function(e) {
console.log('代码控制触发内置事件', e)
});
setTimeout(function() {
const click = new MouseEvent('click')
box1.dispatchEvent(click)
}, 2000)
复制代码
其中 click
事件还能够经过 HTMLElement
对象上面的 的 click()
方法模拟。
其中 querySelector 和 querySelectorAll
是 Element
上面的方法。