1

我正在构建Chrome扩展,并且想要将JavaScript代码注入并运行到选项卡中。当选项卡更改URL或重新加载时使用chrome.tabs.executeScript

例如:

chrome.tabs.query({active: true, lastFocusedWindow: true}, function(selectedTab) { 
    chrome.tabs.executeScript(selectedTab[0].id, {code: code_}); 
}); 

随着code_变量之中:

$('#gbqfq').val('test'); 
$("#gbqf").submit(); 

$('#rso > div.srg > li:nth-child(1) > div > h3 > a').click(); 

这个简单的脚本是为了在google.com上执行,应该输入并搜索“测试”,然后点击第一个结果。

问题是,在提交请求后,该选项卡将更改其URL并因此加载另一个页面。而且似乎在页面加载时,由chrome.tabs.executeScript注入的所有脚本消失。

有没有办法通过同一个标签中的不同页面运行单个脚本?

我的扩展程序应该允许用户运行自己的脚本,因此它很复杂(也许不可能?)事先知道脚本的哪一点需要重新加载(为了使用多个chrome.tabs.executeScript调用) 。

这里是我的扩展的manifest.json中,我只使用一个弹出窗口(无背景,无content_scripts):

{ 
    "manifest_version": 2, 

    ... 

    "options_page": "options.html", 

    "permissions": [ 
     "storage", 
     "unlimitedStorage", 
     "tabs", 
     "windows", 
     "http://*/*", 
     "https://*/*" 
    ], 

    "browser_action": 
    { 
     "default_popup": "popup.html" 
    } 
} 

回答

1

不,你不能运行同一个脚本标签导航离开后,因为脚本所在的JavaScript上下文被取消了。

因此,您需要在页面加载后再次注入脚本。 你可能想要做的东西沿着这些路线:

  1. 注入你提交脚本并保存的标签ID。
  2. 开始提交。
  3. 收听chrome.tabs.onUpdated按以上标签ID过滤,状态为"complete"
  4. 检查URL是否是您期望的URL,然后注入数据收集脚本。
+0

有没有办法知道当'onUpdated'被触发时脚本是在哪一点?正如我所说,我不知道脚本中的哪个位置会导航。 – Seeven 2014-09-26 12:26:06

+0

在'onUpdated'处,(内容)脚本不再存在。 – Xan 2014-09-26 12:32:47

+0

总而言之,如果您解释任意用户代码,您的问题似乎非常广泛。 – Xan 2014-09-26 12:34:09

相关问题