jquery trigger函数执行两次的解决方法


Posted in Javascript onFebruary 29, 2016

本文实例讲述了jquery trigger函数执行两次的解决方法。分享给大家供大家参考,具体如下:

一、问题如下:

有如下代码:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
*{margin:0;padding:0;}    
body { font-size: 13px; line-height: 130%; padding: 60px; }
p {width:200px;background:#888;color:white;height:16px;}
</style>
<script src="jquery-1.6.4.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
  $('#old').bind("click", function(){
        $("input").trigger("focus");
    });
    $('#new').bind("click", function(){
      $("input").triggerHandler("focus");
    });
    $("input").focus(function(){
  $("body").append("<p>focus.</p>");
})
});
</script>
</head>
<body>
<button id="old">trigger</button>
<button id="new">triggerHandler</button>
<input />
</body>
</html>

这里的函数:

$('#old').bind("click", function(){
$("input").trigger("focus");
});

在火狐只触发一次,即输出一个focus;

但是在ie触发了两次,即同时输出了两个focus;

二、解决方法:

首先分析一下trigger和triggerHandler。使用triggerHandler不会触发浏览器的默认事件,不会产生事件冒泡(其他区别看jQuery文档)。关于这个bug的 ticket。关于这个问题的 commit。jQuery自己实现了一个event对象用于解决浏览器间的差异问题。可是由于有mouseenter/mouseleave等非标准事件的存在,jQuery引入了special事件的子系统,让原生事件回到模拟事件的事件列队中,可是这个系统并不能解决所有问题,当使用trigger.focus时,IE下会错误地执行两次回调。

triggerHandler是对trigger产生这种问题的解决方法。但是使用triggerHandler时你会发现input是没有光标focus效果的。

jquery trigger函数执行两次的解决方法

初步解决方法:

除了用triggerHandler另一个方法是在focus绑定事件中加上:

event.preventDefault()

可是你发现这不符合我们的期望呀,因为focus事件回调执行了,但是连个focus效果都没有。

最终解决方法:

既然是jQuery封装的关系,那我们用原生的事件就可以了。看演示,左边是用原生事件触发的,右边用triggerHandler。

$('input')[0].focus();

jquery trigger函数执行两次的解决方法

希望本文所述对大家jQuery程序设计有所帮助。

Javascript 相关文章推荐
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
JQuery+Ajax无刷新分页的实例代码
Feb 08 Javascript
js 操作符汇总
Nov 08 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
JavaScript缓冲运动实现方法(2则示例)
Jan 08 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
详解mpvue scroll-view自动回弹bug解决方案
Oct 01 Javascript
原生javascript实现连连看游戏
Jan 03 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 Javascript
详解Vue的watch中的immediate与watch是什么意思
Dec 30 Javascript
理解js回收机制通俗易懂版
Feb 29 #Javascript
jquery trigger实现联动的方法
Feb 29 #Javascript
基于Javascript实现返回顶部按钮
Feb 29 #Javascript
JavaScript实现斗地主游戏的思路
Feb 29 #Javascript
jQuery取消特定的click事件
Feb 29 #Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 #Javascript
JS三级可折叠菜单实现方法
Feb 29 #Javascript
You might like
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
JS日历 推荐
2006/12/03 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
javascript中常用编程知识
2013/04/08 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python实现批量图片格式转换
2020/06/16 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
python实现简单井字棋小游戏
2020/03/05 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
2016年暑假家长对孩子评语
2015/12/01 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL