什么是事件
如何绑定事件
on+事件()
div.onclick = function(给一个事件绑定一个处理函数){
//写我们需要的逻辑
}
addEventListener(给一个事件绑定多个处理函数,注意同一个函数只能绑定一次)
div._addEventListener(事件类型,处理函数,false)_
div.addEventListener("click",function(){
console.log('a')
},false)
attachEvent(事件类型,处理函数__)//兼容性问题,只能在IE上面使用
所有浏览器封装公共的事件方法:_
//elem 为dom,type为事件类型,handle为事件
function addEvent(elem, type, handle) {
if (elem.addEventListener) {
elem.addEventListener(type, handler, false);
} else if (elem.attachEvent) {
elem.attachEvent("on" + type, function () {
handler.call(elem);
})
} else {
elem['on' + type] = handle;
}
}
dom元素事件中的__this指向元素本身,但是attchEvent的this指向window,可以考虑通过方法.call(dom)
解除事件
1) div.onclick=null;
2)dom.removeEventLinsten(事件类型,事件,false)//注意事件必须使用引用
例如:
<body>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>a</li>
</ul>
<script type="text/javascript">
var licol = document.getElementsByTagName('li');
for (var i = 0; i < licol.length; i++) {
(function (j) {
licol[j].addEventListener("click", test, false)
}(i))
}
function test() {
console.log(this)
this.removeEventListener("click", test, false)
}
</script>
</body>
事件处理模型(重要)
事件冒泡:
对于代码结构父子嵌套结构元素,点击子元素会一级一级的往父元素的扩展,自低往上
事件捕获:
对于代码结构父子嵌套结构元素,点击子元素会一级一级的往父元素的扩展,自顶往下
注意:执行顺序为先捕获后执行
focus blur change submit reset select 等事件不冒泡
取消冒泡
w3c标准 :e._stopPropagation()_
IE独享:e.cancelBubble=true
封装一个函数取消冒泡:
function stopBubble(event) {
if (event.stopPropagation()) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
阻止默认事件
return false //针对句柄语句
event.preventDefault();//W3C标注,IE9不兼容
event.returnValue=false 兼容IE
封装阻止默认事件的函数
function cancleHandler(event) {
if (event.preventDefault()) {
event.stopPropagation();
} else if(event.returnValue){
event.returnValue=false;
}
}
实例:比如我们想要取消a标签的点击事件
dom.onclick = function(){
return false
}
事件对象
IE的e不起作用:做个兼容 var event = e||window.evemt
事件源对象:var target = event.target||event.srcElement
事件委托
利用事件冒泡,和事件源对象进行处理
优点:
1.性能不需要循环所有的元素一个个绑定
2.灵活当有新的子元素是不需要重新绑定事件
例如:
<body>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>a</li>
</ul>
<script type="text/javascript">
var ul = document.getElementsByTagName('ul')[0];
ul.onclick = function(event){
var event = event||window.event;
var target = event.target||event.srcElement;
console.log(target.innerHtml)
}
</script>
</body>
事件类型
拖拽功能封装
function drag(elem) {
var disX, disY;
elem.onmousedown = function (e) {
var event = e || window.event;
disX = event.pageX - parseInt(elem.style.left);
disY = event.pageY - parseInt(elem.style.top);
document.addEventListener("", function (event) {
var event = event || window.event;
elem.style.left = event.pageX - disX + "px"
elem.style.top = event.pageX - disY + "px"
}, false)
document.onmouseup = function () {
elem.onmouseup = null
}
}
}
鼠标事件
1) click mousedown mouseup contexmenu mousemove mouseover mouseenter mouseleaver
2)区分鼠标左右键 mouseup mousedown//e.button