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 相关文章推荐
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
Windows8下搭建Node.js开发环境教程
Sep 03 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
jquery获取css的color值返回RGB的方法
Dec 18 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
Jul 21 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
自己封装的一个简单的倒计时功能实例
Nov 23 Javascript
简单快速的实现js计算器功能
Aug 17 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
vue实现五子棋游戏
May 28 Javascript
javascript实现移动端上传图片功能
Aug 18 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
Python常用内置模块之xml模块(详解)
2017/05/23 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python实现操作文件(文件夹)
2019/10/31 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
MYSQL基础面试题
2012/05/13 面试题
MYSQL支持事务吗
2013/08/09 面试题
优秀幼教自荐信
2014/02/03 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
《荷花》教学反思
2014/04/16 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers