内容脚本模式补丁混乱

时间:2015-08-25 00:22:32

标签: google-chrome-extension

我正在尝试编写我的第一个Chrome扩展程序,但我无法正确加载内容脚本。我希望它只加载You Tube的主页(即https://www.youtube.com/);但是,我不希望它加载任何其他页面,例如,在用户搜索后(即https://www.youtube.com/results?search_query=programming)。这就是我所拥有的:

"content_scripts": [
{
  "matches": ["*://*.youtube.com/*"], 
  "exclude_matches": ["*://*.youtube.com/"],
  "js": ["jquery.js", "content.js"]
}

使用上面的代码,content.js根本不加载;但是,如果我取出" exclude_matches",则会在https://www.youtube.com/上加载内容脚本。

1 个答案:

答案 0 :(得分:1)

目前,您的清单包含所有 youtube网页,但主页。

以下内容仅包括主页:

"content_scripts": [
    {
        "matches": ["*://www.youtube.com/"],
        "js": ["jquery.js", "content.js"]
    }
]

然而,Youtube使用历史API导航,这意味着如果用户首先打开视频页面然后导航到主页面,您的内容脚本将无法自动注入。您需要将chrome.webNavigation.onHistoryStateUpdated事件处理程序与url filters一起使用:

chrome.webNavigation.onHistoryStateUpdated.addListener(
    function(details) {
        var tabId = details.tabId;
        chrome.tabs.executeScript(tabId, {file: "jquery.js", runAt: "document_start"}, function() {
            chrome.tabs.executeScript(tabId, {file: "content.js", runAt: "document_start"});
        });
    },
    {
        url: [
            {urlEquals: "https://www.youtube.com/"}
        ]
    }
);

当用户从主页面导航时,您可能需要一个处理程序来消除内容脚本的影响。这可以在内容脚本中实现为pagehide侦听器,也可以使用(另一个)onHistoryStateUpdated侦听器实现。

或者,您可以在所有youtube上安装脚本,然后检查当前网址是否属于内容脚本中的主页。如果脚本注入onHistoryStateUpdated发生得太晚,并且您看到导航和后续应用内容脚本之间存在延迟,这可能很有用。