-1

我正在开发 Mozilla Thunderbird 扩展。我已经安装了 DOM Inspector、Console,并配置了我的开发环境,以便为我提供触手可及的大部分信息。

为了在使用 Overlays 时使开发更容易,我想获取对 XUL 元素的引用,然后在日志中显示 DOM 树以用于调试/开发目的。

在 Web 开发中,我会简单地转到浏览器控制台并输入:

$('#user-menu').html();

它会在控制台中打印该元素的 HTML 内容。

但是,我还没有找到使用 XML/XUL 元素执行此操作的方法。基本上,我希望将 XML/XUL DOM 转换为字符串,以便可以打印它。

我不想只打印文本。SO上已经有答案表明了这一点。我也想打印结构。

例如,假设我得到了 id="attachmentList" 的节点。

var node = $('#attachmentList');

如何打印内容以便我看到:

<hbox id="attachment">
    <description>Test</description>
    <xbox oncommand="do()">Do Something</xbox>
</hbox>

假设 XML/XUL DOM 在 id="attachmentList" 标识的元素内?

更新:

这是我尝试使用 serializeToString 时收到的漂亮错误消息。我怀疑我可能做错了什么,但是 jQuery 和 XUL 没有很好的文档记录:

Error: Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) 
    [nsIDOMSerializer.serializeToString]
Source file: chrome://demo/content/messageOverlay.js
    Line: 72

如果这有帮助,这是我在 Thunderbird 中导入 jQuery 的方式:

 window.addEventListener("load", function() {

      // was hoping this would eliminate that security error
      netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");

      var demolog = Components.classes["@mozilla.org/consoleservice;1"].
       getService(Components.interfaces.nsIConsoleService);

      demolog.logStringMessage("loading overlay...now load jQuery...");

      // loading jQuery here...
      var jQuery = loadjQuery(window);
      demolog.logStringMessage("loaded jQuery...now set $ alias...");
      var $ = jQuery;
      demolog.logStringMessage("jQuery loaded and configured...");

      // register a click handler. When I click this, it fires.
      document.getElementById("jamesdemo")
          .addEventListener("click", function() {
          demolog.logStringMessage("clicked");

         // http://stackoverflow.com/questions/6507293/convert-xml-to-string-with-jquery
            var oSerializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].
                createInstance(Components.interfaces.nsIDOMSerializer);  
            demolog.logStringMessage( "created XMLSerializer..." );  

// this threw the security error
//                var sXML = oSerializer.serializeToString($('#attachmentView'));  

              // as does this...
              var sXML = oSerializer.serializeToString(
                   document.getElementById('#attachmentView'));  

              // doesn't get this far at all
              demolog.logStringMessage("XML = " + sXML);  

              // when this was in scope, it threw the same error.
              demolog.logStringMessage( (new XMLSerializer()).serializeToString($('#attachmentView').get(0).childNodes));  


            demolog.logStringMessage( "attachmentView = " + $('#attachmentView').get(0).childNodes );

          // This prints Object [XULElement], but of course cannot be serialized.
          demolog.logStringMessage( "attachmentitem" + $('#attachmentitem').get(0) );

      });

  });
4

1 回答 1

1

您应该使用XMLSerializer(与访问相同nsIDOMSerializer但更容易访问)。您必须考虑它需要 DOM 节点而不是 jQuery 对象。这应该有效:

var element = document.getElementById("attachmentView");
var sXML = new XMLSerializer().serializeToString(element);

如果您真的想使用 jQuery,那么这种获取元素的方法也应该有效:

var element = $("#attachmentView")[0];
于 2012-03-05T11:52:40.180 回答