1.ele.onxxx = function(){}
兼容性很好,但是一个元素同一事件只能出现一次基本等同于写在HTML行间上程序this指向dom元素本身 //eg: div.onclick = function (){ console.log('a'); }1 <div style="width: 100px; height:100px; =“console.log(‘a’)”>
2.obj.addEventListener(type, fn, false);
(事件类型,处理函数,false)IE9一下不兼容,可以为一个事件绑定多个处理程序,但是同一个函数不能多次引用程序this指向dom元素本身 var div = document.getElementsByTagName('div')[0]; div.addEventListener('click',function(){ console.log('a'); },false)3.obj.attachEvent(‘on’ + 事件类型, 处理函数)
IE独有,一个事件同样可以绑定多个处理程序程序this指向window绑定事件出现在循环中,考虑是不是会形成闭包,可以考虑使用立即执行函数更改
//点击第几个a,会弹出相应的序号 <body> <ul> <li>a</li> <li>a</li> <li>a</li> <li>a</li> </ul> <script> var lin = document.getElementsByTagName('li'); var len = lin.length; for (var i = 0; i < len; i ++){ (function (i) { lin[i].addEventListener('click',function () { console.log(i); },false); }(i)) } </script> </body>默认事件:表单提交,a标签跳转,右键菜单
return false; 以对象属性的方式注册的事件才生效event.preventDefault(); W3C标准event.returnValue = false; document.oncontextmenu = function(e){//右键出现菜单默认事件 console.log('a'); // return false; event.preventDefault(); }event.target (火狐只有这个) event.srcElement (IE只有这个)
利用事件冒泡,和事件源对象进行处理 优点:
性能 不需要循环所有的元素一个一个绑定事件灵活 当有新的子元素时不需要重新绑定事件 <ul> <li>a</li> <li>a</li> <li>a</li> <li>a</li> <li>a</li> </ul> <script> var ul = document.getElementsByTagName('ul')[0]; ul.onclick = function (e){ var event = e || window.event;//事件源对象 var target = event.target || event.srcElement; console.log(target.innerText); } </script>拖拽问题
用button 来区分鼠标的按键,button返回是0,则是左键;返回值是1,则是滚轮;返回值是2,则是右键 DOM3标准规定:click事件只能监听左键,不能监听右键,只能通过onmousedown ,onmuseup方法
keydown 可以响应任意键盘按键; keypress只可以响应字符类按键,且返回其ASCLL码,可以转化成相应字符
document.onkeypress = function (e){ console.log(String.fromCharCode(e.charCode)); }input ,focus, blur, change
var input = document.getElementsByTagName('input')[0]; input.oninput = function (e){ //也可以改为change console.log(this.value); } <input type="text" value="请输入用户名" onfocus="if(this.value =='请输入用户名') {this.value=''}" onblur="if(this.value==''){this.value='请输入用户名'}">