Chrome扩展不是在YouTube上加载浏览器的导航Chrome扩展不是在YouTube上加载浏览

2019-05-08 18:30发布

比方说,我已经当你在YouTube视频page.I到达加载的扩展已经注意到,当一个导航来回使用镀铬按钮,扩展很可能将不会加载。

举个例子,我有2个文件,清单:

{
    "name": "back forth",
    "version": "0.1",
    "manifest_version": 2,
    "description": "back forth",
    "permissions": ["storage", "*://www.youtube.com/watch*"],
    "content_scripts": [
        {
            "matches": ["*://www.youtube.com/watch*"],
            "js": ["contentscript.js"]
        }
    ]
}

和contentscript

alert("loaded");

警报浏览时来回并不总是露面。 我怎样才能解决这个问题,这样分机加载每一次?

Answer 1:

YouTube已经开始使用基于pushState的导航试用。 通常,这样的导航只能内容脚本中通过注入该拦截到的呼叫代码检测history.replaceState / history.pushState (或通过使用chrome.webNavigation.onHistoryStateUpdated在后台页面事件)。

在这个答案的其余部分是具体到YouTube。
YouTube的显示(红色)进展页面顶部加载过程中吧。 该进度条是使用CSS动画过渡。 由于转变事件气泡,可以绑定一个过渡事件监听器<body>并且在这些情况下,检查导航。

您必须在您插入内容脚本*://www.youtube.com/*而不是*://www.youtube.com/watch* ,因为pushState的可用于从导航//watch..

function afterNavigate() {
    if ('/watch' === location.pathname) {
        alert('Watch page!');
    }
}
(document.body || document.documentElement).addEventListener('transitionend',
  function(/*TransitionEvent*/ event) {
    if (event.propertyName === 'width' && event.target.id === 'progress') {
        afterNavigate();
    }
}, true);
// After page load
afterNavigate();

注意:此方法取决于进度栏插入的事实。 当谷歌决定干脆改名进度条的ID,或删除的进度条,你的代码将停止工作。

注2:这仅适用于主动标签。 如果您需要检测导航的变化,而标签不集中,那么你就需要绑定一个window.onfocuswindow.onblur事件,并检查是否document.title有这些事件之间改变。



文章来源: Chrome extension is not loading on browser navigation at YouTube