WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:外部.jsファイルからの読み込みについて

さとし [WriteDate : Thu Jun 28 11:23:58 2001]

はじめまして。
お聞きしたいのですが、例えば
data[1]
data[2]
data[3]
というdata.jsファイルがあって、そこからデータを引き出したいという場合、winでは
head内に
<script language="JavaScript">
<!--
data = new Array();
document.write('<SCRIPT Language="JavaScript" SRC="data.js"></SCRIPT>');
// -->
</SCRIPT>
ですが、MACでは表示されません・・・

Macでの外部.js(プログラム)読み込みは可能
(head内に同様)
<script language="JavaScript" src="data.js"></script>
とのことですが、外部.js(冒頭に記述したようなデータファイル)を読み込むにはどうすればいいのでしょうか。
ご存知の方、教えてください。


じゃすみん [WriteDate : Thu Jun 28 13:30:02 2001]

Mac、Win関係無しで
data = new Array();をdata.jsの1行目に移し、
<script language="JavaScript" src="data.js"></script>だけ記述。

もしくは
<script language="JavaScript">
<!--
 data = new Array();
//-->
</script>
<script language="JavaScript" src="data.js"></script>
とか。


ひよこ [MAIL] [URL] [WriteDate : Thu Jun 28 16:19:30 2001]

じゃすみんさんご指摘のように最初にグローバル変数として宣言しておけば
後で読み込まれるスクリプトでは全て有効です。

> document.write('<SCRIPT Language="JavaScript" SRC="data.js"></SCRIPT>');

たしかwriteで書き出すときは</SCRIPT>はそのままではダメだったような・・・

・・・ </S"+"CRIPT>"
の様にそこでスクリプトが終了していると見なされないように分割したと思います。


おーなーしぇふ [WriteDate : Thu Jun 28 17:43:32 2001]

>たしかwriteで書き出すときは</SCRIPT>はそのままではダメだったような・・・
『Another HTML-lint 結果の解説』を見ると、「<SCRIPT>〜</SCRIPT> 内に `</` を直接書くことはできません。」というのがありました。

http://openlab.ring.gr.jp/k16/htmllint/explain.html
※131番目です。

実際にはエラーになるケースは少ないようですが、それでもdocument.write()ではエラーになることがあるようです。

ただし、具体的にどのOS・どのブラウザというのは、私は知りませんが(^^;)
※ちなみに、Macのどのブラウザでしょうか……?


おーなーしぇふ [WriteDate : Thu Jun 28 18:02:09 2001]

追記です:
先の私の書込、ひよこさんの例が間違いであると指摘するつもりではなかったので、念のため(^^;)

実際には対処法として:

・…… + "</S" + "CRIPT>"
・…… + "</" + "CRIPT>"

など、やはり</SCRIPT>を分割する例が多いようです。


おーなーしぇふ [WriteDate : Thu Jun 28 18:04:23 2001]

訂正:
"</" + "CRIPT>" → "</" + "SCRIPT>"

です。


さとし [WriteDate : Thu Jun 28 21:46:21 2001]

