2

OK、私はこのようにツリーを歩く小さな関数を持っています:

function walkTree(node, func, args) {
    func(node, args);
    node = node.firstChild;
    while (node) {
        walkTree(node, func, args);
        node = node.nextSibling;
    }
}

そして、次のようにテキスト ノードのみを取得する別の関数:

function selectTextNodes(node, nodes) {
    if (node instanceof Text) {
        nodes.push(node);
    }
}

最後に、両方を使用します。

texts = [];
walkTree(body, selectTextNodes, texts);

しかし、それはリストをまったく埋めません!

テストを使用するように変更すると、次のようにNode.nodeType動作します。

function selectTextNodes(node, nodes) {
    if (node.nodeType == Node.TEXT_NODE) {
        nodes.push(node);
    }
}

一方、コンソールでは、両方の方法で機能します。

t = window.document.createTextNode("test");
r = (t.nodeType == Node.TEXT_NODE) && (t instanceof Text);

つまり、r は真です。

bodyすべての関数は、変数を受け取る別の関数内にネストされていることに注意してください。私の場合、これは のcontentDocument.bodyですiframe。適用される x ドメイン制限はありません。

何が起こっているのか分かりますか?

4

2 に答える 2

8

Textさまざまなウィンドウにさまざまなインターフェイスがあります。したがって、iframe ドキュメントから DOM ノードがある場合、それは ではなくinstanceof window.Textですinstanceof iframe.contentWindow.Text。また、Javascript オブジェクトとしてのインターフェイスの可用性もText非標準です。

nodeTypeそのため、要素のをチェックする必要があります。ただし、(古い?) IE はTEXT_NODE定数 onNodeをサポートしていないことに注意してください。そのため、その値を と比較する3か、ポリフィルとして に割り当てる必要がありますNode.TEXT_NODE

于 2012-12-15T19:20:02.180 に答える
1

メインドキュメント

<body>
  <iframe name="ifr" id="ifr" src='test1.html'></iframe>
  <button onclick="clkfn()">test</button>

  <script>

    function wrapper(body, iframeWindow) {
      function walkTree(node, func, args) {
        func(node, args);
        node = node.firstChild;
        while (node) {
            walkTree(node, func, args);
            node = node.nextSibling;
        }
      }

      function selectTextNodes(node, nodes) {
          if (node instanceof iframeWindow.Text) {
              nodes.push(node);
          }
      }    

      texts = [];
      walkTree(body, selectTextNodes, texts);

      for (var i = 0; i < texts.length; i++) {    
        console.log("text #" + i + texts[i].nodeValue);
      }
    }

    function clkfn() {
      var ifr = frames["ifr"];
      wrapper(ifr.document.body, ifr);
    }

  </script>


</body>

iFrame

<!doctype html>
<html>
    <head>
    </head>
    <body>
      how are you?
      I am fine. Thank you!
    </body>
</html>

コンソール

ボタンをクリックすると、コンソールに次のように出力されます。

   text #0  
        how are you?  
        I am fine. Thank you!

コードに加えられた変更のみがiframeの本体とウィンドウに渡されます。次に、iFrameウィンドウからTextオブジェクトを参照しました。

于 2012-12-15T18:25:44.583 に答える