使用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和原生JavaScript实现网页定位导航特效
Apr 03 jQuery
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
jQuery中的for循环var与let的区别
Apr 21 jQuery
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
基于jQuery实现可编辑的表格
Dec 11 jQuery
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
jQuery 淡入/淡出效果函数用法分析
May 19 jQuery
jquery实现上传图片功能
Jun 29 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
jQuery+ajax实现文件上传功能
Dec 22 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
gearman的安装启动及python API使用实例
2014/07/08 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
机电工程学生自荐信范文
2013/12/07 职场文书
六十岁生日答谢词
2014/01/10 职场文书
致百米运动员广播稿
2014/01/29 职场文书
银行优秀员工事迹
2014/02/06 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
校庆标语集锦
2014/06/25 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
团员年度个人总结
2015/02/26 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
个人廉政承诺书
2015/04/28 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python
Python必备技巧之字符数据操作详解
2022/03/23 Python