如何手动执行WYMeditor函数没有错误?
有关调试,请观看jquery.wymeditor.js
。
我需要从我的自定义工具栏(确切地说,功能区)通过JavaScript执行“Strong”,“Indent”等命令并且没有错误。 80%完成,我可以执行命令,但有一个奇怪的错误。
所以,我做什么,当文档准备好(包含textarea“#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
getWymeditorByTextarea
获取其扩展editor
对象。 Window
对象。 当我们按F1
键时:
myDoc_wym
。 myDoc_wym.__proto__._exec("Strong");
- 用命令"Strong"
执行原型函数_exec
... 这里是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
:
_iframe
,所以它返回undefined。 hasSelection
被调用两次(例如, selectedContainer
,调用hasSelection
,可能会被_exec
调用3次)。 这时我们看到_iframe
,但不再需要它。 事实证明:
hasSelection
叫, wym
返回原型对象 ,但... wym
返回完整的“编辑对象”与所需的属性(如_iframe
)。 有些奇怪的东西在那里,我不知道是什么。 按下默认工具栏按钮时,所有工作都完美无缺
只使用公共API
这里(有点偏离我的口味)是WYMeditor公共API的文档。
如果可能,只能通过那里记录的内容与WYMeditor进行交互。
如果您使用私有方法/属性,我们无法合理支持该使用。
如果一个属性/方法以下划线开始,它是私人的。
你在做什么
请使用公共API重写您的实施。
你会发现combokeys和exec
(而不是_exec
)对你想要达到的目标有用。