jQueryを少し便利にする5つの関数

jQueryはよく使うのだけど、ちょっとだけ不便なときがあったので、それに対応する関数を書いてみた。

クラスを生成する

var Class = $.klass({
  init: function (a) { this.a = a; },
  view: function () { alert(this.a) }
});

initがコンストラクタとして機能します。

$.klass=function(a){var b=function(){this.init&&this.init.apply(this,arguments)};b.prototype=a;return b};

CSSルールの追加削除

var index = $.css.add("body{background:red;}");
alert("stop");
$.css.remove(index);

あると便利なときがあるので一応。

$.css.add=function(a,b){var c=$.css.sheet,d=!$.browser.msie,e=document,f,g,h=-1,i="replace",j="appendChild";if(!c){if(d){c=e.createElement("style");c[j](e.createTextNode(""));e.documentElement[j](c);c=c.sheet}else{c=e.createStyleSheet()}$.css.sheet=c}if(d)return c.insertRule(a,b||c.cssRules.length);if((f=a.indexOf("{"))!==-1){a=a[i](/[\{\}]/g,"");c.addRule(a.slice(0,f)[i](g=/^\s+|\s+$/g,""),a.slice(f)[i](g,""),h=b||c.rules.length)}return h};
$.css.remove=function(a){var b=$.css.sheet;b&&b[$.browser.msie?"removeRule":"deleteRule"](a)};

クッキー

$.cookie("name", "value");
alert($.cookie("name"));

デフォルトで対応していないのが不思議。

$.cookie=function(a,b,c){var d=document;if(b===void 0){c=(";"+d.cookie+";").match(new RegExp(";\\s*"+a+"=(.*?)\\s*;"));return c?decodeURIComponent(c[1]):null}c=c||{};var e=f="",g=c.expires,h,i="toUTCString";if(b===null){b=f;g=-1}if(g){if(!g[i]){h=parseInt(g,10);g=new Date;g.setTime(g.getTime()+h*86400000)}e=";expires="+g[i]()}d.cookie=[a,"=",encodeURIComponent(b),e,(h=c.path)?";path="+h:f,(h=c.domain)?";domain="+h:f,c.secure?";secure":f].join(f)};

画像やiframeやJavaScriptFlashの追加

$("#image").media("test.gif");
$("#flash").media("test.swf");
$("#script").media("test.js");
$("#iframe").media("http://example.com");
// 第二引数で種類を指定できる。
$("#img").media("logo", "img");

拡張子によって、適当に判断して、指定された要素(JavaScriptは指定された要素の存在するdocumentのhtml要素)に追加する。

