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 组件之旅(一)分析和设计
Oct 28 Javascript
cnblogs csdn 代码运行框实现代码
Nov 02 Javascript
JS画线(实例代码)
Nov 20 Javascript
JS实现自定义简单网页软键盘效果代码
Nov 05 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
Javascript 两种刷新方法以及区别和适用范围
Jan 17 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
vue单元格多列合并的实现
Nov 26 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
理解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网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
详解Vue用cmd创建项目
2019/02/12 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
linux系统都有哪些运行级别
2012/04/15 面试题
网上快餐厅创业计划书
2014/02/01 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
面试必备的求职信
2014/05/25 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
社会工作专业自荐信
2014/09/26 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
英文感谢信格式
2015/01/21 职场文书
2015员工年度考核评语
2015/03/25 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书