Как вручную выполнить функцию WYMeditor без ошибок?

Для отладки смотрите jquery.wymeditor.js,

Мне нужно выполнять такие команды, как "Сильный", "Отступ" и т. Д. С моей пользовательской панели инструментов (если быть точным, ленты) через JavaScript и без ошибок. 80% сделано, я могу выполнять команды, но есть странная ошибка.

Итак, что я делаю, когда документ готов (с вложенной текстовой областью "#doc"):

myDoc = $("#doc").wymeditor()[0];
myDoc_wym = $.getWymeditorByTextarea(myDoc);

setTimeout(function() {
    console.log(myDoc_wym._iframe.contentWindow); // contentWindow returns proper Window object of editor IFrame
    $(myDoc_wym._doc).keydown(function(e) {
        if (e.which == 112) {
            console.log(myDoc_wym); // must return extended jQuery editor object
            myDoc_wym.__proto__._exec("Strong"); // BREAKPOINT
            console.log("It might be done!"); // no luck today
            return false;
        }
    });
}, 1000); // to be sure, that myDoc_wym._doc exists, I just enforced timeout
  1. WYMeditor на полпути, чтобы быть полностью подготовленным.
  2. Получите его расширенный editor объект с getWymeditorByTextarea,
  3. Подожди секунду.
  4. Журнал Window объект редактора IFrame.
  5. Когда мы нажимаем F1:

    1. Журнал myDoc_wym,
    2. myDoc_wym.__proto__._exec("Strong"); - выполнить прототипную функцию _exec с командой "Strong"...

Здесь идет крушение keydown, Что я получаю в консоли Chromium (выше последней выпущенной NW.JS):

Весь журнал

Ошибка вызвана в прототипе функции hasSelection, Итак, это говорит о том, что _iframe является undefined в этом коде:

WYMeditor.editor.prototype.hasSelection = function () {
    var wym = this;

    if (
        // `isSelectionValid` is undocumented in current Rangy (`1.2.2`).
        // It seems to be required because the `rangeCount` in `IE <= 8` seems
        // to be misleading.
        rangy.isSelectionValid(wym._iframe.contentWindow) !== true
    ) {
        return false;
    }

    if (wym.selection().rangeCount === 0) {
        return false;
    }

    return true;
};

После этого попытался включить свой собственный вызов для этой функции, вставив в консольный ввод аналогичный код, но с необходимостью отладки (console.log(wym);):

WYMeditor.editor.prototype.hasSelection = function () {
    var wym = this;
    console.log(wym);
    //console.log(wym._iframe);
    //console.log(wym._iframe.contentWindow);
    if (rangy.isSelectionValid(wym._iframe.contentWindow) !== true) return false;
    if (wym.selection().rangeCount === 0) return false;
    return true;
};

прессование F1: Игра с пользовательской функцией

  1. Первый объект - это то, что я получаю перед выполнением команды WYMeditor.
  2. Второй не имеет _iframe, так что возвращается неопределенное.
  3. Соответственно, не может читать из неопределенного.
  4. Это похоже на hasSelection вызывается дважды (например, selectedContainer, что вызывает hasSelection может быть вызван 3 раза _exec). В это время мы видим _iframe, но это больше не нужно.

Оказывается, что:

  1. в первый раз hasSelection называется, wym возвращается как прототип, но...
  2. во второй раз wym возвращается как полный "объект редактора" с необходимыми свойствами (такими как _iframe).

Странный объект

Там происходит что-то странное, и я не знаю что. При нажатии на стандартные кнопки панели инструментов все работает отлично.

1 ответ

Решение

Использовать только публичный API

Здесь (на мой вкус слишком спрятано) документы для публичного API WYMeditor.

По возможности взаимодействуйте с WYMeditor только через то, что там задокументировано.

Если вы используете частные методы / свойства, мы не сможем разумно поддержать это использование.

Если свойство / метод начинается с подчеркивания, оно является частным.

Что вы пытаетесь сделать

Пожалуйста, перепишите вашу реализацию, используя публичный API.

Вы найдете комбоки и exec (не _exec) полезно для того, что мне кажется, вы пытаетесь достичь.

Другие вопросы по тегам