5

所以我想在选项卡重新加载到指定的URL时运行脚本。它几乎工作,但实际上id不:) 这是我的清单文件:如何在标签重新加载时运行此脚本(Chrome扩展)?

{ 
"manifest_version": 2, 

"name": "Sample Extension", 
"description": "Sample Chrome Extension", 
"version": "1.0", 

"content_scripts": 
[ 
    { 
     "matches": ["http://translate.google.hu/*"], 
     "js": ["run.js"] 
    } 
], 

"permissions": 
[ 
    "activeTab", 
    "tabs" 
], 

"browser_action": 
{ 
    "default_title": "Sample", 
    "default_icon": "icon.png" 
} 
} 

,这是run.js:

chrome.tabs.onUpdated.addListener(
function (tabId, changeInfo, tab) 
{ 
    if (changeInfo.status === "complete") 
    { 
     chrome.tabs.executeScript(null, {file: "program.js"}); 
    } 
} 
); 

的programs.js只是提醒一些文本(但)。当我将警报提示到run.js的第一行时,它会发出警报,但是当我将它放入if中时,它不会。我找不到问题。我输错了什么?

+0

您是否在开发控制台检查错误?我认为你需要从后台页面而不是内容脚本运行。我相信内容脚本只能使用chrome.extension,而api中的所有其他方法都需要在background.js页面上调用。 – QFDev

+0

挂钩https://stackoverflow.com/q/23333771/632951 – Pacerier

回答

8

假设http://translate.google.hu/*页面是您希望在重新加载时注入代码的页面,您将不得不以稍微不同的方式进行操作。目前你是总是注入代码到这些页面(没有这样做的权限,不少),然后尝试在内容脚本中使用chrome.tabs api,这是你不能做的。相反,我们会将侦听器放在后台页面中,并只在页面刷新时注入代码,就像您想要的那样。首先,清单

{ 
    "manifest_version": 2, 
    "name": "Sample Extension", 
    "description": "Sample Chrome Extension", 
    "version": "1.0", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions":[ 
    "http://translate.google.hu/*", "tabs" 
    ] 
} 

background.js

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){ 
    if (tab.url.indexOf("http://translate.google.hu/") > -1 && 
     changeInfo.url === undefined){ 
    chrome.tabs.executeScript(tabId, {file: "program.js"}); 
    } 
}); 

这将监听onUpdated事件,检查是否是我们想要注入url的之一,然后它检查页面是否重新加载。最后一步是通过检查changeInfo.url是否存在来完成的。如果是这样,那么这意味着url已被更改,因此不会刷新。相反,如果它不存在,那么该页面只能被刷新。

+0

谢谢,这有效,但如何在上面有另一个选项卡时运行此脚本? –

+0

@Geiszla你是什么意思由另一个标签顶部? – BeardFist

+1

所以当我重新加载标签,但改变标签。然后脚本不会运行,因为那不是(例如translate.google.hu)网站。 –

1

content_scripts在每个页面(重新加载)都运行,因此最好只使用它们来检测它。

这样您也不会冒险运行background中的任何代码,然后您的content_script准备好接收任何消息。

+0

似乎有一个Chrome浏览器错误,有时清单内容不会在页面加载时运行。请参阅https://stackoverflow.com/questions/19191679/chrome-extension-inject-js-before-page-load/19192010#comment78166411_19192010 – Pacerier

相关问题