JavaScript内で外部ファイルを呼び出すと関数などが行き来しないのはなぜ?

[上に] [前に] [次に]
あがぺ [E-Mail] [HomePage] 2000/02/04(金) 01:44:51
JavaScript内で
document.write("<SCRIPT Language='JavaScript'
src="message-1.js'></SCRIPT>);
のようにして外部ファイルを呼び出しましたが、変数、引数、関数
などが呼び出しもとファイルと行き来しません。(外部ファイルで
定義したはずの関数が呼び出しもとで使用できません。)
なぜでしょうか。
個人的には、<SCRIPT Language="JavaScript"
src="message-1.js'></SCRIPT>タグが実行された段階で変数、引数
、関数などの設定が初期化されてしまうからでは?と思っていますが、
どうでしょう?(・・・でも<SCRIPT>タグを入れ子にしなければ普通に行き来するんだけどなあ?)
このような仕組みにしたのは、表示するメッセージが多くなりすぎた
ため分割して必要な部分だけダウンロードしたいと思ったからです。
ぜひ理由をお教えください。

あがぺ [E-Mail] 2000/02/04(金) 11:48:06
・・・訂正:
document.write("<SCRIPT Language='JavaScript'
src="message-1.js'></SCRIPT>);
は、
document.write("<SCRIPT Language='JavaScript'
src='message-1.js'></SCRIPT>");
の間違いです。訂正いたします。
(実際は document.write("<" + "SCRIPTLanguage='JavaScript'" + " src='special-message.js'" + ">" + "<" + "/SCRIPT" + ">"); としています。どこかで、”<”は切り離さないと誤動作する可能性がある、と聞いたものですから。今回の件とは関係ないと思いますけど。)

ただの思い付き 2000/02/05(土) 03:01:14
<SCRIPT Language="JavaScript">
<!--
てきとーな文
//-->
</SCRIPT>
<SCRIPT Language="JavaScript" src="hagu.js">
</SCRIPT>
<SCRIPT Language="JavaScript">
<!--
これまたてきとーな文
//-->
</SCRIPT>

こんなんでいかが?
document.write()だとドリキャスは只、
<SCRIPT Language="JavaScript" src="hagu.js">
</SCRIPT>
ってかいただけのページになるぞ。

あがぺ [E-Mail] 2000/02/05(土) 12:01:48
[[解決]]
良くわかりませんが、document.write()で書いたHTMLは実行する順番が普通と違う、と言うことでしょうか。組み立て方をもう一度考えてみます。ありがとうございました。

ドリキャスの場合の不都合は、<SCRIPT Language="JavaScript" src="*.js"></SCRIPT>タグ自信(JavaScript)は対応しているが、document.write()で書いても実行しない、ということですね?
ブラウザによってずいぶん対応が違うんですね・・・。やれやれ、こんなことは言われるまで気づかないですよねェ。質問して良かった!
今回はどうもありがとうございました。

憶測くん。 2000/02/06(日) 03:28:30
JavaScriptは性質上、必ずしも上から下に向かって実行されるとは限りません。
例として
function test()
function init(test())
というコードがあると、これは下から上に向かって辿らなければなりません。

そこで、ブラウザはスクリプトを一旦全部取り込み、初期化したあとで、
呼び出し順に辿っていると考えることが出来ます。
すると、
document.write("<SCRIPT Language='JavaScript' src='message-1.js'></SCRIPT>");
というコードは、取り込み段階では実行されるわけではないので、
message-1.js内の関数を使って初期化できません。

ブラウザのレイアウトエンジンはHTMLコードの書き換えに動的に対応します。
たとえば
HTML内に<img>があればとりあえず枠を表示。
画像の縦横幅が分かったらレイアウトの見直し。
画像の実サイズの分だけ枠を拡大して画像を表示。
押しやられたドキュメントを再配置。
というように上から順番に手当たり次第コードを解釈し、途中で間違いに気づいたら
戻って配置をやり直すことが出来ます。

一方スクリプトエンジンは上記の理由から
スクリプトの実行までに、決まった順番があると思われます。

上手く表現できていません。
要するにmessage-1.jsを呼び出したいタイミングで、
まだ読み込まれていないということでは無いでしょうか?

shin' 2000/02/06(日) 06:34:49
document.write("<script src=\"hogehoge.js\">");
はNetscape3.0ではハングアップしました。
動的に読み込むJavaScriptを書くことはできないと
考えてよいのではないでしょうか。

あがぺ [E-Mail] 2000/02/06(日) 13:18:42
憶測くん。さん>
>ブラウザはスクリプトを一旦全部取り込み、初期化したあとで、
>呼び出し順に辿っていると考えることが出来ます。
>要するにmessage-1.jsを呼び出したいタイミングで、
>まだ読み込まれていないということでは無いでしょうか?
 ・・・「初期化」というのがどういう事を表しているのか分かりませんが、外部スクリプトをダウンロードする(内容を解釈する)より前に、そこで定義されるはずだった関数などを使おうとするから、不都合が起こる、ということですか?なるほど、納得しました。しかし、そんな目に見えないようなところの仕組みがわかるなんて、すごいと思います。(もしかしてプログラマーさんとか? ('o';) )
>shin'さん
やっぱり、無理矢理なことをしてはいけないですねェ。JavaScriptって思ったより制約が多いですね・・・。(しかしブラウザをハングアップさせるホームページというのも凄まじい・・・(汗”))
>みなさん
しょうがないので、外部Script制はやめてHTMLファイル自体を分けて対処することにします。
もしくはほかの言語を使ってみることも考えます。parlとやらはcgiが使えない(と書いてあった)サーバーでも動きますか?(っていうかファイルの操作は出来ますか?)よろしければ教えてください。

憶測くん。 2000/02/07(月) 00:53:35
私は直接コードを見たことが無いので、あくまで憶測です。
なお、プログラマではありません。(^-^;

>・・・「初期化」というのがどういう事を表しているのか分かりませんが
「初期化」という言葉の使い方が間違っていたようですね。
すみませんでした。私が考えていたスクリプトの実行手順は、

(1)とりあえずスクリプト部分を全部取り込む。
(2)どの関数(値)がどの関数に呼び出されているのかを解析
(3)実行順を決定
(4)実行

というものです。ここで初期化はスクリプト実行前の
前準備ということで(2)と(3)を指していました。
エラーになるのは(2)を行うときに(4)で初めて読み込まれる
関数を使っていることが原因と考えました。

横槍挟んで話の腰を折ってしまったかもしれませんね。
では、Parl頑張ってください。

あがぺ [E-Mail] 2000/02/08(火) 11:34:44
>憶測くんさん
>私が考えていたスクリプトの実行手順は、
>
>(1)とりあえずスクリプト部分を全部取り込む。
>(2)どの関数(値)がどの関数に呼び出されているのかを解析
>(3)実行順を決定
>(4)実行
どうやらそのような流れのようですね。
>横槍挟んで話の腰を折ってしまったかもしれませんね。
いえいえ、そんなことありませんよ。
>では、Parl頑張ってください。
パソコンはやればやるほどやらなくてはならない/やりたい事が出てくるので大変です。でもそこがおもしろい。

どうも今回はありがとうございました。理想のホームページを作るべくがんばっていきたいと思います。では。

[上に] [前に] [次に]