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 相关文章推荐
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
JS获取图片lowsrc属性的方法
Apr 01 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
实例讲解JavaScript中instanceof运算符的用法
Jun 08 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
Mar 16 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
理解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
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
JavaScript XML操作 封装类
2009/07/01 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
AngularJS语法详解
2015/01/23 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
理解javascript异步编程
2016/01/27 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
python3.5仿微软计算器程序
2020/03/30 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
印度低票价航空公司:GoAir
2017/10/11 全球购物
儿科主治医生个人求职信
2013/09/23 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
创意婚礼策划方案
2014/05/18 职场文书
物理学专业求职信
2014/07/04 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
优秀团员事迹材料
2014/12/25 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
被委托人身份证明
2015/08/07 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js