我需要在更新的标签上做一些事情,比如检查页面加载是否正确,并替换页面内的内容。这是我的代码
// background.js
chrome.tabs.onUpdate.addListener(function(tabId, changeInfo, tab){
try{
chrome.tabs.executeScript(tabId, filename);
} catch(e) {
// 1. when I open a new tab
// 1. Error during tabs.executeScript: Unknown error.
// 2. when I request a url not arrive-able.
// 2. Error during tabs.executeScript: Cannot access contents of url
// "data:text/html,chromewebdata". Extension manifest must request
// permission to access this host.
// but I can't catch these errors, they just appers in background console.
}
});
我在上传时尝试执行脚本,但如果当前标签是chrome:// newtab或chrome错误页面,我无法执行此操作,但我无法捕获错误。
答案 0 :(得分:11)
没有直接的方法来捕捉这些错误。但是,我刚刚创建了一种方法来实现目标:
chrome.tabs.onUpdated
(d
!)
当页面初始化("loading"
)以及DOM加载("complete"
)时,此事件被触发两次。chrome.tabs.executeScript(tabId, {file: fileName}, fn_callback);
"file"
或"code"
。第三个参数,一个函数,总是在完成脚本注入后执行。
chrome.tabs.executeScript
)。onMessage
事件。chrome.tabs.executeScript
的回调函数中,请按以下步骤操作:var exec_error = setTimeout(onError, 100);
推迟执行onError
方法。选择适当的小延迟(100),并在变量exec_error
中保存对此超时的引用。chrome.tabs.sendMessage(tabId, func)
向标签发送消息。func
中,添加以下逻辑:
clearTimeout(exec_error)
onSuccess()
onMessage
事件。因此,选项卡将不会按预期响应,并且不会清除超时。 因此,onError
将被执行
否则,将清除超时,并执行 onSuccess
。chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
// This event fires twice: loading, and complete.
// If we're loading, terminate function, and wait for "complete"
if (changeInfo.status === 'loading') return;
// On error and on success, this happens:
function onError() {
console.log('Error injecting the content script!');
}
function onSuccess() {
console.log('Successfully injected content script!');
}
// Execute scripts
chrome.tabs.executeScript(tabId, {
file: 'test_access.js'
}, function() {
// This function always fires *after* the attempt to run the code
var exec_error = setTimeout(onError, 100);
chrome.tabs.sendMessage(tabId, 'Are you there?', function(yes_no) {
if (yes_no === 'Yes') {
clearTimeout(exec_error);
onSuccess();
}
});
});
});
test_access.js
chrome.extension.onMessage.addListener(function(req, sender, respond) {
if (req === 'Are you there?') {
respond('Yes');
}
});
// Rest of your content script's logic, eg:
alert(location.href);
答案 1 :(得分:0)
您无法通过具有chrome://
等网址的网页的扩展程序加载脚本。但是,您可以完全override一些页面,但不能在将脚本加载到其他页面的同一扩展名中。