使用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实现用户登陆界面(示例讲解)
Sep 06 jQuery
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
Oct 13 jQuery
简单实现jQuery弹窗效果
Oct 30 jQuery
jQuery封装animate.css的实例
Jan 04 jQuery
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
jQuery插件实现非常实用的tab栏切换功能【案例】
Feb 18 jQuery
jquery实现的分页显示功能示例
Aug 23 jQuery
jQuery实现弹出层效果
Dec 10 jQuery
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
jQuery列表动态增加和删除的实现方法
Nov 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
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php中iconv函数使用方法
2008/05/24 PHP
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
发现的以前不知道的函数
2006/09/19 Javascript
简单通用的JS滑动门代码
2008/12/19 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python读取ini配置文件过程示范
2019/12/23 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
社区优秀志愿者材料
2014/02/02 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技