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