我正在开发 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) );
});
});