Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展中的错误:获取背景页_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 扩展中的错误:获取背景页

Javascript 扩展中的错误:获取背景页,javascript,google-chrome-extension,Javascript,Google Chrome Extension,对于我的扩展,我有popup.html和background.html。在后台,我收听window.online事件和chrome.runtime.reload()当互联网连接恢复时。然而,当互联网离线或在线时弹出窗口是打开的,只有后台页面被重新加载,而弹出窗口保持不变。然后,下面的部分出现TypeError apiFunctions.setHandleRequest('getBackgroundPage', function() { return GetExtensionViews

对于我的扩展,我有
popup.html
background.html
。在后台,我收听
window.online
事件和
chrome.runtime.reload()
当互联网连接恢复时。然而,当互联网离线或在线时弹出窗口是打开的,只有后台页面被重新加载,而弹出窗口保持不变。然后,下面的部分出现
TypeError

  apiFunctions.setHandleRequest('getBackgroundPage', function() {
    return GetExtensionViews(-1, 'BACKGROUND')[0] || null;
  });

GetExtensionView(-1,'BACKGROUND')返回
undefined
,因此它尝试访问
undefined[0]
。为什么会发生这种情况?我怎样才能解决这个问题?

处理您正在做的事情的最佳方法是不要处理内容脚本中的在线/离线。在内容脚本中处理此类事件的问题在于,在后台脚本中正在重新加载。重新加载后,所有内容脚本都无法与后端通信。比如说,

如果从内容脚本向后端执行
chrome.runtime.sendMessage
操作,则一旦重新加载,它将抛出一个无法与后端通信的错误。这将一直发生,直到刷新选项卡

因为您似乎经常进行重新加载,所以最好

  • 重新加载后,将内容脚本重新注入所有打开的选项卡。例如,后端代码将读取清单并重新注入所有内容脚本。这些新的内容脚本可以与后端对话。只要确保他们正在插入任何DOM或CSS,您就可以删除旧的DOM或CSS,这样页面中就不会出现重复的元素,这将是一个用户界面错误

    function isSafeToInjectTo(tabs, i) {
        if (!tabs[i].url) return false;
    
        var httpOrHttps = tabs[i].url.indexOf('http://') !== -1 ||  tabs[i].url.indexOf('https://') !== -1;
        if (!httpOrHttps) return false;
    
        var googleWebstoreSite = tabs[i].url.indexOf('https://chrome.google.com/webstore') !== -1;
        if (googleWebstoreSite) return false;
    
        return true;
    }
    //THIS CODE SHOULD BE PLACED IN BACKGROUND PAGE AND WILL ONLY RUN ONCE WHEN BACKGROUND     SCRIPT STARTS
    console.log('injecting ');
    var js = [];
    var css = [];
    chrome.runtime.getManifest().content_scripts.forEach(function (element, index, array) {
        $.each(element.js, function (i, el) {
            if ($.inArray(el, js) === -1) js.push(el);
        });
        $.each(element.css, function (i, el) {
            if ($.inArray(el, css) === -1) css.push(el);
        });
    })
    chrome.tabs.query({}, function (tabs) {
        for (var i in tabs) {
            //not able to inject into chrome:// or other non web pages and on google web store - extension has restrictions
            if (isSafeToInjectTo(tabs, i)) {
                //RE INJECT ALL JS
                for (var s in js) {
                    chrome.tabs.executeScript(tabs[i].id, {file: js[s]});
                }
                //RE INJECT ALL CSS
                for (var c in css) {
                    chrome.tabs.insertCSS(tabs[i].id, {file: css[c]}); 
               }
            }
        }
    });
    
  • 不要在联机/脱机时重新加载,而是在XHR请求中处理联机/脱机,只需设置一个短计时器循环
    setTimeout()
    /
    setInterval()
    ,以重试或使用框架为您处理此问题


  • 请在打开新问题。您正在通过重新加载来终止后台和弹出窗口之间的连接。相反,只需重新加载弹出窗口。我是通过一个扩展来实现的。有人在问题中报告了这个bug,它与内容脚本无关。是关于弹出窗口的。