Javascript addButton第二次不工作

Javascript addButton第二次不工作,javascript,tinymce,tinymce-4,Javascript,Tinymce,Tinymce 4,下面是一个场景:我们正在开发一个类似CMS的工具,用于管理各种电子邮件活动的副本。有一个表单,允许用户从tinymce编辑器(v4.1.6)中选择要使用的模板 为了支持通配符,正在使用按钮获取值以填充tinymce中的下拉菜单。这一切在第一次使用时都很好,但是当用户选择一个新的模板(这会稍微改变表单)时,一个空按钮就会出现在菜单应该出现的地方 我一步一步地看代码,每一步都在看变量值,结果发现每个变量都保存着我希望它们保存的值,每个函数都在我需要调用的时间和地点被调用。我不能,为了我的生命,弄明白

下面是一个场景:我们正在开发一个类似CMS的工具,用于管理各种电子邮件活动的副本。有一个表单,允许用户从tinymce编辑器(v4.1.6)中选择要使用的模板 为了支持通配符,正在使用按钮获取值以填充tinymce中的下拉菜单。这一切在第一次使用时都很好,但是当用户选择一个新的模板(这会稍微改变表单)时,一个空按钮就会出现在菜单应该出现的地方

我一步一步地看代码,每一步都在看变量值,结果发现每个变量都保存着我希望它们保存的值,每个函数都在我需要调用的时间和地点被调用。我不能,为了我的生命,弄明白为什么我在第二次
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);
    };
}());
同样,所有函数(包括
设置
回调)都被调用,
菜单
变量始终具有预期值。那么,为什么不填充下拉列表?

更新:
下面列出的解决方案仍然是我实现占位符菜单业务的唯一途径。不过,与此同时,我已经找到时间编写了一个TinyMCE插件,我已经发布了。
因为我发现有证据表明人们试图做和我一样的事情,每次答案都是你自己写的自定义插件,我决定创建一个拉式请求,让TinyMCE的维护人员自己提供这个插件。如果你碰巧发现这个问题/答案,并想看到这个插件被包括在蒂尼姆斯

我已经找到了一些时间来再次实际研究这个问题。我决定创建一个实际的插件,而不是使用
设置
回调添加按钮/菜单。为了让我的生活更轻松,我决定将插件添加到我的
tinyInit
函数的管理器中,像以前一样构造
菜单
数组e现在看起来像这样:

<textarea>Foobar</textarea>
<button class="placeholders" value="%NAME%">Name</button>
<button class="placeholders" value="%DATE%">Date</button>
var tinyInit = (function()
{
    var i,menu =[],
        cbContainer = {
            editor: false,
            cb: function () {
                tinymce.activeEditor.execCommand(
                    'mceInsertContent',
                    false,
                    this._value
                );
            }
        };
    return function (btns)
    {
        var config = {
            selector: 'textarea',
            plugins: ['placeholders'],
            toolbar1: "placeholders"
        };
        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
                }
            );
        }
        tinymce.PluginManager.add('placeholders', function(editor) {
            editor.addButton('placeholders', {
                text: 'Placeholders',
                type: 'menubutton',
                name: 'placeholders',
                icon: false,
                menu: menu
            });
        });
        (btns instanceof $ ? btns : $(btns)).remove();
        if (SomeGlobalModule.viewSource) {
            config.plugins = 'code';
        }
        tinymce.init(config);
    };
}());
var tinyInit=(函数()
{
变量i,菜单=[],
cbContainer={
艺术经纬:错,
cb:函数(){
tinymce.activeEditor.execCommand(
“mceInsertContent”,
假,,
这是你的价值
);
}
};
返回功能(btns)
{
变量配置={
选择器:'textarea',
插件:[“占位符”],
工具栏1:“占位符”
};
对于(i=0;i
var tinyInit = (function()
{
    var i,menu =[],
        cbContainer = {
            editor: false,
            cb: function () {
                tinymce.activeEditor.execCommand(
                    'mceInsertContent',
                    false,
                    this._value
                );
            }
        };
    return function (btns)
    {
        var config = {
            selector: 'textarea',
            plugins: ['placeholders'],
            toolbar1: "placeholders"
        };
        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
                }
            );
        }
        tinymce.PluginManager.add('placeholders', function(editor) {
            editor.addButton('placeholders', {
                text: 'Placeholders',
                type: 'menubutton',
                name: 'placeholders',
                icon: false,
                menu: menu
            });
        });
        (btns instanceof $ ? btns : $(btns)).remove();
        if (SomeGlobalModule.viewSource) {
            config.plugins = 'code';
        }
        tinymce.init(config);
    };
}());