使用jquery模拟a标签的click事件无法实现跳转的解决


Posted in jQuery onDecember 04, 2018

问题描述

最近在使用jquery模拟a标签的click事件,无法触发其默认行为。即click()trigger('click')无法触发href跳转。

<a id="aBtn" href="https://www.car-me.com/">去卡咪官网</a>
$('#aBtn').click();//无法跳转,不生效
$('$aBtn').trigger('click');//同样无法跳转,不生效

下面就来一起分析下其原因与解决方法吧

问题原因

jquery内部实现click或trigger方法时,并未真正模拟用户点击事件,只是模拟了事件对象及冒泡的触发。(最后附有jquery实现源码供参考)

解决方案

解决思路:在原生dom触发click事件或利用事件冒泡来解决。

原生dom触发click

<a id="aBtn" href="https://www.car-me.com/">去卡咪官网</a>
document.querySelector('#aBtn').click();//原生dom触发 或者
$('#aBtn')[0].click();//jquery对象转为dom对象再触发

利用子元素事件冒泡

<a id="aBtn" href="https://www.car-me.com/">
 <span id="spanBtn">去卡咪官网</span>
</a>
$('#spanBtn').click();//或者
$('#spanBtn').trigger('click');

jquery trigger()实现源码(8159行-8304行)

源码链接地址

关键摘要:

// Fire handlers on the event path (8237行)
i = 0;
while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
	lastElement = cur;
	event.type = i > 1 ?
		bubbleType :
		special.bindType || type;

	// jQuery handler
	handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
		dataPriv.get( cur, "handle" );
	if ( handle ) {
	//******自身trigger('click')或click()时,会调用缓存列表里的事件回调函数,但未执行elem.click()******
		handle.apply( cur, data );
	}

	// Native handler
	handle = ontype && cur[ ontype ];
	if ( handle && handle.apply && acceptData( cur ) ) {
		event.result = handle.apply( cur, data );
		if ( event.result === false ) {
			event.preventDefault();
		}
	}
}
// If nobody prevented the default action, do it now (8263行)
if ( !onlyHandlers && !event.isDefaultPrevented() ) {

	if ( ( !special._default ||
		special._default.apply( eventPath.pop(), data ) === false ) &&
		acceptData( elem ) ) {

		// Call a native DOM method on the target with the same name as the event.
		// Don't do default actions on window, that's where global variables be (#6170)
		if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {

			// Don't re-trigger an onFOO event when we call its FOO() method
			tmp = elem[ ontype ];

			if ( tmp ) {
				elem[ ontype ] = null;
			}

			// Prevent re-triggering of the same event, since we already bubbled it above
			jQuery.event.triggered = type;

			if ( event.isPropagationStopped() ) {
				lastElement.addEventListener( type, stopPropagationCallback );
			}
   //******子元素trigger('click')或click(),会执行elem.click()******
			elem[ type ]();

			if ( event.isPropagationStopped() ) {
				lastElement.removeEventListener( type, stopPropagationCallback );
			}

			jQuery.event.triggered = undefined;

			if ( tmp ) {
				elem[ ontype ] = tmp;
			}
		}
	}
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

jQuery 相关文章推荐
jQuery 实现图片的依次加载图片功能
Jul 06 jQuery
jQuery封装animate.css的实例
Jan 04 jQuery
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
May 12 jQuery
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 jQuery
jquery图片预览插件实现方法详解
Jul 18 jQuery
jQuery 筛选器简单操作示例
Oct 02 jQuery
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
jQuery实现获取多选框的值示例
Feb 07 jQuery
jquery实现聊天机器人
Feb 08 jQuery
jQuery实现简单日历效果
Jul 05 jQuery
jQuery利用FormData上传文件实现批量上传
Dec 04 #jQuery
利用jquery和BootStrap实现动态滚动条效果
Dec 03 #jQuery
jQuery-ui插件sortable实现自由拖动排序
Dec 01 #jQuery
jquery拖拽自动排序插件使用方法详解
Jul 20 #jQuery
jQuery实现网页拼图游戏
Apr 22 #jQuery
基于jquery实现九宫格拼图小游戏
Nov 30 #jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
You might like
Windows下的PHP5.0详解
2006/11/18 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
往光标所在位置插入值的js代码
2013/09/22 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
python实现二叉查找树实例代码
2018/02/08 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
领导失职检讨书
2014/02/24 职场文书
社区服务活动总结
2014/05/07 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
不同意离婚答辩状
2015/05/22 职场文书
八一建军节主持词
2015/07/01 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers