2013-01-07 47 views
0

我刚刚开始使用CKEditor,并且无法完全理解该API以完成我的目标。CkEditor对话框事件处理

本质上,我在页面上有几个编辑器实例。但是,对于名称为htmlInput的编辑器,我想要收集添加到编辑器中的表单元素的名称。我得到的最接近的是在打开适当的对话框时弹出警告,但我无法提取这些框的名称字段的值。

这是我到目前为止。

CKEDITOR.on('dialogDefinition', function (e) { 
    var dialogName = e.data.name; 
    var dialog = e.data.definition.dialog; 

    if(e.editor.name == 'htmlInput' && (dialogName=='checkbox' || dialogName=='radio' || dialogName=='textfield' || dialogName == 'textarea' || dialogName == 'select')) 
    { 
     dialog.on('show', function (ev) { 
      alert('here'); 
     }); 
    } 
}); 

回答

0

你想要做的事情是非常不安全的。想象一下,如果某人粘贴了这样的表单元素或者使用了方法。他们不会被收集。更好的办法如下:

var form = {}; 

CKEDITOR.instances.editor1.dataProcessor.htmlFilter.addRules({ 
    elements: { 
     $: function(element) { 
      if (element.name in { 'input' : 1, 'textarea': 1, 'button' : 1 }) { 
       if (!form[ element.name ]) 
        form[ element.name ] = []; 

       form[ element.name ].push(element); 
      } 
     } 
    } 
}); 

现在,当你基本上可以做到以下几点:

CKEDITOR.instances.editor1.getData(); 
console.log(form); 

然后你会找回属于所有的表单元素(或任何形式的元素)文件。当序列化表单时,只需确保form对象为空,因为当在源模式< - > wysiwyg之间切换时也会执行htmlFilter,并且它将不断填充您的列表。


也基本上可以使用以下方法来检索标记名称的元素(简单IMO方式):

CKEDITOR.instances.editor1.document.getElementsByTag('input'); 
+0

如何获得有关检索元素名称?例如,如果有一个元素,我可以通过使用element.attributes.value来获取该值。当我键入element.name我得到'输入',当我键入element.attributes.name我得到未定义。我将如何去检索字符串'测试'? – user1620902

+0

它完全正常工作。看[这个小提琴](http://jsfiddle.net/Q4sKF/)。 – oleq

+0

嗯..我看到它工作一点点,但仍然有问题。例如,我看到它不起作用的主要案例是当你使用CKEditor的一部分提供的表单元素按钮时,它并不总是更新,至少它看起来不像我。我一直在使用两种方法来调用htmlFilter。第一个是通过.getData() - 这总是返回undefined。第二个是通过切换源模式和wysiwyg。这会每次调用htmlFilter,但似乎需要进行一些模式更改才能返回undefined。我试图用小提琴,我的配置 – user1620902