如何手动执行WYMeditor function w/o错误?

How to manually execute WYMeditor function w/o errors?

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

    1. 日志myDoc_wym.
    2. myDoc_wym.__proto__._exec("Strong"); - 使用命令 "Strong"...
    3. 执行原型函数 _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

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

事实证明:

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

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

仅使用 public API

WYMeditor's public API.

的文档(对我来说有点太隐蔽了)

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

如果您使用私有 methods/properties,我们无法合理地支持该用途。

如果 property/method 以下划线开头,则它是私有的。

你想做什么

请使用 public API.

重写您的实现

您会发现 combokeys and exec(不是 _exec)对我看来您正在努力实现的目标很有用。