【发布时间】:2017-04-20 05:41:41
【问题描述】:
我有一个在公司网站上运行的用户脚本,用于从页面中删除某些信息(基于 JavaScript 正则表达式替换)。
我决定将 userScript 制作成 Chrome 扩展程序,并且我想添加选项以运行不同风格的脚本。
我的第一个目标是让脚本在用户按下 popup.html 中的一个选项时运行。
目前,我的chrome.tabs.executeScript() 调用尝试访问该文档并用它的bodyHTML 减去被替换的正则表达式替换它的bodyHTML。
但是,对脚本的肉函数 normalExecution() 的调用似乎被跨域约束阻止了?
我看到以下错误:
Uncaught ReferenceError: normalExecution 未定义
Uncaught DOMException: Blocked a frame with origin “https://website.com”访问跨域框架
下面是我的 popup.html 和 popup.js 代码。
总的来说,HTML 代码有 3 个用作按钮的 div。目前,我已将它们全部设置为具有应执行 normalExecution() 中的代码的单击操作处理程序,但出现上述错误。
Popup.js:
function click(e) {
chrome.tabs.executeScript(null, {code:"normalExecution();"}, null);
window.close();
}
var normalExecution = function(){
console.log('normal execution engaged');
var allSpans = document.getElementsByTagName("span");
for(var i = 0; i < allSpans.length; i++) {
try{
if (allSpans[i].className.indexOf("textblock") > -1) {
//check if the ">" is part of switch output, if not then procede
if(allSpans[i].innerHTML.regexIndexOf(/sw.>.*/g) < 0){
//console.log('true');
allSpans[i].innerHTML = allSpans[i].innerHTML.replace(/>.*/g, ' ---- Removed ---- ');
allSpans[i].innerHTML = allSpans[i].innerHTML.replace(/(-----).*/g, ' ---- Removed Dashes (beta) ---- ');
}
else{
console.log('switch CLI output detected');
}
}
}catch(e){}
}
};
document.addEventListener('DOMContentLoaded', function () {
console.log('adding event listener');
var divs = document.querySelectorAll('div');
for(var i = 0; i < divs.length; i++){
divs[i].addEventListener('click', click);
}
});
String.prototype.regexIndexOf = function(regex, startpos) {
var indexOf = this.substring(startpos || 0).search(regex);
return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
};
popup.html [仅正文]:
<body>
<div id="Disabled">Disabled</div>
<div id="Normal">Normal</div>
<div id="Super-power">Super-power</div>
【问题讨论】:
-
我建议您阅读Chrome extension architecture overview。它具有整体架构信息,应该有助于您了解通常如何完成/组织事情。
-
您可以尝试在弹出窗口中添加一个事件监听器并将该函数用作回调。
标签: javascript google-chrome-extension