使用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日期范围选择器附源码下载
May 23 jQuery
jQuery+Ajax实现用户名重名实时检测
Jun 01 jQuery
jQuery正则验证注册页面经典实例
Jun 10 jQuery
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 jQuery
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
jQuery实现table表格checkbox全选的方法分析
Jul 04 jQuery
jQuery实现动态添加和删除input框实例代码
Mar 26 jQuery
jQuery中DOM操作原则实例分析
Aug 01 jQuery
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
Jun 02 jQuery
jQuery实现回到顶部效果
Oct 19 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查询相似度最高的字符串的方法
2015/03/12 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python处理Excel文件实例代码
2017/06/20 Python
django实现前后台交互实例
2017/08/07 Python
对Python 内建函数和保留字详解
2018/10/15 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python socket聊天脚本代码实例
2020/01/02 Python
HTML5进度条特效
2014/12/18 HTML / CSS
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
写好自荐信的技巧
2013/11/08 职场文书
洗发露广告词
2014/03/14 职场文书
教师新年寄语
2014/04/03 职场文书
单位绩效考核方案
2014/05/11 职场文书
三好生演讲稿
2014/09/12 职场文书
银行先进个人总结
2015/02/15 职场文书
检讨书怎么写
2015/05/07 职场文书
学生会招新宣传语
2015/07/13 职场文书