使用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实现的手风琴侧边菜单效果
Mar 29 jQuery
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
jquery+css实现侧边导航栏效果
Jun 12 jQuery
使用jQuery实现动态添加小广告
Jul 11 jQuery
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
jQuery实现图片简单轮播功能示例
Aug 13 jQuery
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
基于jQuery实现可编辑的表格
Dec 11 jQuery
jQuery实现获取多选框的值示例
Feb 07 jQuery
jquery实现抽奖功能
Oct 22 jQuery
jquery实现图片放大镜效果
Dec 23 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入门
2006/10/09 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
浅探express路由和中间件的实现
2019/09/30 Javascript
python 实现堆排序算法代码
2012/06/05 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
python模拟事件触发机制详解
2018/01/19 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Python 如何展开嵌套的序列
2020/08/01 Python
基于PyTorch中view的用法说明
2021/03/03 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
Shell如何接收变量输入
2012/09/24 面试题
棉花姑娘教学反思
2014/02/15 职场文书
学术会议主持词
2014/03/17 职场文书
经典英文广告词
2014/03/18 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
保安辞职信范文
2015/02/28 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
Redis 哨兵机制及配置实现
2022/03/25 Redis