元素绑定click点击事件方法


Posted in Javascript onJune 08, 2015

最简单的莫过于使用click方法:

<input id="btn" type="button" value="BUTTON" onclick="alert(1)"/>
<script>
 var btn = document.getElementById('btn');
 btn.click();
</script>

所有浏览器都弹出了1。但是如果把input换成div呢?

<div id="d1" style="background:gold;width:50px;height:50px;" onclick="alert(2)"></div>
<script>
 var d1 = document.getElementById('d1');
 d1.click();
</script>

这次Safari/Chrome中没有弹出2。即不是所有浏览器中的所有元素都支持click方法。事实上只有input/button元素在所有浏览器才具有click方法。
以上的事件都是直接添加在html属性中的(内联事件)。click方法能触发使用el.onXXX/addEventListener/attachEvent添加的事件吗?

<input id="btn1" type="button" value="BUTTON 1"/>
<input id="btn2" type="button" value="BUTTON 2"/>
<script>
 var addListener = window.addEventListener ?
   function(el, type, fn) { el.addEventListener(type, fn, false); } :
   function(el, type, fn) { el.attachEvent('on' + type, fn); };
 var btn1 = document.getElementById('btn1');
 var btn2 = document.getElementById('btn2');
 btn1.onclick = function(){
   alert(3);
 };
 addListener(btn2, 'click', function() {alert(4)});
 btn1.click();
 btn2.click();
</script>

所有浏览器都依次弹出了3,4。说明支持click方法的元素,无论使用内联方式还是el.onXX又或addEventListener/attachEvent添加事件都能触发。

click方法已经写入了HTML5草案,如果Safari/Chrome完成对剩下的元素的实现(非input/button)。那么模拟点击将十分简单,直接调用click方法。Firefox也是刚刚在版本5中实现对非input/button元素的click方法实现,这点Safari/Chrome有些落后了。
既然Safari/Chrome中click不可用, 我们就用dispatchEvent来实现了。

<input id="btn1" type="button" value="BUTTON 1" onclick="alert(1)"/>
<input id="btn2" type="button" value="BUTTON 2" onclick="alert(2)"/>
<div id="d1" style="background:gold;width:50px;height:50px;" onclick="alert(3)"></div>
<script>
 function dispatch(el, type){
   try{
     var evt = document.createEvent('Event');
     evt.initEvent(type,true,true);
     el.dispatchEvent(evt);
   }catch(e){alert(e)};
 }
 var btn1 = document.getElementById('btn1');
 var btn2 = document.getElementById('btn2');  
 var d1 = document.getElementById('d1');
 dispatch(btn1, 'click');
 dispatch(btn2, 'click');
 dispatch(d1, 'click');
</script>

依次弹出了1,2,3。换成其它事件添加方式亦可触发。IE中还有个fireEvent去主动触发事件,当然如果是点击事件使用click更好。非点击事件则只能通过fireEvent去触发了。

最后给出我的triggerClick方法,实现方式判断浏览器,判断nodeName。依据是Safari/Chrome不支持非input/button元素的click方法。

function triggerClick( el ) {
 var nodeName = el.nodeName,
   safari_chrome = /webkit/.test(navigator.userAgent.toLowerCase());
 if(safari_chrome && (nodeName != 'INPUT' || nodeName != 'BUTTON')) {
   try{
     var evt = document.createEvent('Event');
     evt.initEvent('click',true,true);
     el.dispatchEvent(evt);
   }catch(e){alert(e)};
 }else{
   el.click();
 }
}

上面的实现方式让你能明白浏览器的差异,但实现其实有点罗嗦。直接判断元素是否具有click方法即可,Safari/Chrome中非input/button元素没有click方法,返回undefined。

function triggerClick( el ) {
 if(el.click) {
   el.click();
 }else{
   try{
     var evt = document.createEvent('Event');
     evt.initEvent('click',true,true);
     el.dispatchEvent(evt);
   }catch(e){alert(e)};    
 }
}

特性判断也比浏览器判断有更好的前瞻性,比如Safari/Chrome在后续版本中实现了非input/button元素的click方法,那么特性判断的函数仍然可以向下兼容。

以上所述就是本文的全部内容了,希望大家能够喜欢

Javascript 相关文章推荐
载入进度条 效果
Jul 08 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
固定表格行列(expression)在IE下适用
Jul 25 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
Mar 26 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
React组件设计模式之组合组件应用实例分析
Apr 29 Javascript
原生js实现下拉框选择组件
Jan 20 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
JavaScript获取URL汇总
Jun 08 #Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 #Javascript
详解JavaScript中的every()方法
Jun 08 #Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 #Javascript
javaScript中with函数用法实例分析
Jun 08 #Javascript
简介JavaScript中的sub()方法的使用
Jun 08 #Javascript
简介JavaScript中strike()方法的使用
Jun 08 #Javascript
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP多进程编程实例详解
2017/07/19 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
jsTree使用记录实例
2016/12/01 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
12条写出高质量JS代码的方法
2018/01/07 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
Python简单的制作图片验证码实例
2017/05/31 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
tensorflow更改变量的值实例
2018/07/30 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
浅析NumPy 切片和索引
2020/09/02 Python
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
小学教师岗位职责
2013/11/25 职场文书
升学宴主持词
2014/04/02 职场文书
电力培训心得体会
2014/09/02 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书