以下是這種情況:我們正在開發類似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
始終具有期望值。那麼,爲什麼不是下拉式填充?