6

を呼び出そうとしていますが、どのパラメーターを渡しても、結果としてdocument.getElementsByTagName返されます。undefined(「*」を渡しても。)

ググってみましたが、検索結果はすべて getElementsByTagName 結果配列の要素が未定義というものでした。私が得ているundefinedのは結果そのものであり、それが私を壁に押し上げています。

誰がこれを引き起こす可能性があるか知っていますか? (Firefox 12.0 を使用しています。Chrome では、期待どおりの結果が得られます。)

編集:OK、ここにサンプルコードがあります:

function buttonClick(){
   var xhr = new XMLHttpRequest();
   var msg = document.getElementById('message');
   var buttons = document.getElementsByTagName("button");
   var button, i;
   for (i = 0; i < buttons.length; ++i){
      button = buttons[i];
      msg.removeChild(button);
   }

   xhr.onreadystatechange = function() {
        if(xhr.readyState == 4){
            handleResult(xhr.responseText, msg);
        }
   };
   xhr.open("POST", location.href, true);
   xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
   xhr.send("cmd=MyCommand");
}

そして、Firebug の [スクリプト] タブでトレースするか、[コンソール] タブから呼び出すかに関係なく、getElementsByTagName常に が返されます。undefined(これは人々を混乱させるように思われるため、Firebug でも同様です。どうやらあまりにも多くのコンソールが浮かんでいるようです。)

証拠として、Firebug コンソールを使用しようとしたときに得られたものを次に示します。

>>> document.getElementsByTagName("button");
undefined
>>> msg.getElementsByTagName("button");
undefined
>>> msg.getElementsByTagName
getElementsByTagName()
>>> msg.getElementsByTagName("BUTTON");
undefined
>>> msg.getElementsByTagName("*");
undefined
>>> document.getElementsByTagName("*");
undefined
>>> document.getElementsByTagName("body");
undefined

マークアップは無関係です (またはそうあるべきです)。これは有効で整形式の HTML ページで、いくつかのボタンやその他の要素が含まれています。この JS 関数はonclick、ボタンの 1 つに関連付けられています。しかし、それは次のようになります。

<html xmlns="http://www.w3.org/1999/xhtml"><head>
blah
</head>
<body>
<script type="text/javascript" src="/myJS.js"></script>
<div id="page-container">
   <div id="message"><button onclick="buttonClick();">Button 1</button><button onclick="ButtonClick2()">Button 2</button></div>

</div>

</body></html>
4

4 に答える 4

8

編集:

これはfirebugのバグであり、1.10.0a7にアップグレードすることで修正されます。


このメソッドが戻ることは不可能であるため、undefined2つの可能性があります。

  • あなたのデバッグツールはあなたに嘘をついています
  • document.getElementsByTagName元のホストオブジェクトを参照していません。function getElementsByTagName() {[native code]}コンソールで参照すると印刷さ れます。

undefinedあなたはそれが実際に(Firefoxで)これであるかどうかを確実に見ることができるはずです:

delete window.alert;
window.alert(buttons);

がすでに元のホストオブジェクトを参照しているdelete場合はNOOPでwindow.alertあり、そうでない場合は復元されます。

警告 が表示された場合undefinedは、次のことができるはずです。

delete document.getElementsByTagName

ホストオブジェクト参照を復元します。

ここでのすべてのコンソール参照は、デフォルトでFirefoxに付属している組み込みのWebコンソールを指します。

于 2012-05-27T16:59:08.390 に答える
0

REPL は、ブラウザーに依存しないスタンドアロンの JavaScript 環境ではありませんか? あなたの場合、たまたまブラウザでプラグインとして実行されているだけですが、言うなれば「クリーンルーム」を模倣することになっています...

この男の答えを要約すると: document.getElementById() は、mozrepl を使用すると null を返します (しかし、firebug ではそうではありません)。

デフォルトでは、ドキュメントではなくブラウザのコンテキストにいます。

代わりにドキュメントに切り替えるには、これを試してください。

repl.enter(content)
于 2012-05-27T16:49:40.387 に答える