1

我正在尝试按照本文的说明通过XUL的元素使用Midas。到目前为止,我有以下代码:

<window id="main" title="Anunciador Blog Editor" width="300" height="300"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <script type="application/x-javascript">
    <![CDATA[ 
    var editor = null;
    function onLoad() {
        editor = document.getElementById('editor');
        editor.contentDocument.designMode = 'on';
    }

    function onBoldButtonCommand() {
        editor.contentDocument.execCommand('bold', false, null);
    }

    window.addEventListener("load", onLoad, false);
    ]]>
    </script>
    <button label="Bold" oncommand="onBoldButtonCommand();" />
    <editor id="editor" type="content-primary" editortype="html" src="about:blank" flex="1" />
</window>

但是,当我单击“粗体”按钮并在 中选择了一些文本时<editor>,文本不会更改,并且 JS 控制台会显示以下错误:

Error: uncaught exception: [Exception... "Component returned failure code: 0x80004005
(NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand]"  nsresult: "0x80004005
(NS_ERROR_FAILURE)"  location: "JS frame :: chrome://anunciador/content/main.xul :: 
onBoldButtonCommand :: line 14"  data: no]

这对我来说没有意义,因为我已经启用了编辑模式:

editor.contentDocument.designMode = 'on';

另外,如果我只换行

<editor id="editor" type="content-primary" editortype="html" src="about:blank" flex="1" />

<xhtml:iframe id="editor" src="about:blank"></xhtml:iframe>

我可以在 iframe 中编辑和格式化文本(但我更喜欢使用编辑器)。

我是不是忘记了什么?

4

1 回答 1

3

经过长时间的研究,问题似乎是Gecko 中的一个错误——顺便说一句,这是一个经常出现的错误。看来,终于 解决了。.

当我们等待公共构建时(或者如果您无法使用未来更新版本的 XULRunner 或 Firefox),您可以使用编辑器的commandManager属性作为解决方法。该对象提供了一种方法doCommand(),该方法可用于格式化文本。该方法具有三个参数:一个表示命令的字符串(与 接受的不同)execCommand()、一个 param 对象(获取起来确实很麻烦,但可以忽略一段时间)和contentWindow编辑器的。

如果您想使选择变粗,只需以这种方式使用此方法:

function onBoldButtonCommand() {
    editor.commandManager.doCommand("cmd_bold", {}, editor.contentWindow)
}

但是,如果您的命令需要参数,它可能会变得有点复杂。首先,您需要一个nsICommandParams接口实例(它将是一个由 JavaScript 对象包装的 C++ 对象)。获取此对象涉及一些非常深奥的代码,显然涉及 XPCOM 之类的东西:

var commandParams = Components.classes['@mozilla.org/embedcomp/command-params;1'].getService(Components.interfaces.nsICommandParams);

在这个对象中,我们将命令的参数设置为键值对。我们有一个所有命令接受的参数列表。不要害怕这个页面是指 C++ 代码——你可以直观地将它映射到 JavaScript。此外,希望似乎所有命令都只接收一个参数,"state_attribute". 例如,如果我们想设置文本的颜色,我们在 param 对象中这样设置参数:

commandParams.setCStringValue("state_attribute", "#FF0000");

doCommand()然后你这次“只是”使用参数调用:

editor.commandManager.doCommand("cmd_fontColor", commandParams, editor.contentWindow);

下面的代码是使用doCommand()带参数和不带参数的工作示例:

<window id="main" title="Anunciador Blog Editor" width="300" height="300"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:xhtml="http://www.w3.org/1999/xhtml">
   <script type="application/x-javascript">
   <![CDATA[
   var editor = null;
   function onLoad() {
       editor = document.getElementById('editor');
       editor.contentDocument.designMode = 'on';
   }

   function onBoldButtonCommand() {
       editor.commandManager.doCommand("cmd_bold", {}, editor.contentWindow)
   }

    function onRedTextCommand() {
        var commandParams = Components.classes['@mozilla.org/embedcomp/command-params;1'].getService(Components.interfaces.nsICommandParams);
        commandParams.setCStringValue("state_attribute", "#FF0000");
        editor.commandManager.doCommand("cmd_fontColor", commandParams, editor.contentWindow)
    }

   window.addEventListener("load", onLoad, false);
   ]]>
   </script>
   <toolbar>
       <button label="Bold" oncommand="onBoldButtonCommand();" />
       <button label="Red" oncommand="onRedTextCommand();" />
   </toolbar>
   <editor id="editor" type="content-primary" editortype="html" src="about:blank" flex="1" />
</window>

此外,此页面可能会有所帮助,而这一页面更有帮助(尽管部分是用法语编写的!)。

于 2011-07-18T13:23:53.690 回答