Javascript 根据用户选择的列表在CKEditor中动态添加上下文菜单项
使用CKEditor插件,我试图根据用户从DataTable对象中选择的项目添加上下文菜单项。菜单项显示得很好。添加的第一个菜单项,当前时间/日期,有效。但是,当单击For循环添加的任何项时,它们都会执行最后一个命令。另外,循环添加的菜单项应该在它们自己的组中,我认为这会自动放在它们和当前时间/日期命令之间的一行中 cmd是要添加的命令的名称。 menuList是上下文菜单项的数组。 menuDetails是命令详细信息的数组(标签、命令、组、顺序) 以下是用于添加项目的JavaScript:Javascript 根据用户选择的列表在CKEditor中动态添加上下文菜单项,javascript,html,ckeditor,Javascript,Html,Ckeditor,使用CKEditor插件,我试图根据用户从DataTable对象中选择的项目添加上下文菜单项。菜单项显示得很好。添加的第一个菜单项,当前时间/日期,有效。但是,当单击For循环添加的任何项时,它们都会执行最后一个命令。另外,循环添加的菜单项应该在它们自己的组中,我认为这会自动放在它们和当前时间/日期命令之间的一行中 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.');
}
}
这就产生了:
(没有足够的代表发布图像,所以请键入)
粘贴
当前时间/日期 客户名称 客户电话 客户电子邮件
单击当前时间/日期之后的所有命令将打印用于客户电子邮件的命令。那么,我遗漏了什么呢?这里的问题是“cmd”。您正在方法中使用它,但它是在父范围中声明的。如果您使用“var”在循环内部声明它,它将正常工作。谢谢!成功了。我不完全清楚为什么会这样。我会假设,因为这是每个迭代中的一个函数,所以每次迭代都保留一个cmd副本会让它感到困惑。