元素绑定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 相关文章推荐
来自国外的页面JavaScript文件优化
Dec 08 Javascript
JavaScript mapreduce工作原理简析
Nov 25 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
实现点击列表弹出列表索引的两种方式
Mar 08 Javascript
js判断为空Null与字符串为空简写方法
Feb 24 Javascript
js使用心得分享
Jan 13 Javascript
jQuery插件slider实现拖动滑块选取价格范围
Apr 30 Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 Javascript
bootstrap suggest下拉框使用详解
Apr 10 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
Sep 22 Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
浅析php原型模式
2014/11/25 PHP
js里的prototype使用示例
2010/11/19 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
VueJS全面解析
2016/11/10 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
ant design实现圈选功能
2019/12/17 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
辞职离别感言
2015/08/04 职场文书