CKEditor变量在控制台中可用,但不是来自Chrome用户?

时间:2012-01-29 02:23:34

标签: javascript google-chrome ckeditor userscripts

我正在编写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新手。因此,我可以很容易地做一些与范围或其他类似的东西。

1 个答案:

答案 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而无法看到