• 締切済み

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で確認した際は問題なかったです。 結構調べたのですが憔悴してしまいました。。。 どなたか何か解決方法ご存知の方いらっしゃいませんでしょうか??

みんなの回答

noname#177743
noname#177743
回答No.2

あ、キャッシュしないと正常に動くのですね。だとすると全然関係ないかもしれません。すみません。

noname#177743
noname#177743
回答No.1

onloadイベント時にresponseで取得するっていうのは、XMLHttpRequest level2からサポートされている手法です。iPhoneのSafariでまだ対応してないってことはないでしょうか? onloadを使わず、従来のonreadystatechangeを利用した形に書きなおしてみてはどうでしょう。また、responseTypeとresponseも使わず、responseTextなどからデータを切り分けるようにします。要するに、XMLHttpRequest level2以前の書き方に戻すわけですね。そちらのほうが確実だと思います。

poyon8989
質問者

補足

一応キャッシュから読まない時は問題なくデータが入ってる状態なのですが、、、。が、とりあえず帰ったら試してみます!ありがとうございます!

関連するQ&A

  • 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
  • 配列からNULL以外のキーを取得したいのですが……

    配列からNULL以外のキーを取得したいです。 [0, 3]を期待しているのに、[0, 3: 3] で返ってきます。 なんででしょうか? function test(data) {  var result = [];  for (var i = 0, l = data.length; i < l; i++) {   if(data[i] !== null){    result[i] = i;   }  }  return result; } var data = ["1", null, null, "5"]; var last = test(data); console.log(last); ・console.logだから? ・もしそうなら、どうして[ 0: 1, 3: 3] ではないのでしょうか?

  • canvasで作成した画像をperlでアップロード

    恐れ入ります。 function upImg() { var base64 = board1.toDataURL('image/png'); var request = { url: 'https:~canvas.cgi', method: 'POST', params: { image: base64.replace(/^.*,/, '') }, success: function (response) { console.log(response.responseText); } }; Ext.Ajax.request(request); } として、perlで送信された画像データを受け取ってサーバーの任意のディレクトリに保存をしたいのですが、方法が分かりません。 perl側では、単純に open(OUT, ">./upload/gazouURL"); binmode(OUT); while(read($fileName, $buffer, 1024)) { print OUT $buffer; } close(OUT); としています。$fileNameとして受け取るパラメータはjavascriptからどのように送信されているのでしょうか。ご教授いただけたらありがたいです。よろしくお願いいたします。

  • 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 は使えないのでしょうか? 何か回避する方法はないでしょうか?

  • this.ctx is undefined

    皆様のお知恵を拝借いたしたく。 JavaScriptのCANVASでアニメーションを表示したく、 setIntervalで1秒にして、絵を描こうとしたところです。 ところが、以下のプログラムを実施しても、 1秒ごとに、 "ReferenceError: this.ctx is not defined" というエラーが表示されます。エラーの行は下から3行目です。 ですが、一応「テストです」という文字は表示されます。 なぜこのエラーがでるかがわからず・・・・ アドバイスいただけないでしょうか。よろしくおねがいします。 ---------------------------- onload = function() { var layer1 = document.getElementById('layer1'); if ( ! layer1 || ! layer1.getContext ) { return false; } var lay1ctx = layer1.getContext('2d'); setInterval(drawAnime, 1000); drawAnime(layer1, lay1ctx); }; function drawAnime(layer1, lay1ctx){ var SSESocArc = new SocArc(lay1ctx); SSESocArc.drawArc(50); } var SocArc = function (ctx){ this.ctx = ctx; } SocArc.prototype.drawArc = function(){ this.ctx.font = "20px 'Ariel bold'"; ← エラーはココ this.ctx.fillText("テストです", 100, 100); }

  • 最後に()が付いていない内側の関数を外から呼ぶ方法

    下記状態の時、obj内容を一切変更することなく、console.log("a")を実行することは出来ない、という理解で合っているでしょうか? ・最後に()演算子がないので、内側のgoo関数を実行することが出来ない ・外側のportalで、内側のgoo関数を呼び出していれば実行できるがその記述もない この場合、gooのvarは全く意味がない? var obj = {  portal : function() {   var goo = function(){    console.log("a");   }  } } var obj = {  portal : function() {   goo = function(){    console.log("a");   }  } } ・obj.portal().goo() … × ・(obj.portal()).goo() … ×

  • messagesにerror sending response: host unreachable

    現在RedHadLinux8.0でBIND 9.2.1 を使用しているのですが。 今朝ネットに繋がらなくなってしまったため、/var/log/messagesを 確認したところ named[738]: client 200.226.138.13#13522: error sending response: host unreachable named[738]: client 193.197.168.39#49422: error sending response: host unreachable 上記のようなログが大量に発生していました、とりあえず、BIND再起動 したらネットには繋がるようになったんですが、何が原因で このログのような状況が発生したのか、調べるにはどうしたらよいでしょうか、アドバイスいただけないでしょうか。

  • 関数の引数とグローバル変数について

    javascript初心者です。 どうしても分からないことがあるので質問させて頂きます。 グローバル変数の値を関数で処理して増やしコンソールログに表示していく、 というようなソースがあるとします。(以下) //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 var afunc = function(){   a++;   console.log(a); } var bfunc = function(){   b++;   console.log(b); } var cfunc = function(){   c++;   console.log(c); //onclickなどで呼び出す関数 function test1(){   var aplus = new afunc(); } function test2(){   var aplus = new bfunc(); } function test3(){   var aplus = new cfunc(); } グローバル変数や関数などが3つと数が少ないならこれでもいいかも知れませんが、 これが数十個とかに増えると、ソースの量もかなり多くなり 管理も大変になると思い簡略化させたいと考えました。 そこで以下のように変えてみたのですが、 加算がうまくいきません。 //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 vvar xxfunc = function(xx){   this.xx = xx;   this.show = function() {     this.xx++;     console.log(this.xx);   } } //onclickなどで呼び出す関数 function test1(){   var aplus = new xxfunc(a);   aplus.show(); } function test2(){   var aplus = new xxfunc(b);   aplus.show(); } function test3(){   var aplus = new xxfunc(c);   aplus.show(); } もしかすると、関数の引数にはグローバル変数を指定することができないのでしょうか? 何かうまいやり方はあるでしょうか? プログラミング自体が勉強し始めたばかりなので、 おかしなソースの書き方をしているかもしれませんのが、 ご教授、よろしくお願いいたします。

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • Javascript について質問です

    var tired=true; var bored=false; var nap = function() { if(tired || bored){ console.log("OK"); } else{ console.log("else"); } }; 上記のコードを書いた際、下記の実行結果となり、OKが表示されません。 どなたか原因が分かる方がおりましたら、教えてください。 else