要进行调试,请观察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)控制台中获得了什么:

javascript - 如何手动执行没有错误的WYMeditor功能?-LMLPHP

原型函数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
javascript - 如何手动执行没有错误的WYMeditor功能?-LMLPHP


第一个对象是执行WYMeditor命令之前得到的内容。
Second没有_iframe,因此返回undefined。
因此,无法读取未定义的内容。
似乎hasSelection被调用了两次(例如,调用selectedContainerhasSelection,可能被_exec调用了3次)。此时,我们看到_iframe,但不再需要它。


事实证明:


第一次调用hasSelection时,wym作为原型对象返回,但是...
在第二次wym返回具有所需属性(例如_iframe)的完整“编辑器对象”。


javascript - 如何手动执行没有错误的WYMeditor功能?-LMLPHP

那里有些奇怪的事,我不知道是什么。当按默认工具栏按钮时,所有功能均正常运行。

最佳答案

仅使用公共API

这里(有点太合乎我的口味)是WYMeditor's public API的文档。

如果可能,仅通过此处记录的内容与WYMeditor进行交互。

如果您使用私有方法/属性,我们将无法合理地支持该使用。

如果属性/方法以下划线开头,则它是私有的。

你想做什么

请使用公共API重写您的实现。

您会发现combokeysexec(不是_exec)对于您想要达到的目标很有用。

关于javascript - 如何手动执行没有错误的WYMeditor功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32681713/

10-12 06:45