一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
前言
身为一个前端小菜鸟,总是有一个飞高飞远的梦想,因此,每点小成长,我都想要让它变得更有意义,为了自己,也为了更多值得的人 看到标题大家可能疑惑了。。
正文
- 2022年了你还在用jq?
- 不同版本的jq,click事件还能冲突?
- 这也值得发一篇文章来嫖月更挑战?
各位道友切勿慌张,窃听小阵娓娓道来--
缘由
因为小阵最近在搞油猴脚本,感兴趣的可以看我的temperMonkey插件初开发文章,因为涉及到操作dom,自然而然就引入了jq。
那为什么要引入不同版本的jq?
因为我设计油猴脚本的初衷是帮我快捷操作公司cms后台项目的一些常用页面。
比如刚进入到cms页面后台,我需要自动打开cms模块管理和cms页面管理页面,并且因为每次刷新页面之后之前打开的tab页都会关闭,所以需要重新打开。。
emmm,至于为什么,就要项目太老了,页面基本都是通过iframe嵌套构成的,是的,你没有听错,是「数不胜数」的iframe,也因此页面每一次刷新都会等若干秒,比大家本地开发react或者vue编译一次等的时间还要长的多。。
大家看到这里可能会为我的工作内容感到稍许的悲哀,是的,我很痛苦,但是并不能浇灭我爱折腾的心,这不已经开始折腾油猴脚本了吗,哈哈哈。。
言归正传,再问一遍,为什么引入不同版本的jq?
因为cms系统自带有老版本的jq,多老呢?v 1.8.3,而现在的jq版本是v 3.6.0(天呐,多久没重构了呀😲),我也有这样的疑问。。
项目本身的jq,再加上老项目又内嵌了多个iframe,嗯,很多的iframe又带来了更多版本的jq。
比如:
- v1.8.3
- v2.2.7
- v1.9.2
- ...
然后我这次使用的jq是v 3.5.1。。算起来我家的cms系统真的是辛苦了。。emoing
说了这么多,终于进入了正文
详解
先描述我发现问题的过程:
我用jq获取了a标签,然后使用
$('.a:contains("cms模块管理")').click()
按照常理来说,会打开新标签的吧,是的,如果不引入v 3.5.1的jq的话可以正常打开,然后为了避免jq版本的不同导致我也脚本平添了很多麻烦,我用引入的v 3.5.1又执行了上面的代码,进行了同样的操作,然而现象是:没有现象,是的,他一动不动
我反复试了多次,终于确定他就是一动没动。
我又查了一遍文档,心想难道我这资深业务员还能搞不定jq??
翻了一波回来之后,确定代码没问题,那么是谁有问题?
跟上面的情况对比之后,明显的jq版本跟click事件的问题。
我回顾了下:
- 刚开始应该是用
v1.8.3的jq用on事件绑定过click了 - 这个时候我使用
$('.a:contains("cms模块管理")').click()是没问题的 - 然后我在
v1.8.3绑定过click事件之后直接用v3.5.1来调用$('.a:contains("cms模块管理")').click()之后有了问题 - 可能是
v3.5.1版本的click()其实调用的是空方法?,毕竟注册的时候使用v1.8.3来注册的 - 那这样一样,直接取原生元素执行
click()肯定是没问题的吧?
说干就干
将原来的方式改成用原生元素调用click事件
$('.a:contains("cms模块管理")').get(0).click()
试验之后立马生效了,ok,明白了,原来真是jq版本的问题
真相大白之后心里舒服多了~~
结语
往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合啦!!!(嘎嘎嘎~)😄」