勝手にトラブルシューティング

技術系ネタはumitanuki::quartetに書くことにしてるけど、たまにはこっちに書いてみよう。

親子丼セット食べたら眠くなってきたので仕事放棄でネットみてたら、

一晩で覚えるjQueryの逆引き基礎サンプル7つ*ホームページを作る人のネタ帳

追記:ほんとすいませんローカルで動作確認したところ動くのですが、オンラインではfirefoxしか動作確認せずに公開。
IE7では上の4つが動きません。
いくつか確認したのですが、どうしてもIE7JavaScriptエラー。ダメすぎる自分・・・。

追記2:まいりました。他のサイトの記述を見てもミスが見つかりません。言語問題でしょうか・・・アクティブXでしょうか・・・。なぜか動きません。どなたか万が一わかる方がいらっしゃいましたら教えていただきたいと思います。どうぞよろしくお願いします。

というので、練習問題としてやってみた。

IE7で実行すると、確かに動かない。手元ではScript Editorが入っているので

システムエラー -1072896658

というダイアログが出るのみ。

最初は、jqueryが原因かな?と思い、ソースを読む。
エラーの箇所は、ここ

// jquery-1.2.3 line#2451
self.each( callback, [res.responseText, status, res] );

問題のスクリプトはminifiedされているので、

setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);

こんな感じになっているけど、setTimeoutっているんかな?と思い、削除。が、関係なし。これはおそらく、jqueryのバージョンの違いですね。問題のスクリプトは、1.2.1だから。

自分のサーバにコピーすると、動く。コメントにも

ダウンロードしたものを試しに自分サーバーにアップしたら正常に見れましたよ。
サーバーの言語の違いかな?

なんてあるので、サーバサイドだろうとアタリをつける。

use strict;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://e0166.com/jq/sample01/load.html');
my $res = $ua->request($req);

open(OUT, ">out.html") or die;
print OUT $res->as_string;
close(OUT);

とかなんとか、適当なperlを書いてヘッダを確認。

HTTP/1.1 200 OK
Connection: close
Date: Fri, 18 Apr 2008 05:50:11 GMT
Accept-Ranges: bytes
ETag: "38a3fe-40-606c1340"
Server: Apache
Content-Length: 64
Content-Type: text/html; charset=none
Last-Modified: Thu, 17 Apr 2008 15:35:01 GMT
Client-Date: Fri, 18 Apr 2008 05:50:13 GMT
Client-Peer: 202.215.7.107:80
Client-Response-Num: 1

<br>
load.htmlが呼び出されました。<br>
<br>
<br>
<br>

自分サーバの場合。

HTTP/1.1 200 OK
Connection: close
Date: Fri, 18 Apr 2008 05:51:53 GMT
Accept-Ranges: bytes
ETag: "6b1a9a-31-48082d87"
Server: Apache/1.3.39 (Unix)
Content-Length: 64
Content-Type: text/html
Last-Modified: Fri, 18 Apr 2008 05:11:35 GMT
Client-Date: Fri, 18 Apr 2008 05:51:53 GMT
Client-Peer: 219.94.129.227:80
Client-Response-Num: 1

<br>
load.htmlが呼び出されました。<br>
<br>
<br>
<br>

charset=noneって聞いたことないけど。

ためしにcharset=noneなCGIを書いてみる。

#!/usr/bin/perl --

print "Content-type: text/html; charset=none\n\n";
print <<_HTML;
<button>button</button>
_HTML

chmod 755 load.cgi

/* js/s_jq.js */
$(document).ready(function (){
// $("#load1").load("./load.html");
$("#load1").load("./load.cgi"); });

すると、見事再現。
というわけで犯人は、サーバの吐くHTTPヘッダのcharset=noneである、ということになりました。

うん、昼の眠気覚ましにはちょうどよい算数ドリルみたいなかんじ。

「charset=none xmlhttp」とかでググると、とか出てくる。結構既知なのねん。

このぐらいの難易度のトラブルシューティングドリルがあって、小学生の算数ドリルみたいにサクサク解いていくと力が付く、みたいな問題集があると、世の中幸せになれるのになあ。