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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
JS截取字符串常用方法详细整理
Oct 28 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
JS设置下拉列表框当前所选值的方法
Dec 22 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
基于jQuery实现咖啡订单管理简单应用
Feb 10 Javascript
如何在AngularJs中调用第三方插件库
May 21 Javascript
React进阶学习之组件的解耦之道
Aug 07 Javascript
angular-tree-component的使用详解
Jul 30 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 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
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
PHP反射实际应用示例
2019/04/03 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python发送email的3种方法
2015/04/28 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
浅述python中深浅拷贝原理
2018/09/18 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
个人求职信范文分享
2013/12/13 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
律政俏佳人观后感
2015/06/09 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang