要进行调试,请观察jquery.wymeditor.js
。
我需要通过JavaScript从我的自定义工具栏(准确地说,功能区)中执行“ Strong”,“ Indent”等命令。 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
对象。等一下。
记录编辑器IFrame的
Window
对象。当我们按
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;
};
按
F1
:第一个对象是执行WYMeditor命令之前得到的内容。
Second没有
_iframe
,因此返回undefined。因此,无法读取未定义的内容。
似乎
hasSelection
被调用了两次(例如,调用selectedContainer
的hasSelection
,可能被_exec
调用了3次)。此时,我们看到_iframe
,但不再需要它。事实证明:
第一次调用
hasSelection
时,wym
作为原型对象返回,但是...在第二次
wym
返回具有所需属性(例如_iframe
)的完整“编辑器对象”。那里有些奇怪的事,我不知道是什么。当按默认工具栏按钮时,所有功能均正常运行。
最佳答案
仅使用公共API
这里(有点太合乎我的口味)是WYMeditor's public API的文档。
如果可能,仅通过此处记录的内容与WYMeditor进行交互。
如果您使用私有方法/属性,我们将无法合理地支持该使用。
如果属性/方法以下划线开头,则它是私有的。
你想做什么
请使用公共API重写您的实现。
您会发现combokeys和exec
(不是_exec
)对于您想要达到的目标很有用。
关于javascript - 如何手动执行没有错误的WYMeditor功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32681713/