元素绑定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中常用的运算符小结
Jan 18 Javascript
仿微博字符限制效果实现代码
Apr 20 Javascript
有关javascript的性能优化 (repaint和reflow)
Apr 12 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
Feb 06 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
Oct 28 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
Jun 19 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
一篇文章看懂JavaScript中的回调
Jan 05 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
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
Python中List.index()方法的使用教程
2015/05/20 Python
使用python实现knn算法
2017/12/20 Python
Python中常见的异常总结
2018/02/20 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
解析Python3中的Import
2019/10/13 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
如何教少儿学习Python编程
2020/07/10 Python
django使用graphql的实例
2020/09/02 Python
python Gabor滤波器讲解
2020/10/26 Python
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
质检员岗位职责范本
2015/04/07 职场文书
中学图书馆工作总结
2015/08/11 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
Android中的Launch Mode详情
2022/06/05 Java/Android