• 締切済み

onunload で XMLHttpRequest

ページを閉じたことをサーバへ伝えたいと思って、onunloadイベントで XMLHttpRequest により URLにアクセスしたいのですが、うまくいきません。 onunload の中から下記のような処理を行う関数を呼び出しています。 try{ var url = "http://xxxxxxx/unlock.php?no=99"; var xhr = XMLHttpRequestCreate(); //マルチブラウザ対応 xhr.open("GET", url); xhr.setRequestHeader("Content-Type", "text/plain"); xhr.send(null); }catch(e){ console.log(e); } xhr.status を見てみたら 0 になっていました。onunload でも、onbeforeunload でも send() を行ったあとに xhr.status が 0 になるようです。 画面上にテストボタンを置いて onclick から呼び出してみると、うまく動作します。 console.log を表示するとちゃんと表示されるので、onunload も onbeforeunload も 正しくセットされていると思います。 ブラウザは、Chrome と Firefox の2種類で試しましたが、同様でした。 やはりフォームが閉じるときは XMLHttpRequest は使えないのでしょうか? 何か回避する方法はないでしょうか?

  • haru44
  • お礼率68% (153/223)

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

非同期だといけません 同期を試してみてください

haru44
質問者

お礼

早速の回答ありがとうございます。 open("GET", url, false); とすることで同期になるとのことで試してみたのですが、 send(null); は実行されるようになりましたが、 エラーが返されます。 NetworkError: A network error occurred. というメッセージが得られるのですが、何が悪いのか わかりません。 非同期で処理していたときは open() の直後に終わっていて send() までいきませんでしたから、同期に変更したことの 効果はあったんじゃないかと思いますが、サーバに リクエストが届かない状況は変わりませんでした。。。

関連するQ&A

  • XHRのレスポンスがiOSでnullになる

    GETTING STARTED WITH WEB AUDIO API http://www.html5rocks.com/en/tutorials/webaudio/intro/ こちらのサイトを参考に var xhr = new XMLHttpRequest(); var loader = this; xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function() { loader.ctx.decodeAudioData(xhr.response, function(buffer) { loader.bufferList[key] = buffer; console.log(buffer); }, function(error) {console.log(error)} ); }; xhr.onerror = function() { console.log('XHR error'); }; try { xhr.send(); } catch(e) {}; こんな感じでオーディオデータを取得してるのですが、 キャッシュマニフェストでサイトをキャッシュすると iOS6にてxhr.responseがnullになってしまうっぽいです。 ちなみにPCのChromeで確認した際は問題なかったです。 結構調べたのですが憔悴してしまいました。。。 どなたか何か解決方法ご存知の方いらっしゃいませんでしょうか??

  • Google MapsのKMLをJSONで取得したい。

    Google MapsのKMLをJSONで取得したい。 Google Mapsで作成したマイマップのKMLを見るとURLが書かれています。 このURLの末尾を「&output=kml」→「&output=json」 と変更するとJSONで取得できると思うのですが、 実行するとstatus=0となっていまいます。 HTTPヘッダを見る限り200なので取得出来ているようなのですが・・・ なぜでしょうか?教えてください。 === var jsonUrl = 'url' var xhr = new XMLHttpRequest(); xhr.open("GET", jsonUrl, true); xhr.onreadystatechange = function() { if (xhr.readState ==4 && xhr.status == 200){ var jresult = document.getElementById("json_panel"); jresult.innerHTML += xhr.responseTEXT; } else { alert (xhr.statusTEXT); } } xhr.send();

  • XMLHttpRequestがApacheのaccess_logに残らない

    XMLHttpRequestの通信がApacheのaccess_logに記載されません。 var req = new XMLHttpRequest(); req.open('GET', url); req.send(null); だけでテストしてもだめです。しかしXMLHttpRequesの返答はちゃんとできていてステータスコードも正常です。ログに入らないだけです。 これはなぜでしょう。XMLHttpRequestとはそういうものなのでしょうか。 もしそうなら、アクセス数でページビューをカウントする場合、XMLHttpRequestで閲覧した人はページビューにまったく反映されないという事になりますよね

  • XMLHTTPRequestでstatusが0に

    2日程、色々と試したのですが、どうしても自分で解決できそうにないので お世話になりたいと思い質問させて頂きました。 XMLHttpRequestを使用し、サーバーと非同期通信を行っているのですが ChromeとFireFoxの場合、戻り値のstatusが0になり、サーバーからのレスポンスデータを 取得する事ができません。IEでは7 ~ 9まで正常に動作する事を確認しております。 (環境) クライアントOS:Windows7 Professinal サーバーOS:Windows7 Professinal Webサーバー:IIS7.5 ブラウザ:Google Chrome 16.0.912.77 m, FireFox 10.0.1 (クライアント側プログラム) function requestMain(param) {   // サーバー名はxxxにさせて頂きました。   var url = "http://xxx.xxx.xxx.xxx/app/xhr.cgi?" + param;   var obj = createHttpRequest();   obj.open("GET", url, true);   obj.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");   ojb.onreadystatechange = function()   {    if (obj.readyState==4)    {      alert(obj.status);       // ← ここが0に。IEだと200が返ってきます。      alert(obj.responseText);   // ← IEの場合予期したデータがきます。Chrome/FF                        // ともに空です。    }   }   httpoj.send(""); } function createHttpRequest() {   if(window.ActiveXObject)   {    try    {     return new ActiveXObject("Msxml2.XMLHTTP");    }    catch (e)    {     try     {       return new ActiveXObject("Microsoft.XMLHTTP");     }     catch (e2)     {      return null;     }   }  }  else if(window.XMLHttpRequest)  {   return new XMLHttpRequest();  } } (サーバー側) static void main(string[] args) {   string rtnStr = "HTTP/1.0 200 OK\n";   rtnStr += "<head>\n";   rtnStr += "Access-Control-Allow-Origin:*\n" // ← クロスドメイン対策???   rtnStr += "Content-Type: text/html; charset=UTF-8;\n;   rtnStr += "</head>\n\n";   rtnStr += "<body>test is</body>";   Console.WriteLine(rtnStr); } 試しに、prototype.jsのAjax.Requestを使用しても結果は同じでした。 後、プログラムでなく、ブラウザーのURL覧からCGIをコールするとtest isが表示されます。 ※ CGIはC#で書いています。ASP.NETがあるので意味がないのですが すみません。^^; 過去にも似たような質問をされた方がいらっしゃったのですが 結局クロスドメインの問題じゃない?とか回答がついてないとかで 答えがわかりませんでした。英語サイトにはそれなりに情報があるみたいですが 読めないのでよくわかりません ;_; (調べろと言われればそれまでなのですが。。。) 組み込み系や、C/S・スタンドアロンでのWindowsアプリはそれなりの経験を 持っているのですが、Web系は今回初めてで、やり始めて丁度10日になります。 ですので、トンチンカンなご質問をしているかもわかりませんが、 どうぞよろしくお願いいたします。 P.S 最近html, css, javascriptがお試し程度にわかり4、5ページ画面遷移した 簡単なクライアント側アプリを作れる程度です。

  • XMLHttpRequestのブラウザ対応

    JavaScriptで、あるURLの結果を取得しようと以下のようなスクリプトを組みました。 var xmlHttp = false; function loadText(){ xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", "http://hogehoge, true); xmlHttp.onreadystatechange = checkStatus; xmlHttp.send(null); } function checkStatus(){ if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ res = xmlHttp.responseText; alert(res); } } IE8では、結果が取得できたのですが、firefox4.0.1,Chromeでは取得できませんでした。 xmlHttp.status が0となってしまいました。 ただし、GET対象のURLをローカルサーバにすると、取得することができました。 firefox4.0.1,Chromeのブラウザの設定なのでしょうか?それともスクリプトの書き方に問題があるのでしょうか? すみませんが、教えてください。

  • XMLHttpRequestオブジェクトによるレスポンスを複数回受けるには?

    以下のようなコードでXMLHttpRequestを試しているのですが、 「レスポンスです。」と表示した後、 いったん違うページに遷移し、再度以下のコードを書いたページに遷移しても 「レスポンスです。」と表示されません。 var obj = new XMLHttpRequest(); obj.open("GET","/test.txt"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){   if(obj.readyState == 4){     alert(obj.responseText);   } } -------以下、test.txt-------- レスポンスです。 ----------------------------- ブラウザを閉じ、再びこのコードの書かれたページを表示すると「レスポンスです。」と表示されます。 ブラウザを閉じなくても、ページを表示する度に「レスポンスです。」と表示するにはどうすればよいのでしょうか?

  • 以下のスクリプトがVista×IE8、Firefox(現時点でわかって

    以下のスクリプトがVista×IE8、Firefox(現時点でわかっているところで)で、 想定と異なった動作をしてしまいます。 XP上であれば、特に問題なく動くのですが、Win7は手元にないので、わかりません。 しかし、原因が一向にわからず・・・。 ご教授いただけますと幸いです。 var xhr; function prefCheck(){   ~省略~ xhr = false; if(window.ActiveXObject) { try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } } else if(window.XMLHttpRequest) { xhr = new XMLHttpRequest(); xhr.overrideMimeType('text/xml'); } xhr.onreadystatechange=PrefCheck; xhr.open("GET","hogehoge.php, true); xhr.send(null); } function PrefCheck(){ if ((xhr.readyState == 4) && (xhr.status == 200)){ window.alert("hogehogehogehogehogehoge"); } }

  • Ajaxによる非同期通信のイベントリスナ

    JavaScriptで以下の関数を実行した場合、(1)の実行後関数を抜けるので、 (2)のイベントリスナは(1)の実行後も呼ばれることはあるのでしょうか。    function hoge(){     var xhr = new XMLHttpRequest();     xhr.open("GET","http://www.example.com/data.txt");     xhr.onreadystatechange = function(){ //(2)      if(xhr.readyState == 4 && xhr.status == 200){       $("#foo").html(xhr.responseText);      }     }     xhr.send(null); //(1)    } ローカル変数xhrは、関数を抜けたら変数とその領域が解放されるので、 XMLHttpRequestインスタンスも消滅する、そして、インスタンスが 消滅してしまうと、onreadystatechangeプロパティも消滅すると思っ たためです。 (2)が(1)の実行後も呼ばれるとしたら、どのような仕組になっていると 理解すればよいのでしょうか。

  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • CORSに引っかかってしまいます。

    post送信側のスクリプト javascript:(function(){ var data = { field1: 'value1', field2: 'value2', field3: 'value3' }; var xhr = new XMLHttpRequest(); xhr.open("POST", "スクリプトのurl", true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); })(); gas側のスクリプト // スクリプトのトリガーを設定する場合は、必要に応じてトリガーを追加することもできます。 function doPost(e) { var sheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID').getActiveSheet(); var data = JSON.parse(e.postData.contents); // データをスプレッドシートに書き込む sheet.appendRow([data.field1, data.field2, data.field3]); // 必要なフィールドに合わせて変更 return ContentService.createTextOutput('Success').setMimeType(ContentService.MimeType.TEXT); } スプレッドシートに書き込みたいのですがhttps://script.google.com/以外から実行すると書き込めません。どうすれば外部サイトから書き込めるでしょうか?

専門家に質問してみよう