Как вручную выполнить функцию 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. Log 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. Соответственно, не может читать из undefined.
  4. Кажется, что hasSelection вызывается дважды (например, selectedContainer, который вызывает hasSelection, может быть вызван 3 раза _exec). В это время мы видим _iframe, но он больше не нужен.

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

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

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

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


person vintproykt    schedule 20.09.2015    source источник


Ответы (1)


Используйте только общедоступный API

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

Взаимодействуйте с WYMeditor только с помощью того, что там задокументировано, если это возможно.

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

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

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

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

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

person mightyiam    schedule 20.09.2015
comment
Да, это выглядит как мошенничество с моей стороны, когда я использовал proto. Я прибегнул к этому, потому что exec не работал с "Strong", так что теперь я попробовал "Bold", и это работает! Спасибо. - person vintproykt; 21.09.2015