人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

XMLHttpRequestによる非同期通信がうまくできません

javascriptとXMLHttpRequestを使用して、ローカルで非同期通信を行いたい(file://c:/...)のですが、うまく動作させることができません。
OSはWindowsXp Pro SP3で、今日時点までのWindowsUpdate適用済みです。

ブラウザとその動作結果は以下の通りです。
-----------------------------------
Chrome 16.0.912.77, Opera11.61
・1回目のalert結果
「エラー0」
・2回目のalert結果
alert表示されず

firefox9.0.1, IE8.0.6001.18702
・1回目のalert結果
「エラー0」
・2回目のalert結果
「エラー0」
-----------------------------------
また、ソースの抜粋は、コメントにつけます。
よろしくお願いします。

●質問者: mamekko
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● うぃんど
●200ポイント ベストアンサー

過去質問でjQuery使っているので、
今回もjQuery使えば楽だと思いますが・・・
http://hisasann.com/housetect/2008/06/javascript_4.html
jQueryは使わないということなら、
こちらの記事を参照して書き直してみると良いでしょう
http://hisasann.com/housetect/2008/08/jqueryieajax.html

別の話題ですが、こんなのもあります
http://ascii.jp/elem/000/000/559/559105/


mamekkoさんのコメント
回答ありがとうございました。 示して下さったページを読んで、jQueryのgetメソッドで成功しました。 ローカルに関してはIE,FireFoxのみ成功で、サーバにupload後は、OperaもChromeも成功しました。 有り難うございました。

2 ● oil999
●30ポイント

ローカルでhttpサーバは動作しているでしょうか?
ご確認ください。

IISでしょうか、それともApacheでしょうか?
種類とバージョンをお知らせください。


mamekkoさんのコメント
すみません。No.1の方の回答で、事足りましたので・・。 ちなみに、WindowsXp付属のIIS5では、XMLHttpRequest自体エラーでした。 WindowsVista付属のIIS7,及びIIS6互換モードではWeb.configが必要でした。(当然と言えば当然なのですが)

3 ● rikuba
●40ポイント

OperaではXMLHttpRequestでローカルファイルにアクセスする方法はなさそうです。
Chromeでは、起動オプションに「--allow-file-access-from-files」を付ければ可能です。
ローカルファイスにアクセスした場合のステータスコードは200ではなく0になります。

ご提示のコードでは、XMLHttpRequestによるアクセスが完了しないままにそのXMLHttpRequestを次のアクセスのために使いまわしてしまっています。非同期通信なので、1度目のアクセスが完了しないうちに2度目のリクエスト送信に入ってしまう可能性があります。
1つのXMLHttpRequestオブジェクトを使いまわす方法もありますが、複数のXMLHttpRequestオブジェクトを使う方が簡単です。

簡単な例を用意しました。

function GetXMLHttpRequest() {
 try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch (err) {}
 try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch (err) {}
 if (typeof XMLHttpRequest !== 'undefined') {
 return new XMLHttpRequest;
 }
 return null;
}

function AsyncGetRequest(url, onload) {
 var xhr = GetXMLHttpRequest();
 if (!xhr) {
 alert('XMLHttpRequest is not supported');
 return;
 }
 xhr.open('GET', url, true);
 xhr.onreadystatechange = function () {
 if (xhr.readyState !== 4) return;
 if ({0: true, 200: true, 201: true}[xhr.status]) {
 onload(xhr.responseText);
 } else {
 alert('XMLHttpRequest error status: ' + xhr.status);
 }
 xhr = onload = null;
 };
 xhr.send(null);
}

function OnReady(text) {
 alert(text);
}

function NonSyncReadData() {
 AsyncGetRequest('a.html', OnReady);
 AsyncGetRequest('b.html', OnReady);
}

可能ならローカルにサーバ環境を用意することをおすすめします


mamekkoさんのコメント
ソースまで書いて頂き有り難うございました。 今回は、jQueryにひかれてしまいました。

4 ● Cherenkov
●30ポイント

ローカルサーバを立てずにローカルファイルを読み込むには制限があります。

chromeで「Origin null is not allowed by Access-Control-Allow-Origin.」がでる場合は、起動オプションの「--allow-file-access-from-files」。


firefoxはアドレスバーに
about:config と打ち込んでEnter。
security.fileuri.strict_origin_policy
の値をfalseにすればローカルでもajaxのファイル読み込みができるようになると思います。


jquery + colorboxに関する質問です。 colorboxというモジュール.. - 人力検索はてな


mamekkoさんのコメント
これは、WEBからローカルファイルにアクセスできると言うことでしょうか? 完全に裏技ですね。ありがとうございました。

Cherenkovさんのコメント
webじゃなくてローカル環境だけだと思いますよ

5 ● a-kuma3
●0ポイント

お話は、ほぼ収束した感じですかね。
XMLHttpRequest っちゅうくらいなので、
http: じゃない file: なんかで、同じ動作を期待すんなよ、ってことでしょうか。

Firefox だと、ドキュメントに file プロトコルもサポートするぜ、とは書いてあるんですけれど。
https://developer.mozilla.org/ja/XMLHttpRequest

はてなグループの方で、こんな書き込みを見つけたので、参考まで。
http://subtech.g.hatena.ne.jp/mala/20110425/1303730089

file プロトコルをサポートしてる(Firefox)とは言っても、自由に好きなところを読みに行っちゃいけないよね、というのは、当たり前と言えば、当たり前の話。


mamekkoさんのコメント
実現したかったのは、WEB上でのやりとりです。それをローカルでテストしているときにどうにかできないのかなと思い、質問しました。 文字でのコミュニケーションは難しいのは承知ですが、書き方をもう少し柔らかにして頂けませんか? 文面そのものを読んだとき、かなり不快感でしたから。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