【问题标题】:TinyMCE - Adding a Key Binding CNRTL-S COMMAND-S to call an AJAX save FunctionTinyMCE - 添加键绑定 CNRTL-S COMMAND-S 以调用 AJAX 保存函数
【发布时间】:2010-11-25 21:13:13
【问题描述】:

我想学习如何绑定 CNRTL-S 或 COMMAND-S 来调用我页面上的一个函数,该函数通过 AJAX 保存 textarea 内容的

如何绑定这两个命令?当它只是一个文本区域时,我曾经使用以下内容,但是自从添加了 TinyMCE 它不再起作用。有什么建议吗?

// Keybind the Control-Save
jQuery('#text_area_content').bind('keydown', 'ctrl+s',function (evt){
saveTextArea();
    return false;
});
 // Keybind the Meta-Save Mac
jQuery('#text_area_content').bind('keydown', 'meta+s',function (evt){
saveTextArea();
    return false;
});

谢谢

【问题讨论】:

    标签: javascript tinymce textarea


    【解决方案1】:

    为了使用自定义方法进行保存,我在 tinymce.init 方法中声明了我的保存函数

    tinyMCE.init({
            // General options
            mode: "none",
            /* some standard init params, plugins, ui, custom styles, etc */            
    
    
            save_onsavecallback: saveActiveEditor,
            save_oncancelcallback: cancelActiveEditor
        });
    

    然后我定义函数本身

    function saveActiveEditor() {
         var activeEditor = tinyMCE.activeEditor;
         var saveUrl = "http://my.ajax.path/saveStuff";
         var idEditor = activeEditor.id;
         var contentEditor = activeEditor.getContent();
         /* the next line is for a custom language listbox to edit different locales */
         var localeEditor = activeEditor.controlManager.get('lbLanguages').selectedValue;
    
         $.post(saveUrl ,
                { id: idEditor, content: contentEditor, locale: localeEditor },
                function(results) {
                    if (results.Success) {
                        // switch back to display instead of edit
                        return false;
                    }
                    else {
                        activeEditor.windowManager.alert('Error saving data');
                        return false;
                    }
                },
                'json'
            );
            return false;
     }
    

    不要忘记return false 覆盖将您的数据回发到服务器的默认保存操作。


    编辑添加:我只让用户一次更改一个 tinymce 实例。您可能希望将当前实例的定位更改为其他内容:)


    edit #2:TinyMce 已经捕获了 Ctrl+s 绑定来处理数据。由于它还清理了 html 并且能够处理它在保存时给出的特定规则,所以我建议的解决方案是将您的保存方式插入到 tinyMce 中,而不是完全覆盖 Ctrl+s 绑定

    【讨论】:

    • 我希望通过键绑定来保存。您的答案中有哪些关于键绑定的内容?
    • Tinymce 已经掌握了 Ctrl+s 组合。因此,我们不是通过回发结果来保存它,而是使用 ajax 调用覆盖它的默认行为。由于 tinyMCE 在节省时间的情况下做了很多事情,最好只覆盖需要的内容,让它负责整个清理/即时编辑等......
    【解决方案2】:

    这里的问题是 tinymce iframe 没有将事件委托给父窗口。您可以在 tinymce 中定义 custom_shortcuts 和/或使用以下语法:

    // to delegate it to the parent window i use
    var create_keydown_event = function(combo){
        var e = { type : 'keydown' }, m = combo.split(/\+/);
        for (var i=0, l=m.length; i<l; i++){
            switch(m[i]){
                case 'ctrl': e.metaKey = true;
                case 'alt': case 'shift': e[m[i] + 'Key'] = true; break;
                default : e.charCode = e.keyCode = e.which = m[i].toUpperCase().charCodeAt(0);
            }
        }
        return e;
    }
    
    var handler = function(){
    
      setTimeout(function(){
        var e = create_keydown_event(combo);
        window.parent.receiveShortCutEvent(e);
      }, 1);
    }
    
    //ed.addShortcut(combo, description, handler);
    ed.addShortcut('ctrl+s', 'save_shortcut', handler);
    

    在父窗口中,您需要一个函数 receiveShortCutEvent 来解决如何处理它

    【讨论】:

    • 这似乎不起作用。它在哪里生活?它如何知道要查找哪个 tinymce 实例等。似乎是 hack no?
    • 你把 ed.addShortcut 放在哪里了?
    • 你把它放在一个插件里。您应该将此代码放在插件的 onInit 中。处理程序: ed.onInit.add(ed){...} ,但您可以从插件外部引用编辑器来使用 ed = tinymce.activeEditor:
    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多