Для отладки смотрите 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
- WYMeditor на полпути, чтобы быть полностью готовым.
- Получите его расширенный объект
editor
с помощьюgetWymeditorByTextarea
. - Подожди секунду.
- Зарегистрируйте
Window
объект IFrame редактора. Когда мы нажимаем
F1
:- Log
myDoc_wym
. myDoc_wym.__proto__._exec("Strong");
- выполнить прототип функции_exec
командой"Strong"
...
- Log
А вот и крах 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;
};
- Первый объект — это то, что я получаю перед выполнением команды WYMeditor.
- У второго нет
_iframe
, поэтому он возвращает неопределенное значение. - Соответственно, не может читать из undefined.
- Кажется, что
hasSelection
вызывается дважды (например,selectedContainer
, который вызываетhasSelection
, может быть вызван 3 раза_exec
). В это время мы видим_iframe
, но он больше не нужен.
Оказывается, что:
- при первом вызове
hasSelection
,wym
возвращается как объект-прототип, но... - в второй раз
wym
возвращается как полный "объект редактора" с необходимыми свойствами (например,_iframe
).
Там происходит что-то странное, и я не знаю что. При нажатии на кнопки панели инструментов по умолчанию все работает отлично.