jquery模拟点击不起作用解决思路和方案

 今天写脚本的时候发现$('#demo').click()并不能触发点击事件。经过一番搜索知道改成$('#demo')[0].click()就可以了,意思是用dom的click方法就可以模拟点击事件。

虽然问题解决了,但还是不知道其中缘由,继续搜索,得知原来jquery的click方法只可以在on绑定事情或者onclick属性绑定事件时可以触发模拟点击,其他情况则不起作用了。具体参考Simulate mouse click using jQuery


2022.8.8更新

偶尔还会想起这个问题,即为什么jquery的click方法不能触发浏览器的默认行为,昨天又研究了一番,在此记录一下。

可以确定的是通过js原生的addEventListener方法添加的事件监听器jquery并不能获取到,而通过jquery提供的on方法jquery是可以获得该handler的reference的,那么就可以确定,如果通过addEventListener方法添加的handler被触发了,一定是jquery调用了js的方法,例如:

$('#demo')[0].click()


经过测试,大部分标签例如div等等,如果是用addEventListener方法添加的handler也能被触发,那么我之前写的,jquery模拟点击为什么有时候还是会不起作用呢,既然jquery的click方法本质上还是调用了js原生的click方法,按理来说并不存在文章标题所说的问题。

通过打断点的方式,定位到了这里,可以看到jquery对于a标签,为了不同浏览器能表现出一样的行为,不会对a标签使用js原生的click方法,只是调用了jquery的click方法,这也就导致对于a标签,只能触发onclick绑定的handler以及通过on方法注册的handler,因为jquery提供的click方法只能拿到这些handler的reference

jquery模拟点击不起作用解决思路和方案_第1张图片

同时这也解释了为什么按照以下代码就能触发a标签的浏览器默认行为


    click me!

$('span').click()

因为这样click事件会冒泡出去,从而触发a标签的默认行为

事实上在我测试的过程中,我发现jquery的事件监听写得真的太复杂了,很多代码都不知道用处是什么(确实也是自己水平不够),所以我也并未完全弄懂jquery是否调用js原生方法的依据是什么,以上写的只是我能看懂的部分。欢迎jquery大佬在评论区交流

你可能感兴趣的:(javascript,jquery)