QA@IT
«質問へ戻る

質問を投稿

Ajaxを使って外部スクリプトを読み込む方法

jQueryの$.getScript()に相当する処理をフレームワークなしで書こうと思っています。しかし、コールバックの処理をどうしたらいいかわかりません。

たとえば、swfobjectが読み込まれていないときに自動的にswfobjectを読み込むという処理を考えてみます。

var swfname = 'foo.swf';
var id = 'bar';
if (typeof(swfobject)=== 'undefined'){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js', true);
    xhr.onreadystatechange = function(x){
        if (xhr.readyState == 4 &&( xhr.status == 200 || xhr.status == 201)) {
            var sc = document.createElement('script');
            sc.text = xhr.responseText + "\n" + 'swfobject.embedSWF("' + swfname + '", "' + id + '", 1, 1, "10.0.0",null,{allowscriptaccess: "always"});';
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(sc, s);
        }
    };
    xhr.send(null);
}else{
    swfobject.embedSWF(swfname, id, 1, 1, "10.0.0",null,null,{allowscriptaccess: "always"});
}

とりあえず動きますが、この方法だと、swfobjectが存在しないときは、読み込んだスクリプトと実際実行したい処理を単にをScriptタグのテキストノードに入れているだけでなんか違う気がします。それになんだか、スマートではありません。

実際どうしたらいいでしょうか?

jQueryの$.getScript()に相当する処理をフレームワークなしで書こうと思っています。しかし、コールバックの処理をどうしたらいいかわかりません。

たとえば、swfobjectが読み込まれていないときに自動的にswfobjectを読み込むという処理を考えてみます。
```
var swfname = 'foo.swf';
var id = 'bar';
if (typeof(swfobject)=== 'undefined'){
	var xhr = new XMLHttpRequest();
	xhr.open("GET", 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js', true);
	xhr.onreadystatechange = function(x){
		if (xhr.readyState == 4 &&( xhr.status == 200 || xhr.status == 201)) {
			var sc = document.createElement('script');
			sc.text = xhr.responseText + "\n" + 'swfobject.embedSWF("' + swfname + '", "' + id + '", 1, 1, "10.0.0",null,{allowscriptaccess: "always"});';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(sc, s);
		}
	};
	xhr.send(null);
}else{
	swfobject.embedSWF(swfname, id, 1, 1, "10.0.0",null,null,{allowscriptaccess: "always"});
}
```
とりあえず動きますが、この方法だと、swfobjectが存在しないときは、読み込んだスクリプトと実際実行したい処理を単にをScriptタグのテキストノードに入れているだけでなんか違う気がします。それになんだか、スマートではありません。

実際どうしたらいいでしょうか?