使用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插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
jquery的 filter()方法使用教程
Mar 22 jQuery
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
jquery操作checkbox的常用方法总结【附测试源码下载】
Jun 10 jQuery
jQuery实现可编辑的表格
Dec 11 jQuery
jquery实现垂直手风琴导航栏
Feb 18 jQuery
jQuery插件实现图片轮播效果
Oct 19 jQuery
JS实现选项卡插件的两种写法(jQuery和class)
Dec 30 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
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php递归函数怎么用才有效
2018/02/24 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
js实现开关灯效果
2020/03/30 Javascript
python编写的最短路径算法
2015/03/25 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python的缺点和劣势分析
2019/11/19 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
党员创先争优公开承诺书
2014/03/28 职场文书
大学生个人求职信
2014/06/02 职场文书
新郎接新娘保证书
2015/05/08 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
2015最新民情日记范文
2015/06/26 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL