1

对于调试,请观看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
  1. WYMeditor 半路要做好充分准备。
  2. 使用 .获取其扩展editor对象getWymeditorByTextarea
  3. 等一下。
  4. 编辑器 IFrame 的日志Window对象。
  5. 当我们按下F1

    1. 日志myDoc_wym
    2. 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玩自定义功能

  1. 第一个对象是我在执行 WYMeditor 命令之前得到的。
  2. 第二个没有_iframe,所以它返回未定义。
  3. 因此,无法从未定义中读取。
  4. 似乎hasSelection被调用了两次(例如,selectedContainer调用hasSelection,可能被调用 3 次_exec)。此时我们看到_iframe,但不再需要它。

事实证明:

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

奇怪的物体

那里有奇怪的东西,我不知道是什么。当按下默认工具栏按钮时,一切正常。

4

1 回答 1

2

仅使用公共 API

这里(对我的口味来说有点太隐蔽了)是WYMeditor 的公共 API的文档。

如果可能,仅通过那里记录的内容与 WYMeditor 交互。

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

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

你想做什么

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

您会发现组合键exec(not _exec) 对于您想要实现的目标很有用。

于 2015-09-20T18:04:45.103 回答