🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
昨天晚上,朋友问我怎样实现模拟鼠标点击事件,于是有了查找资料,并得到了一些结果。 先附上代码。 ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <style type="text/css"> a{ border: 2px solid red; text-decoration: none; cursor: pointer; font-weight: bold; margin-top: 10px; padding: 20px; } </style> </head> <body> <a id = "box" href = "javascript:void(0)">点击</a> </body> </html> <script type="text/javascript"> window.onload = function(){ var oBox = document.getElementById("box"); function onclick(e){ e = e || window.event; // console.log(e); alert("a"); } simulation(oBox, "click", onclick); function simulation(obj,type,response){ var isIE=navigator.userAgent.match(/MSIE (\d)/i); isIE = isIE ? isIE[1] : undefined; //给obj绑定事件 //传统浏览器使用attachEvent 现代浏览器使用addEventListner isIE < 9 ? obj.attachEvent("on" + type, response): obj.addEventListener(type, response, false); // 触发自定义事件 if(isIE<9){ //传统浏览器 var event=document.createEventObject();//创建对象 event.msg="我是fireEvent触发的";//给事件对象添加属性 obj.fireEvent("on" + type, event);//触发事件 }else{ //现代浏览器 var e=document.createEvent("MouseEvents");//创建事件对象 e.initEvent(type,false,false);//初始化事件对象initMouseEvent需要更多参数 e.msg="我是despatchEvent触发的"; //给事件对象添加属性 obj.dispatchEvent(e);//触发事件 } } } </script> ~~~ 现在,需要做一些说明,首先我只考虑了火狐和谷歌的兼容性,没有考虑IE6,7,8。今天到公司之后,试图兼容IE6,7,8,首先用IETester测试,遇到很多问题,经朋友推荐,使用2345浏览器去测试,可是不知道为什么,IE7,8都会报不支持attachEvent,不支持createEventObject,不支持fireEvent,实在是无奈至极,查了很多资料,这几个属性,明明就是IE的专属。。。 最最神奇的地方是,我去掉兼容性代码之后重新测测试,竟然IE7,8都是正常的,深深的伤害了我,此处仍然保留考虑兼容性之后的代码,如果哪位读到此篇博客的朋友帮我找到问题所在,自当感激不尽。 最后,再简单叙述下,上面代码中所使用到一些方法。针对IE几个的特殊方法,在此略过,等上面的代码得到确认之后再补充。免得误导他人。 ### 绑定事件: ~~~ obj.addEventListener("事件名(不带ON)",函数名,true/false); //IE9/IE11、FF、Chrome支持 第一个参数事件名:click、hover、blur等等 第二个参数函数名:此事件响应的函数 第三个参数useCapture,值为true或false,如果是true则采用capture,如果是false则采用bubbling方式,即事件冒泡。 ~~~ ### 创建事件对象(代替鼠标点击) ~~~ 通过document上的createEvent()方法,创建事件对象,此方法只接受一个参数,即要创建事件对象的事件字符串 UIEvents:通用的UI 事件,鼠标事件键盘事件都是继承自UI事件,在DOM 3 级上使用的是 UIEvent。 MouseEvents:通用的鼠标事件,在DOM 3 级上使用的是 MouseEvent。 MutationEvents:通用的突变事件,在DOM 3 级上使用的是 MutationEvent。 ~~~ ### 初始化事件对象 ~~~ event.initEvent(eventType,canBubble,cancelable) eventType:事件的类型,字符串值。如"click" canBubble:事件是否冒泡,true为冒泡 cancaelable:是否可以用preventDefault()方法取消事件 在创建事件对象之后,触发事件之前。调用 Event.initEvent() 方法。 初始化事件对象,除了可以使用initEvent()方法之外,还可以使用initMouseEvent()和initKeyBoadEvent(),这两个方法接受的参数都比较多,后面可能会做专门详细叙述,因为除了鼠标事件之外,还可以模拟键盘事件。 ~~~ ### 触发事件 ~~~ 在创建完事件对象之后,通过dispatchEvent()方法来将事件应用到特定的dom节点上,以便其支持该事件。 ~~~ ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> </head> <body> <div id = "div_out" style = "border:1px solid green;">外层测试 <div id = "div_inside">内层测试</div></div> </body> </html> <script> window.onload = function(){ document.getElementById("div_out").addEventListener("click",test1,false); document.getElementById("div_inside").addEventListener("click",test2,false); function test1(){ alert("外层div触发"); } function test2(){ alert("内层div触发"); } } </script> ~~~ 当值为false时,是冒泡方式,点击内层的div时,会先后触发内层的test2和外层的test1 当值为true时,不冒泡,点击内层的div,只会触发内层的test2