Hatena::ブログ(Diary)

英語とプログラミング気まぐれ日記 このページをアンテナに追加 RSSフィード

2008-05-11

[] onreadystatechange に引数を渡す

ポイントは2つ、

1.引数を渡す方法として、クロージャを使う

2.コールバック関数(以下では handleResult)の中では this を使わない(というか、使えないみたい)

id:amachangのエントリ

XMLHttpRequest の onreadystatechange の this - IT戦記

に救われた。


var hikisuu = "渡したい引数だよ";

var request = window.XMLHttpRequest ? new XMLHttpRequest() : (function() {
    try      { return new ActiveXObject("Msxml2.XMLHTTP");    }
    catch(e) { return new ActiveXObject("Microsoft.XMLHTTP"); }
})();
request.onreadystatechange = function(){ var hoge = arguments[0]; return function() { handleResult(hoge) }; }(hikisuu);
request.open("GET", ".");
request.send(null);

// コールバック関数
function handleResult(i) {
  if (request.readyState == 4 && request.status == 200) {
    alert(i);
  }
}

以下は自分用のメモ。

ウィジェット上の JavaScript はクロスドメインの問題を考慮しなくていいので、JSONP などの手法は使う必要が無い。

自分用のメモ(Y!Widgetの中では、こんな風に使った)
var url = ["http://www.yahoo.co.jp", "htttp://www.google.co.jp"];
var clip_request_array = [];
for (var i = 0, l = url.length ; i < l; i++) {
  getJSON(url[i], i);
}

function getJSON(url, i)
{
  clip_request_array[i] = new XMLHttpRequest();
  clip_request_array[i].onreadystatechange = function(){ var hoge = arguments[0]; return function() {clip_handleResult(hoge)};}(i);
  clip_request_array[i].open("GET", [
    'http://api.clip.livedoor.com/json/comments',
    '?link=', encodeURIComponent(url),
    ].join(''), true);
  clip_request_array[i].send();
}

function clip_handleResult(i) {
  if (clip_request_array[i].readyState == 4 && clip_request_array[i].status == 200) {
  var json_obj = eval("(" + clip_request_array[i].responseText + ")");
  // json_obj を利用した処理が続く…
  }
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/BigFatCat/20080511/1210521512
Connection: close