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 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
javascript实现unicode和字符的互相转换
Jul 18 Javascript
用JavaScript 处理 URL 的两个函数代码
Aug 13 Javascript
终于解决了IE8不支持数组的indexOf方法
Apr 03 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
jQuery层叠选择器用法实例分析
Jun 28 jQuery
Vue父子传递实例讲解
Feb 14 Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 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类中Static方法效率测试代码
2010/10/17 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
python学习数据结构实例代码
2015/05/11 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Python笔试面试题小结
2019/09/07 Python
Python hashlib模块加密过程解析
2019/11/05 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
pygame实现飞机大战
2020/03/11 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
大学生大二自我鉴定
2013/10/28 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
自考生自我评价分享
2014/01/18 职场文书
培训自我鉴定
2014/01/31 职场文书
高中综合实践活动总结
2014/07/07 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
北京爱情故事观后感
2015/06/12 职场文书
工作一年自我鉴定
2019/06/20 职场文书