2

私は、JavaScript ライブラリで document.write を使用する必要があると思われる状況にあります。スクリプトは、スクリプトが定義されている領域の幅を認識している必要があります。ただし、スクリプトには、その領域のタグに関する明示的な知識はありません。div の明示的な知識があれば、次のように簡単になります。

<div id="childAnchor"></div>
<script ref...
 //inside of referenced script
 var divWidth = $("#childAnchor").width();
</script>

したがって、参照されているスクリプト内で、次のように document.write を使用することを考えています。

<script ref...
 //inside of referenced script
 var childAnchor = "z_87127XNA_2451ap";
 document.write('<div id="' + childAnchor + '"></div>');
 var divWidth = $("#" + childAnchor).width();
</script>

ただし、document.write の実装はあまり好きではありません。ここで document.write を使用する代わりの方法はありますか? 単純にウィンドウを使用できない理由は、これがマスター ビュー ページ内でレンダリングされるビュー内にあるためです。ウィンドウは、ネストされた領域の幅を適切に取得しませんでした。

エリアはほとんどここにあります:

<body>
 <div>
  <div>
   <div>
     AREA

AREA には、他の div に関する情報はありません。

4

4 に答える 4

4

これはちょうど私に起こりました、そして私はあなたの質問を思い出しました:スクリプトコードはそれが入っているスクリプトブロックを見つけることができるので、そこからDOMをトラバースすることができます。現在のスクリプトブロックは、現時点でDOMの最後のブロックになります(コードの実行時にDOMは引き続き解析されます)。

現在のスクリプトブロックを見つけることで、その親要素を見つけて、どこにでも新しい要素を追加できます。

<!doctype html>
<html>
    <head>
        <style>
        .parent .before { color: red; }
        .parent .after { color: blue; }
        </style>
    </head>
    <body>
        <script></script>
        <div class="parent">
            <span>before script block</span>
            <script>
            var s = document.getElementsByTagName('script');
            var here = s[s.length-1];

            var red = document.createElement("p");
            red.className = 'before';
            red.innerHTML = "red text";
            here.parentNode.insertBefore(red, here);

            var blue = document.createElement("p");
            blue.className = 'after';
            blue.innerHTML = "blue text";
            here.parentNode.appendChild(blue);
            </script>
            <span>after script block</span>
        </div>
        <script></script>
    </body>
</html>​

http://jsfiddle.net/gFyK9/2/

「青いテキスト」スパンは「スクリプトブロック後」スパンの前に挿入されることに注意してください。これは、「後」のスパンが現在DOMに存在しないためappendChildです。


ただし、これを失敗させる非常に簡単な方法があります。

于 2012-05-30T04:49:13.860 に答える
3

この方法に代わる方法はありません。これは、スクリプトがロードされるDOMについて何も知らなくても、スクリプトがネストされている要素の幅を見つけることができる唯一の方法です。

適切に使用document.write()されたときに使用することは合法です。DOMに新しい要素を追加することをお勧めしますが、常に利用できるオプションであるとは限りません。

于 2012-05-27T20:03:05.930 に答える
1

それがどの子要素であるかがわかっている場合は、jquery で param nth の子を使用できます。それ以外の場合は、 each() を使用してそれらを反復処理する必要があります

于 2012-05-25T23:05:15.390 に答える
0

次のように子を作成して追加します。

var el = document.createElement('div');
el.id='id';
document.body.appendChild(el);

ただし、幅を取得するためにこれで何をしたいのかよくわかりません。おそらく0が返されます。

于 2012-05-25T23:30:44.270 に答える