元素绑定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将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
jquery 循环显示div的示例代码
Oct 18 Javascript
javascript时间函数大全
Jun 30 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
JavaScript数组去重的多种方法(四种)
Sep 19 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
iview table render集成switch开关的实例
Mar 14 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
Angular路由ui-router配置详解
Aug 01 Javascript
深入解读Node.js中的koa源码
Jun 17 Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 Javascript
js实现翻牌小游戏
Jul 31 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作为Shell脚本语言使用
2006/10/09 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
通过python3实现投票功能代码实例
2019/09/26 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Python如何将字符串转换为日期
2020/07/31 Python
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
如何清空Session
2015/02/23 面试题
制药工程专业个人求职自荐信
2014/01/25 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
孝女彩金观后感
2015/06/10 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
卖车协议书范文
2016/03/23 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB