以下是这种情况:我们正在开发类似CMS的工具,以管理各种电子邮件活动的副本。有一种表单允许用户选择一个模板来工作,其中还包括一个tinymce编辑器(v4.1.6)。
为了支持通配符,正在使用按钮来获取值以在tinymce中填充下拉菜单。这一切在第一次都很好,但是用户选择一个新模板的时候(它会稍微改变窗体的形状,一个空的按钮正在呈现在菜单的位置)addButton第二次不能正常工作
我已经浏览了代码,看每一步的变量值,只是发现每个变量都拥有我期望它们保持的值,并且每一个函数都会在需要被调用的时间和地点被调用,我不能,因为我的生活,为什么我没有得到第二次围绕tinymce.init()
调用相同的结果。无论如何,这是代码,它是一个相当大的模块的一部分,但tinyInit
函数是相当独立的:
var tinyInit = (function()
{
var i,menu =[],
cbContainer = {
editor: false,
cb: function() {
cbContainer.editor.execCommand(
'mceInsertContent',
false,
this._value
);
}
};
return function (btns)
{
var config = {
selector: 'textarea',
setup: function (editor) {
cbContainer.editor = editor;
editor.addButton('button', {
type: 'menubutton',
text: 'Placeholders',
name: 'placeholders',
icon: false,
menu: menu
});
},
toolbar: " button "
};
for (i=0;i<tinymce.editors.length;++i) {
//or tinymce.editors[i].remove();
tinymce.execCommand('mceRemoveEditor', false, tinymce.editors[i].remove());
}
cbContainer.editor = false;
btns = btns || $('.placeholders');
for (i = 0, menu.splice(0, menu.length); i < btns.length; ++i) {
menu.push(
{
text: btns[i].textContent,
value: btns[i].value,
onclick: cbContainer.cb
}
);
}
(btns instanceof $ ? btns : $(btns)).remove();
if (SomeGlobalModule.viewSource) {
config.plugins = 'code';
}
tinymce.init(config);
};
}());
最初,形式可能是这个样子:
<textarea>Foobar</textarea>
<button class="placeholders" value="%NAME%">Name</button>
<button class="placeholders" value="%DATE%">Date</button>
哪些工作出色:textarea的成为TinyMCE的编辑器,而且会有一个菜单,允许用户选择选择的占位符,将它们插入到内容整齐。然而,当选择一个新的模板,整个形式被重新加载(AJAX),我调用此函数从成功回调:
$.ajax({
url: SomeGlobalModule.url,
type: 'post',
success: function(r)
{
//frm variable is updated elsewhere, but it's updated correct & reliably
frm.replaceWith($(r));//replace form, frm references current element
reinitMenus();
tinyInit($('.placeholders'));//reinit tinymce
}
});
同样,所有的功能(包括setup
回调)是被调用,并且变量menu
始终具有期望值。那么,为什么不是下拉式填充?