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
操作,则一旦重新加载,它将抛出一个无法与后端通信的错误。这将一直发生,直到刷新选项卡
因为您似乎经常进行重新加载,所以最好
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]});
}
}
}
});
setTimeout()
/setInterval()
,以重试或使用框架为您处理此问题请在打开新问题。您正在通过重新加载来终止后台和弹出窗口之间的连接。相反,只需重新加载弹出窗口。我是通过一个扩展来实现的。有人在问题中报告了这个bug,它与内容脚本无关。是关于弹出窗口的。