元素绑定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 相关文章推荐
js不是基础的基础
Dec 24 Javascript
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
jQuery插件 tabBox实现代码
Feb 09 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
jQuery :first选择器使用介绍
Aug 09 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
node.js中的fs.unlink方法使用说明
Dec 15 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
vue实现将一个数组内的相同数据进行合并
Nov 07 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
php zend 相对路径问题
2009/01/12 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
js中生成map对象的方法
2014/01/09 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python实现图片插入文字
2019/11/26 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
python实现简单猜单词游戏
2020/12/24 Python
Python用SSH连接到网络设备
2021/02/18 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
写好自荐信要注意的问题
2013/11/10 职场文书
人民教师求职自荐信
2014/03/12 职场文书
综治宣传月活动总结
2014/04/28 职场文书
教师演讲稿开场白
2014/08/25 职场文书
职代会闭幕词
2015/01/28 职场文书
毕业生党员个人总结
2015/02/14 职场文书
消防宣传标语大全
2015/08/03 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL