从内容脚本触发点击事件 - chrome扩展

时间:2013-07-23 19:29:07

标签: javascript jquery google-chrome-extension

在我的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正在劫持和忽略事件。我试图从这些网站读取代码,看看发生了什么,但代码太多了。

有没有人知道这里发生了什么以及如何解决它?

3 个答案:

答案 0 :(得分:19)

由于浏览器扩展sand-boxing和基本jQuery功能,您无法使用triggerclick触发非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

但是,内容脚本有一些限制。他们不能:

  • 使用其扩展程序页面定义的变量或函数
  • 使用由网页或其他内容脚本定义的变量或函数

content_script中的$ p不能访问网页上的$,但是事件数据存储在$ $内部,所以我们无法触发。

// 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 ];