我正在处理我的第一个Chrome扩展程序。我有一个加载popup.html
的默认弹出窗口popup.js
。
我使用serg的answer到Chrome's tabs.executeScript - passing parameters and using libraries?作为popup->页面互动的灵感来源。
问题是popup.js
中的以下点击处理程序有效:
function click(e) {
chrome.browserAction.setBadgeText ( { text: "loading" } );
chrome.tabs.executeScript(null,
{code:"globalVarName = {'scriptOptions': {...}};" },
chrome.tabs.executeScript(null, {file: "js/script.js"},
chrome.browserAction.setBadgeText ( { text: "done" } ))
);
window.close();
}
但以下情况并非如此:
function click(e) {
chrome.browserAction.setBadgeText ( { text: "loading" } );
chrome.tabs.executeScript(null,
{code:"globalVarName = {'scriptOptions': {...}};" },
chrome.tabs.executeScript(null, {file: "js/script.js"},
function(){chrome.browserAction.setBadgeText ( { text: "done" } );})
);
window.close();
}
我希望在完成时可以做多件事。
我意识到第一种情况会立即执行chrome.browserAction.setBadgeText()
,而不是在脚本执行完毕后。所以这种情况可以忽略不计。我已经改写了问题标题以反映这一点。
我正在寻找的是为什么第二个案例的回调根本不执行。
答案 0 :(得分:3)
我很确定这里的罪魁祸首是window.close()
关闭弹出窗口。执行此代码的相同弹出窗口(除了script.js
,在实际页面上执行)。
因此,回调从未被执行过。我当然只谈论案例2(参见我对问题的编辑)。
我为未来访客提供的最新完整代码:
var tabId = null;
function click(e) {
chrome.browserAction.setBadgeText ( { text: "..." } );
chrome.tabs.executeScript(tabId,
{code:"globalVarName= {...}" },
function(){
chrome.tabs.executeScript(tabId, {file: "js/script.js"},
function(){chrome.browserAction.setBadgeText ( { text: "done" } );
setTimeout(function() {
chrome.browserAction.setBadgeText ( { text: "" } );
}, 1000);
}
);
}
);
}
另请注意,脚本的路径(此处为script.js
)是相对于扩展源根目录,即manifest.json
所在的位置。