TinyMCE - Добавление привязки клавиш CNRTL-S COMMAND-S для вызова функции сохранения AJAX - PullRequest
3 голосов
/ 26 ноября 2010

Я хотел бы узнать, как связать CNRTL-S или COMMAND-S для вызова функции, которая есть у меня на моей странице и которая AJAX сохраняет текстовое содержимое

Как я могу связать эти две команды? Я использовал следующее, когда это была просто текстовая область, но после добавления 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;
});

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Чтобы использовать собственный метод для сохранения, я объявляю свою функцию сохранения в методе 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

0 голосов
/ 26 ноября 2010

Проблема здесь в том, что iframe tinymce не делегирует события родительскому окну.Вы можете определить custom_shortcuts в tinymce и / или использовать следующий синтаксис:

// 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, которая разберется, что с ней делать

...