みなさん、ありがとうございました。
ようやくエラーが出なくなりました。
記述方法はじゃすみんさんの2つ目の例と
分割してプラスする方法の両方とも成功です。
ちなみにOSはOS9、ブラウザはIE4.5です。
そのおかげで、今度は文字化けしてしまうというトラブルに悩まされていますが・・・
この問題も煮詰まってしまったら、アドバイスお願いします(^^;


バギンズ [WriteDate : Fri Jun 29 01:44:04 2001]

外部JavaScriptファイルに直接漢字を書くと文字化けしてしまっていたと思います。(ブラウザによるかな)

たしかマイクロソフトのサイトでも、一旦escapeしたコードを用意し、unescapeして表示していた気がします。
この辺の事は過去ログ見るとわかると思いますので探してみてください。

ブラウザの種類ごとに別に用意しなければいけないのがちょっと面倒かも...


yuu [MAIL] [URL] [WriteDate : Fri Jun 29 02:42:33 2001]

>"</" + "SCRIPT>"

どうせ分割するなら '<'+'/SCRIPT>' だと思うが。
まあいいけど。

>外部JavaScriptファイルに直接漢字を書くと文字化けしてしまっていたと思います。(ブラウザによるかな)

Mac IE 4.0 は外部JSファイルをUTF-8決め打ちにしているので、まあその辺考えてやりましょうや、ということで。escape/unescapeするのがやりやすいかもしれないが、何を書いているんだかわからなくなったりすることも考えると、内側(呼び出し側のHTML)にグローバル変数として文字列を宣言しておいたほうがメンテナンシビリティは高げ。
つーか Mac IE 4.5 もなるのか? いずれにしても内側で変数を宣言しとけば大丈夫。


さとし [WriteDate : Fri Jun 29 11:19:04 2001]

グローバル変数を宣言するというのは、(上記例でいうと)
var data
をHTML内に記述するってことですか?

escapeは、.jsファイル内でLatin-1コードへ変換し、それをHTML内でunescapeするということでしょうか・・・?

見当違いのカキコしていたらすみません。
良かったらレスお願いします。


さとし [WriteDate : Fri Jun 29 11:45:03 2001]

グローバル変数を宣言するというのは、(上記例でいうと)
var data
をHTML内に記述するってことですか?

escapeは、.jsファイル内でLatin-1コードへ変換し、それをHTML内でunescapeするということでしょうか・・・?

見当違いのカキコしていたらすみません。
良かったらレスお願いします。


ひよこ [MAIL] [URL] [WriteDate : Fri Jun 29 13:55:12 2001]

> グローバル変数を宣言するというのは、(上記例でいうと)
> var data
> をHTML内に記述するってことですか?
関数(function)外で宣言された変数はそのページ内で全てグローバル変数になります。
その場合varは省略も出来ます。
ですから実際の処理の前であれば何処に置いても構いません(外部JSでも良いということ)
関数内ではvarを使用するとローカル変数となり、varを省略した場合
ブラウザによって有効範囲の解釈が違ってきます。
もしローカル変数を明示するならvarを使用した方が間違いないでしょう。


さとし [WriteDate : Fri Jun 29 15:33:18 2001]

グローバル変数を宣言するというのは、(上記例でいうと)
var data
をHTML内に記述するってことですか?

escapeは、.jsファイル内でLatin-1コードへ変換し、それをHTML内でunescapeするということでしょうか・・・?

見当違いのカキコしていたらすみません。
良かったらレスお願いします。


さとし [WriteDate : Fri Jun 29 15:33:25 2001]

グローバル変数を宣言するというのは、(上記例でいうと)
var data
をHTML内に記述するってことですか?

escapeは、.jsファイル内でLatin-1コードへ変換し、それをHTML内でunescapeするということでしょうか・・・?

見当違いのカキコしていたらすみません。
良かったらレスお願いします。


さとし [WriteDate : Fri Jun 29 15:35:58 2001]

あれ?
「更新」押したら同じ記事が投稿されてしまった!
すみません・・・


さとし [WriteDate : Fri Jun 29 17:33:06 2001]

過去ログ見てきましたが、ちょっと気になるものが・・・
おーなーしぇふさんのレス、
http://www.parkcity.ne.jp/~chaichan/qanda/qa1102.htm
この、「onClick()だと文字化けしない」
というもの。どうしてしないんでしょうね。

それと、グローバル変数宣言しても結果が変わりませんでした。
escapeも同じく・・・
あと、どこかでescapeはIEとNNで変換の仕方が違う、と書いてありました。
それが本当なら、使えないのでは・・?
また調べまわってきます。


おーなーしぇふ [WriteDate : Sun Jul 1 00:19:26 2001]

>この、「onClick()だと文字化けしない」
>というもの。どうしてしないんでしょうね。
Mac版IE4系のいわゆる「バグ」のようです。

■参考:ブラウザ別バグリスト
http://www.shiojiri.ne.jp/~openspc/JavaScript/bug/index.html

ここのInternet Explorer 4.xに関するページの[8]に説明があります。
※って、先の過去ログページからもリンクありますが(^^;)


で、今回の「Mac版IE4系では、外部jsファイルに記述した日本語が文字化けする問題」については同様に[23]に説明があります。

これによれば:
『仕様です。Mac版IE4.01/4.5ではShift-JIS,JISなど旧来の日本語コードは使用できません。UTF-8 (Unicode)にして保存すれば正しく表示されます。』

つまり、Mac版IE4系では外部jsファイルの文字コードが「UTF-8固定」となっているため、外部jsファイルをShift-JISで保存している場合には、Mac版IE4系では日本語部分が正しく表示されないというわけです。
※ちなみに半角英数字などのいわゆるASCII文字については互換があるので、、ASCIIだけで記述されている場合はShift-JISで保存された外部jsファイルでも、スクリプトエラーがでず、また文字化けせずに表示されるはずです。

で、外部jsファイルをUTF-8 (Unicode)にして保存すると、Mac版IE4系では問題が解決されますが、今度は他のブラウザで文字化けが生じるケースがあるとか……(^^;)


そこで対応策としては3つ:
1. UTF-8は ASCII に対して上位互換なので、ASCIIだけで記述する。具体的には、日本語該当部分についてはすべて下記のように「Unicode のエスケープシーケンス」及び「URL エンコードをunescapeしたもの」を併記しておく(なお、この場合の保存はShift-JISとなる)。

例)alert("あいうえお")の場合
var UTFesc = "\u3042";
if(UTFesc.length == 1) alert("\u3042\u3044\u3046\u3048\u304A")
else alert(unescape("%82%A0%82%A2%82%A4%82%A6%82%A8"))

