元素绑定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 Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
AngularJS自动表单验证
Feb 01 Javascript
js判断文件格式及大小的简单实例(必看)
Oct 11 Javascript
js仿QQ邮箱收件人选择与搜索功能
Feb 10 Javascript
js实现时间轴自动排列效果
Mar 09 Javascript
js表单序列化判断空值的实例
Sep 22 Javascript
react中的ajax封装实例详解
Oct 17 Javascript
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 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
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
PHP静态文件生成类实例
2014/11/29 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python创建线程示例
2014/05/06 Python
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
python实现用户名密码校验
2020/03/18 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
利用python进行文件操作
2020/12/04 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
综合测评自我鉴定
2013/10/08 职场文书
应届大专生自荐书
2014/06/16 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
捐助倡议书
2015/01/19 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
5个实用的JavaScript新特性
2022/06/16 Javascript