$.fn.media=function(a,b){if(!this.length)return $([]);if(typeof a!=="object")a={src:a};if(!b)b=/[^.]*$/.exec(a.src.replace(/\?.*$/,""))[0];function c(a,b){b="replace";return(""+a)[b](/&/g,"&amp;")[b](/</g,"&lt;")[b](/>/g,"&gt;")[b](/"/g,"&quot;")}var d=document,e="toLowerCase",f="hasOwnProperty",g="createElement",h="setAttribute",i="appendChild",j="object",k="classid",l,m,n={swf:1,js:2,img:3,bmp:3,gif:3,png:3,jpg:3,jpeg:3}[(""+b)[e]()];if(n===1){var o=a.params||{},p;delete a.params;if($.browser.msie){o.movie=a.src;delete a.src;this.append(d[g](j));m=this.find(j);var q='<'+j+' '+k+'="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"',r=0,s=m.length;for(l in a)if(a[f](l)&&l[e]()!==k)q+=" "+c(l)+'="'+c(a[l])+'"';q+='>';for(l in o)if(o[f](l))q+='<param name="'+c(l)+'" value="'+c(o[l])+'" />';q+='</'+j+'>';for(;r<s;++r)m[r].outerHTML=q;return this.find(j)}else{a.data=a.src;delete a.src;m=d[g](j);m[h]("type","application/x-shockwave-flash");for(l in a)if(a[f](l)&&l[e]()!==k)m[h](l,a[l]);for(l in o)if(o[f](l)){p=d[g]("param");p[h]("name",l);p[h]("value",o[l]);m[i](p)}this.append(m)}}else{m=d[g](n===2?"script":n===3?"img":"iframe");if(n===2)m[h]("charset","UTF-8");for(l in a)if(a[f](l))m[h](l,a[l]);if(n===2)this[0].ownerDocument.documentElement[i](m);else this.append(m)}return $(m)};

jquery.lib.js

こういう名前付けて、読み込むのが最近の癖です。

$.klass=function(a){var b=function(){this.init&&this.init.apply(this,arguments)};b.prototype=a;return b};
$.css.add=function(a,b){var c=$.css.sheet,d=!$.browser.msie,e=document,f,g,h=-1,i="replace",j="appendChild";if(!c){if(d){c=e.createElement("style");c[j](e.createTextNode(""));e.documentElement[j](c);c=c.sheet}else{c=e.createStyleSheet()}$.css.sheet=c}if(d)return c.insertRule(a,b||c.cssRules.length);if((f=a.indexOf("{"))!==-1){a=a[i](/[\{\}]/g,"");c.addRule(a.slice(0,f)[i](g=/^\s+|\s+$/g,""),a.slice(f)[i](g,""),h=b||c.rules.length)}return h};
$.css.remove=function(a){var b=$.css.sheet;b&&b[$.browser.msie?"removeRule":"deleteRule"](a)};
$.cookie=function(a,b,c){var d=document;if(b===void 0){c=(";"+d.cookie+";").match(new RegExp(";\\s*"+a+"=(.*?)\\s*;"));return c?decodeURIComponent(c[1]):null}c=c||{};var e=f="",g=c.expires,h,i="toUTCString";if(b===null){b=f;g=-1}if(g){if(!g[i]){h=parseInt(g,10);g=new Date;g.setTime(g.getTime()+h*86400000)}e=";expires="+g[i]()}d.cookie=[a,"=",encodeURIComponent(b),e,(h=c.path)?";path="+h:f,(h=c.domain)?";domain="+h:f,c.secure?";secure":f].join(f)};
$.fn.media=function(a,b){if(!this.length)return $([]);if(typeof a!=="object")a={src:a};if(!b)b=/[^.]*$/.exec(a.src.replace(/\?.*$/,""))[0];function c(a,b){b="replace";return(""+a)[b](/&/g,"&amp;")[b](/</g,"&lt;")[b](/>/g,"&gt;")[b](/"/g,"&quot;")}var d=document,e="toLowerCase",f="hasOwnProperty",g="createElement",h="setAttribute",i="appendChild",j="object",k="classid",l,m,n={swf:1,js:2,img:3,bmp:3,gif:3,png:3,jpg:3,jpeg:3}[(""+b)[e]()];if(n===1){var o=a.params||{},p;delete a.params;if($.browser.msie){o.movie=a.src;delete a.src;this.append(d[g](j));m=this.find(j);var q='<'+j+' '+k+'="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"',r=0,s=m.length;for(l in a)if(a[f](l)&&l[e]()!==k)q+=" "+c(l)+'="'+c(a[l])+'"';q+='>';for(l in o)if(o[f](l))q+='<param name="'+c(l)+'" value="'+c(o[l])+'" />';q+='</'+j+'>';for(;r<s;++r)m[r].outerHTML=q;return this.find(j)}else{a.data=a.src;delete a.src;m=d[g](j);m[h]("type","application/x-shockwave-flash");for(l in a)if(a[f](l)&&l[e]()!==k)m[h](l,a[l]);for(l in o)if(o[f](l)){p=d[g]("param");p[h]("name",l);p[h]("value",o[l]);m[i](p)}this.append(m)}}else{m=d[g](n===2?"script":n===3?"img":"iframe");if(n===2)m[h]("charset","UTF-8");for(l in a)if(a[f](l))m[h](l,a[l]);if(n===2)this[0].ownerDocument.documentElement[i](m);else this.append(m)}return $(m)};

$.css.addと$.css.removeだけjQueryっぽくなくて嫌だけどね。