在我的Chrome扩展程序的内容脚本中,我点击某些网站上网页上的某些链接/按钮。为此,我在内容脚本中使用以下代码(我在内容脚本中嵌入了jQuery):
$(css_selector).trigger("click")
这适用于大多数网站。
但是,在delta.com,match.com和paypal.com等某些网站上,这种触发元素点击的方式无效。在delta.com上,当我尝试在内容脚本中触发时,我得到以下抛出异常:
Error: An attempt was made to reference a Node in a context where it does not exist.
Error: NotFoundError: DOM Exception 8
奇怪的是,如果我打开javascript consoleon delta.com,包含一个jQuery并尝试相同的点击触发代码片段,它就可以工作。
在match.com和paypal.com上,触发只是在内容脚本中不起作用而且没有错误。我甚至无法通过javascript控制台触发“click”事件,就像我在delta.com上所做的那样。
如果我手动使用鼠标点击,所有三个网站上的一切正常。因此我也尝试使用mousedown(),mouseup()来模拟它,但这也不起作用。
这似乎是个问题,因为来自这些网站的javascripts正在劫持和忽略事件。我试图从这些网站读取代码,看看发生了什么,但代码太多了。
有没有人知道这里发生了什么以及如何解决它?
答案 0 :(得分:19)
由于浏览器扩展sand-boxing和基本jQuery功能,您无法使用trigger
或click
触发非jQuery点击事件。
然而,您可以调用原始DOM元素click
方法,该方法的作用就像使用鼠标单击该元素一样。只需使用[0]
访问DOM元素:
$(css_selector)[0].click();
尽管您很少需要,但您可以使用each
中的相同代码触发所有匹配的按钮。由于each
中的 this 是DOM元素,因此非常简单:
$(css_selector).each(function(){
this.click();
});
答案 1 :(得分:9)
jQuery的点击触发器功能不会触发非jQuery DOM 点击监听器(jsfiddle.net/k2W6M)。
jQuery文档应该真正指出这个事实。我确信不止一些人对此进行疯狂追逐。
我正在努力解决这个问题几天,尝试在.click()和.trigger("点击")的链接上触发 onclick 处理程序,一切都是徒劳的,直到我看到这一点。
为了对此问题有完整的答案,将MouseEvent分派给元素与单击元素具有相同的效果。以下代码对我有用,并且在尝试从内容脚本单击页面上的元素/链接时应该有效:
$(css_selector)[0].dispatchEvent(new MouseEvent("click"))
答案 2 :(得分:-1)
content_script已执行沙盒,请参阅https://developer.chrome.com/extensions/content_scripts
但是,内容脚本有一些限制。他们不能:
// taken from jQuery#1.11.2 from line4571, trigger method
...
// jQuery handler
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
// Native handler
handle = ontype && cur[ ontype ];