参考:http://ml.fureai.or.jp/~js-ml/20000904/4169.html

※UTF-8対応のブラウザの場合は「UTFesc = あ」と(1文字と)解釈するため、UTFesc.length==1の分岐をたどり、非対応のブラウザの場合は一文字とは解釈されずに従来のURL エンコードの分岐をたどるわけです。

※ちなみに文字列の変換については以下のページ参照:
http://macosx2.ncs.gr.jp/JavaScript/ref/convert/escape.htm
IE4以降ではUnicode、NetscapeではURL エンコードで変換されるという違いがあります。


2. Shift_JIS等の従来の日本語コードで保存した外部jsファイルと、Mac版IE4系用にUTF-8で保存した外部jsファイルを用意し、読み込むファイルを分岐する。

・default.js => Shift-JISで保存
・mac4.js => UTF-8で保存

例)
<SCRIPT type="text/javascript">
<!--
os      = getOSType();
browser = getBrowserName();
version = getBrowserVersion();

var s;
s = "<SCRIPT type='text/javascript' src='" ;
if(
    ( os == "MacOS" )  &&
    ( browser == "Explorer" ) &&
    ( (version >= 4) && (version < 5) )
){
    s = s + "mac4.js" ;
} else {
    s = s + "default.js" ;
}
s = s + "'>" + "<\/" + "SCRIPT>" ;
document.write( s );
//-->
</SCRIPT>

※関数 getOSType(), getBrowserName(), getBrowserVersion()については記述を省略。以下の「環境 (env.js) 」を参照のこと。
http://www.shiojiri.ne.jp/~openspc/js/index.html


3.変数を呼び出すHTMLにグローバルなものとして用意する
外部jsファイル内で使用する日本語が変数部分のみならば有効かも?
但し、変数とは別にalertやdocument.writeに直接日本語を記述している場合はやはり文字化けします。


今回のケースでは、
document.write('<SCRIPT Language="JavaScript" SRC="data.js"></SCRIPT>');
とされているようなので、2.の方法がてっとり早いかもしれませんね。

以上です。


さとし [WriteDate : Mon Jul 2 09:58:06 2001]

とてもわかりやすい回答をありがとうございます。

ちなみに、変数のみの日本語ですから、3が適しているのかもしれませんが、先日試したときはうまくいかなかったので、2を試してみようと思います。

とても感謝しています。


さとし [WriteDate : Thu Jul 12 19:01:47 2001]

依然解決していないのですが・・・
外部jsファイルで

mes = escape("か");

とし、HTMLファイルで
unescapeしたところ、Win IEでは普通に「か」と表示されるのに対しMac IEでは「ッ?ッ?」と表示されてしまいます。

試しにunescapeせずに表示させたところ、win IEでは
%u304B
となり、Mac IEでは
%uFF82%uFFA9
となっています。
escapeされた文字列が違うのはなぜでしょうか。
これさえ同一だったら解決するのに・・・(T T)
教えてください。。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World