1

我有一个 Javascript 混乱,超出了我对该语言的了解。

我正在为 CKEditor 创建一个自定义插件。该插件是一个 IFrame,在 CKEditor 生成的 DIV 中打开。

在 IFrame 中,我显示了许多图像。如果用户选择了这些图像之一,则显示该图像所需的 HTML 代码将插入到 CKEditor 中。

动态地这样做是我卡住的地方。我从 Iframe 中连接到 CKEditor 实例,如下所示:

var CKEDITOR = window.parent.CKEDITOR;    

CKEditor 提供了一个“OK 侦听器”,当单击 OK 按钮(由 CKEEditor 呈现)时触发。OK 侦听器在 IFrame 之外。

定义使用静态值的 OK 侦听器有效:

var okListener = function(ev) {
   this._.editor.insertHtml('<img class="symbol" src="my_static_symbol.gif">');
   CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", okListener);

但是当我分配 OK 侦听器时,我还不知道我的返回值,所以我需要做这样的事情:

var okListener = function(ev) {
   this._.editor.insertHtml('<img class="symbol" src="'+my_dynamic_value()+'">');
   CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", okListener);

但这不起作用,因为my_dynamic_value它在被 CKEditor 的“确定”按钮触发时超出了函数的范围。

我当然可以,每次用户在列表中选择不同的图像时,更新okListener函数并将当前值硬编码eval到其中。但这对我来说是一种可怕的资源浪费。

我可以使用一些范围技巧,以便我可以从 okListener() 中访问我的 iframe 中的内容吗?

我希望这足够清楚。如果不是,请发表评论,我会澄清。

4

2 回答 2

5

但这不起作用,因为 my_dynamic_value 在 CKEditor 的“确定”按钮触发时超出了函数的范围。

好的。也许真的不行,但解释是错误的。在 JavaScript 中,变量具有词法范围。这意味着如果 my_dynamic_value 在声明函数(处理程序)时在范围内,那么它会永远保留在那里。你得到什么错误信息?

于 2009-12-21T00:28:33.503 回答
1

您可以编写一个创建侦听器的函数,传入动态值(作为函数或字符串,取决于脚本其余部分的编写方式)。

function createOKListener(imgURLFunc) {
   return function(ev) {
      this._.editor.insertHtml('<img class="symbol" src="'+imgURLFunc()+'">');
      CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
   };
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", createOKListener(function() {iframeRef.path.to.imageURL}));

或者:

function createOKListener(imgURL) {
   return function(ev) {
      this._.editor.insertHtml('<img class="symbol" src="'+imgURL+'">');
      CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
   };
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", createOKListener(path.to.imageURL));

我怀疑发生了什么是函数在顶级窗口的上下文中执行;这是否正确取决于 CKEditor 的事件实现。如果是这种情况,那么您可以尝试通过 iframe 窗口访问 iframe 的全局变量(如 imgURLFunc 版本中所述)或将值绑定到局部变量(如 完成createOKListener)。

发生的事情是全局变量(除了window)被解析为window(想象一下with (window) {...}周围的代码块)的属性。当 CKEditor 触发一个事件时,它会在(来自 iframe)的上下文中执行CKEDITOR此操作。window.parent

于 2009-12-21T00:13:07.520 回答