我正在编写Chrome用户脚本,以便在 CKEditor 中本地自动保存内容。我使用this CKEditor auto-save plugin作为灵感。
我编写了一个函数,每隔半秒(通过间隔)触发一次,以注册CKEditor
事件处理程序:
var intervalId = window.setInterval(function() {
if (CKEDITOR) {
window.clearInterval(intervalId);
CKEDITOR.plugins.add("user-script-auto-save", {
init : function(editor) {
editor.on('key', startTimer);
}
});
}
}, 500);
然而,它从未正确完成,并在if (CKEDITOR)
声明中抱怨“CKEDITOR未定义”。
同时,如果我进入Chrome的控制台并输入CKEDITOR
,控制台会打印出预期的对象。
我错过了什么?编辑器嵌入在iframe中;可能会对范围界定产生影响吗?或者我在这里与Chrome的沙盒作斗争?如果是这样,我是否可以通过其他方式深入了解CKEditor每秒提取内容或进行自动保存?
我还没有尝试过Firefox中的脚本;那是我名单上的下一个。
值得注意的是:我是一个长期的JavaScript新手。因此,我可以很容易地做一些与范围或其他类似的东西。
答案 0 :(得分:2)
根据YouTube上的this little tutorial video,所有3个“设备”都是相互分离的,以防止从用户脚本到浏览器/网站的XSS攻击,反之亦然。虽然用户脚本/内容脚本在网站的上下文中运行,但它们仍然与实际的网站脚本上下文分开。您可以通过简单地尝试从内容脚本访问例如jQuery来轻松地确认这一点。就像CKEditor一样,它将无法使用。
因此,为了解决这个问题,我想到的是使用内容脚本在head标记中包含外部JavaScripts。 AFAIK,直接在扩展程序的根目录中的文件是不可能的,所以我已经使用远程服务器来托管我的文件。
我不确定这是否是最好的方法,我认为这是一个丑陋的旁路,可能会在一段时间内被Chromium项目强大和禁用。
(由OP编辑,所以我可以选择这个答案并适当地路由业力)
这个答案,加上评论中的一些建议和链接,最终让我到达了我需要的地方。
我最终得到了以下功能:
var insertScriptIntoDocument = function(scriptUrl, doc) {
// inspired by http://blog.afterthedeadline.com/2010/05/14/how-to-jump-through-hoops-and-make-a-chrome-extension/
var scriptText = doc.createTextNode(
'(function(loc) { \
var embeddedScript = document.createElement("script"); \
embeddedScript.type = "text/javascript"; \
embeddedScript.src = loc; \
document.getElementsByTagName("head")[0].appendChild(embeddedScript); \
})("' + scriptUrl + '");');
var injectorElement = doc.createElement('script');
injectorElement.appendChild(scriptText);
doc.body.appendChild(injectorElement);
};
用法如下:
var embeddedScriptUrl = chrome.extension.getURL("embedded-script.js");
insertScriptIntoDocument(embeddedScriptUrl, document);
目前,我正在Chrome扩展程序中执行此操作,但我怀疑该模式可能在通过Chrome TamperMonkey扩展部署的GreaseMonkey脚本中有效,前提是要嵌入的脚本的URL托管在某处可到达。
FTR,事实证明,我实际上并不需要转到iframe - CKEDITOR变量是在顶级文档中定义的,但由于the rules of the Chrome sandbox而无法看到