【问题标题】:Dynamically add context menu items in CKEditor based on user-selected list根据用户选择的列表在CKEditor中动态添加上下文菜单项
【发布时间】:2015-05-21 15:19:26
【问题描述】:

使用 CKEditor 插件,我试图根据用户从 DataTable 对象中选择的项目添加上下文菜单项。菜单项显示得很好。添加的第一个菜单项 当前时间/日期 有效。但是,当单击 For 循环添加的任何项目时,它们都会执行最后一个命令。此外,循环添加的菜单项应该在它们自己的组中,我认为这会自动在它们和 Current Time/Date 命令之间放置一条线。

cmd 是要添加的命令的名称。 menuList 是上下文菜单项的数组。 menuDetails 是命令详细信息(标签、命令、组、顺序)的数组

这是用于添加项目的 JavaScript:

function InitRTFContext(editor) {           
        if ( editor.contextMenu ) {
            var cmd;
            var menuList = new Object();
            var menuCommand = new Object();
            var menuDetails = new Object();
            var i = 2;
            cmd = "cmdTimeAndDate";
            editor.addMenuGroup( 'CommonGroup' );               
            editor.addCommand(cmd, { exec : function( editor ) { editor.insertText('[[Now]]'); }});
            menuDetails["label"] ='Current Time/Date';
            menuDetails["command"] = cmd;
            menuDetails["group"] = 'CommonGroup';
            menuDetails["order"] = 1;
            menuCommand[cmd] = menuDetails;     
            menuList[cmd] = CKEDITOR.TRISTATE_OFF;


            editor.addMenuGroup('DynamicFields');
            dtChosen.rows().data().each(function (row) {
                if (row.QuestionTypeID != 0 && row.QuestionTypeID != 4 && row.Text != 'Text Block') {
                    i++;                        
                    
                    cmd = "Q_" + row.WebFormTemplateQuestionID + "_" + row.Text;
                    cmd = cmd.replace(/\s/g, '');
                    
                    /* This section is not working */
                    editor.addCommand(cmd, { exec : function( editor ) { editor.insertText('[[' + cmd + ']]'); }});                     
                    /* This section is not working */

                    menuDetails = new Object();
                    menuDetails["label"] = row.Text;
                    menuDetails["command"] = cmd;
                    menuDetails["group"] = 'DynamicFields'; 
                    menuDetails["order"] = i;
                    menuCommand[cmd] = menuDetails;
                    menuList[cmd] = CKEDITOR.TRISTATE_OFF;                      
                }                   
            });
            
            editor.addMenuItems(menuCommand);
            editor.contextMenu.addListener( function( element, selection ) {
                return menuList;
            });
        }
        else {
            alert('Error loading RTF Context Menu.');
        }
    }

这会创建: (没有足够的代表来发布图片,所以输入它)

粘贴


当前时间/日期

客户名称

客户电话

客户电子邮件

...

点击当前时间/日期之后的所有命令将打印用于客户电子邮件的命令。那么,我错过了什么?

【问题讨论】:

    标签: javascript html ckeditor


    【解决方案1】:

    这里的问题是“cmd”。您在方法中使用它,但它是在父范围中声明的。如果你使用 'var' 在循环内声明它,它会正常工作。

    【讨论】:

    • 谢谢!做到了。我不完全确定为什么会这样。我会假设因为这是 Each 内部的一个函数,所以它会混淆为每次迭代保留 cmd 的副本。
    • 就是这样,但它不是“感到困惑”,而是javascript的一个非常有意的功能,称为范围。 robertnyman.com/2008/10/09/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2015-05-10
    • 2019-04-19
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多