-1

私は Mozilla Thunderbird 拡張機能に取り組んでいます。DOM インスペクターとコンソールをインストールし、開発環境を構成して、指先でほとんどの情報を取得できるようにしました。

オーバーレイを使用する際の開発を容易にするために、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ですが、アクセスが簡単です)。jQueryオブジェクトではなくDOMノードを想定していることを考慮する必要があります。これは機能するはずです:

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

本当にjQueryを使用したい場合は、要素を取得するこのアプローチも機能するはずです。

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