CKEditor 4在对话框中动态选择

CKEditor 4在对话框中动态选择,ckeditor,ckeditor4.x,Ckeditor,Ckeditor4.x,正在尝试找出如何在对话框中动态填充选择菜单。。。到目前为止,在我所有的尝试中,我都未能使它正常工作。鲍勃 下面是一个更改现有选择菜单项的代码段。但是,您可以添加自己的、动态获取值等 //for button we just want to limit the button type to button if ( dialogName == 'button' ) { // updates the info tab var infoTab

正在尝试找出如何在对话框中动态填充选择菜单。。。到目前为止,在我所有的尝试中,我都未能使它正常工作。

鲍勃

下面是一个更改现有选择菜单项的代码段。但是,您可以添加自己的、动态获取值等

        //for button we just want to limit the button type to button
    if ( dialogName == 'button' ) {

        // updates the info tab 
        var infoTab = dialogDefinition.getContents( 'info' );
        var typeDef = infoTab.get( 'type' );
        var buttonType = new Array("Button", "button");
        var myItems = new Array (buttonType); 
        typeDef['items'] = myItems;

如果没有帮助,请提供实际结果与预期结果的其他详细信息。

我认为您要做的是在您的列表中动态填充一个下拉列表 插件。无论出于何种原因,在 对话框已打开

如果是这样,下面是我为类似情况所做的:

{
    type: 'select',
    id: 'exam_ID',
    label: 'Select Exam',
    items : [ ['--- Select an Exam---',0] ],
    setup : function(element) {
        var element_id = '#' + this.getInputElement().$.id;
        $.ajax({
            type: 'POST',
            url: 'lib/ckeditor/plugins/customExam/utilities/listExams.aspx',
            data: '{"cpID":' + window.parent.$("#cpID").val() + '}',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            async: false,
            success: function(data) {
                $.each(data.DATA, function(index, item) {
                    $(element_id).get(0).options[$(element_id).get(0).options.length] = new Option(item[1], item[0]);
                });
            },
            error:function (xhr, ajaxOptions, thrownError){
                alert(xhr.status);
                alert(thrownError);
            } 
        });
    }

}
关键是找到CKEditor设置的元素ID,它不是元素定义中的
ID
。您可以将该
id
用于其他函数,但如果您计划对元素进行任何更新,则需要获取CKEditor DOM元素

也许有更好的方法可以做到这一点,但这对我来说很有效

elements: [
                {
                    type: 'select',
                    id: 'test',
                    label: 'test label',
                    items: [
                        ['Please Choose', '']
                    ],
                    onLoad: function(element) {
                        this.add('Option 1', '1');
                        this.add('Option 2', '2');
                    }              
               }
        ]
若要在对话框打开进行编辑时添加或删除项目。您可以使用
setup
call。将其置于
onLoad
定义的上方或下方

                    setup: function(element) {
                        this.clear();

                        this.add('Please Choose', '');
                        this.add('Option 1', '1');
                        this.add('Option 2', '2');

                        this.setValue(element.getText());
                    },

使用add()方法并在列表中选择正确项的改进代码

{
键入:“选择”,
标签:“选择页面”,
id:'localPage',
项目:[['',][],
设置:功能(数据){
var self=这个;
$.get('/pages.php',函数(项){
items.forEach(功能(项目){
添加(项目[0],项目[1]);
});
if(data.localPage){
self.setValue(data.localPage | |“”);
}
}).fail(函数(){
警报('获取页面时出错');
});
},
}
pages.php示例脚本:

$pages=[
['Contact','{!!page:4!!}'],
['About','{page:5!!}'],
['homepage','{!!page:1!!}'],
];
返回json_encode($pages);

我想动态填充一个select,例如:示例:`CKEDITOR.dialog.add('foo',函数(编辑器){return{title:'test',resizeable:CKEDITOR.dialog_RESIZE_两者,minWidth:500,minHeight:400,contents:[{类型:'select',标签:'selectanexamine:',宽度:200,项目:[[one',1],[two',2]}]};})`你的片段很有帮助。。。但基本上我需要做的是通过一个外部源来填充选择菜单,比如ajax调用。。。这似乎不是一个简单的方法。如果没有,是否可以将我想做的所有事情“包装”到一个点击另一个网页的iframe中。这将使我不必处理编辑器中繁琐的定义。我不确定我是否理解,是什么阻止了您进行AJAX调用?这些OnDefinition只调用一次,而不是每次用户单击插件时调用。或者在启动期间加载数据,并将其存储在数据或其他地方,然后使用它。我注意到在
设置:
中,您没有使用
元素
参数,可以吗?我不知道为什么,但在使用ckeditor 4.5.4时,我必须使用
onLoad
事件,而不是
设置