fxでdocument.scripts対応となんか

fxでdocument.scripts対応

id:shogo4405:20070206:1170741017でfxは非対応なんだかんだといっていますがdocument.scriptsはdocument.getElementsByTagName('script')とニアリーイコールなので以下のコードを任意の場所に追加することでfx系でdocument.scriptsと似た役割をさせることが可能。

if(!document.scripts){
    document.scripts = document.getElementsByTagName('script');
};
サンプル
// foo.js
if(!document.scripts){
    document.scripts = document.getElementsByTagName('script');
};
alert(document.scripts[document.scripts.length-1].id);
<head>
<script></script>
<script id="foo" src="foo.js"></script> // alert(foo); 
<script></script>
</head>

ちょっと発見

色々と検証コードを書いた結果から、推測するとどうやらfxでは(他知らん)では、以下のようにhead要素に直書きしたコードではAを評価してBを評価してCを評価ではなくhead内部の直書きしているscript要素を収集してまとめて評価しているようである。
一方body要素では見つけたら逐一評価しているようである。あくまで仮説の領域だし。困るのは以下みたいに document.scripts.lengthを利用した場合のときくらい。
ただ、head要素でdocument.write(1);みたいに何か要素書き出すとそうでも無くなるしsrc属性で呼び出したものは正常にdocument.scripts.lengthが取得される。

<head>
<script id="A">
if(!document.scripts){
    document.scripts = document.getElementsByTagName('script');
};
alert(document.scripts.length); // 1
</script>
<script id="B">
alert(document.scripts.length); // 1
</script>
<script id="C">
alert(document.scripts.length); // 1 <head>要素の直書きは1になる。
</script>
</head>
<body>
<script id="A">
if(!document.scripts){
    document.scripts = document.getElementsByTagName('script');
};
alert(document.scripts.length); // 1
</script>
<script id="B">
alert(document.scripts.length); // 2
</script>
<script id="C">
alert(document.scripts.length); // 3
</script>
</body>