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制作的幻灯片图集效果打包下载
Feb 12 Javascript
jquery 使用点滴函数代码
May 20 Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 Javascript
javascript模拟评分控件实现方法
May 13 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
Java  Spring 事务回滚详解
Oct 17 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
vue-cli配置环境变量的方法
Jul 09 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
react中props 的使用及进行限制的方法
Apr 28 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
php遍历类中包含的所有元素的方法
2015/05/12 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
javascript Excel操作知识点
2009/04/24 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
说一说Python logging
2016/04/15 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python生成随机红包的实例写法
2019/09/02 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
师范大学生求职信
2014/06/13 职场文书
园林技术专业求职信
2014/07/28 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
道歉短信大全
2015/05/12 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
python字典进行运算原理及实例分享
2021/08/02 Python