jQueryを読み込ませるbookmarklet Google AJAX Libraries API版 (JavaScriptの動的ロードとか)

jQueryを読み込ませるbookmarklet - 文殊堂
↑を置き換える用に作った。

javascript:(function%20(options)%20{var%20version=(options%20||%200).version%20||%201.2;var%20noConflict=(options%20||%200).noConflict%20||%20false;if%20(typeof%20jQuery%20!=%20'undefined'%20&&%20jQuery.fn.jquery==version)%20{return;}var%20s=document.createElement('script');var%20head=document.getElementsByTagName('head')[0];var%20done=false;s.charset='UTF-8';s.language='javascript';s.type='text/javascript';s.src='http://ajax.googleapis.com/ajax/libs/jquery/'%20+%20version%20+%20'/jquery.min.js';s.onload=s.onreadystatechange=function%20()%20{if%20(!done%20&&%20(!this.readyState%20||%20this.readyState=='loaded'%20||%20this.readyState=='complete'))%20{done=true;if%20(noConflict)%20{jQuery.noConflict();}head.removeChild(s);}};head.appendChild(s);})({version:'1.2',noConflict:false});

使い方

  • 一番後ろのversion:'1.2'ってやってる所でバージョン指定出来る。
    • 1.2なら1.2系の最新版がロード出来る
  • noConflict:falseをnoConflict:trueに変えればPrototype.js等と共存可能

元のコード

(function(options){
	var version = (options || 0).version || 1.2;
	var noConflict = (options || 0).noConflict || false;
	if(typeof jQuery != 'undefined' && jQuery.fn.jquery == version){
		return;
	}
	var s=document.createElement('script');
	var head = document.getElementsByTagName('head')[0];
	var done = false;
	s.charset='UTF-8';
	s.language='javascript';
	s.type='text/javascript';
	s.src='http://ajax.googleapis.com/ajax/libs/jquery/' + version + '/jquery.min.js';
	s.onload = s.onreadystatechange = function(){
		if ( !done && (!this.readyState ||
				this.readyState == "loaded" || this.readyState == "complete") ) {
			done = true;
			if(noConflict)jQuery.noConflict();
			head.removeChild( s );
		}
	};
	head.appendChild(s);
})({version:'1.2',noConflict:false});
scriptロード確認のコードはjQuery1.2.6の2668〜2678行目を参考にした。

2008/10/15追記

上記のjQueryのdataType:'script'の場合の実装と、
下記エントリでの最終的な実装がほぼ同じでした。
外部JavaScriptの動的ロード - os0x.blog

キャッシュされていないファイルについてはreadyStateがcompleteではなく、loadedになるようです。

「this.readyState == "loaded" || this.readyState == "complete"」なのはそれでなのかー。