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 を利用した処理が続く… } }