什么是事件
如何绑定事件
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
