以下のソースを使って、タイムアウト処理などを実装している

のですが、まず、タイムアウト処理をさせると
JSONPManager.request('http://...',{
success : function(o){alert('success');},
failed : function(o){alert('failure');},
timeout : 5000
});
javascriptにエラーが表示されます。
JSONPManager.b***** call undfineかな?
これを消すにはどうしたらいいでしょうか?

http://e6sc8e.jugem.cc/?eid=324

さらに、今、alertしている部分に
別のfunctionを呼ぶようにして、innerHTMLをしたいのですが
画面が消えてしまいます。

JSONPManager.request('http://...',{
success : function(o){testAA(o);},
failed : function(o){testBB(o);},
timeout : 5000
});

って感じで、戻り値をtestAAに渡したいです。
どうしたらいいのでしょうか?

あまり、具体的にかけずにすいません。

回答の条件
  • 1人5回まで
  • 登録:2009/06/02 00:49:19
  • 終了:2009/06/04 12:12:14

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/06/02 03:55:17

ポイント60pt

JavaScriptなので、ブラウザ依存はありますが、以下の感じで、IE7、FireFox 3.0.5、Chromeでは動作しました。


まず、一箇所元のプログラムにバグがあります。

32行目付近の

var script = d.createElement('script');

は、

var script = this.d.createElement('script');

が正しいです。


これで多分動作すると思います。

手元では、こんか感じで動作確認させました。

json.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script type="text/javascript" src="./JSONPManager.js"></script>
    <script type="text/javascript">
//<![CDATA[
function doJob()
{
	  var callback = {
	  success: function(o) { insertText(o.responseObject); },
	  failure: function(o) { alert ('failure'); },
	  timeout: 5000
	  };
	  var url = "http://localhost:12004/dummy.php?callback={callback}";
	  JSONPManager.request(url, callback);
}
function insertText(obj)
{
	  var element = document.getElementById('result');
	  element.innerHTML = obj['value1'] + ':' + obj['value2'];
}
//]]>
    </script>
  </head>
  <body>
    <a href="#" onClick="doJob(); return false;">do job</a>

	<div id="result">
	</div>

  </body>
</html>

で、取得データのために、次のようなPHPファイルで作成しています。

dummy.php

var data = {
  'value1': 'ABC',
  'value2': 'XYZ'
}
<?php
echo $_GET['callback'] . '(data)';
?>

何かの参考になれば。

id:hopefully

タイムアウトした場合に、

JSONPManager.b._1244017155588_1 is not a function

とかFirefoxで出てきますね・・

どうしたらいいんだろう・・

2009/06/03 17:20:53
  • id:tdoi
    手元のFirefoxでは、タイムアウトしても出ません。
    動的に作成したscriptノードも、タイムアウト発生時に削除されてしまっているので、タイムアウト後にレスポンスが返ってきても評価されないと思うんですが。

    ブラウザ依存の問題か、hopefullyさんのそのほかのコードの部分の影響か、ちょっとこれだけの情報だと判断つかないです。
    ちなみに、サンプルで挙げたコードをそのままでも、Firefoxでエラーが出ますか?
  • id:hopefully
    サンプルで頂いたソースの場合も発生します。

    エラー: JSONPManager.b._1244044052437_1 is not a function

    Firefox/3.0.10

    PHPファイルでechoする前で、sleep(10)とかにして
    待たせて、タイムアウトにさせると出ちゃいますね・・・
  • id:tdoi
    出ますかぁ・・・。
    手元で再現できないので、なんともですが、原因としては、想定できて、タイムアウトの際に、

    JSONPManager.cleanupが呼ばれてこの中で、

    delete JSONPManager.b[名前]

    としているにも関わらず、動的に生成したscriptノードの評価の最中に、JSONPManger.b.名前(data)を評価しようとして問題になっているのかと思います。

    JSONPManagerにどこまで手を入れるかによりますが、一番簡単なのは、dummy.phpのechoするところで、

    echo "if ({$_GET['callback']} != null) { {$_GET['callback']}(data) }";

    とかにしてみてはどうですか?
  • id:hopefully
    PHP側の処理を
    こうしているのが原因ですかね?

    <?php
    $data = array(
    'value1'=>'ABC',
    'value2'=> 'XYZ'
    );
    sleep(10);
    echo $_GET['callback'] . '('.json_encode($data).')';
    ?>


  • id:hopefully
    無事にエラーもなくなりました。

    ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません