フレームワークは
ツールのセットですが、プログラミングの伝統や慣習ではありませんが、アプリケーションの目標は実行速度と結果の正確さです。 公開された
記事は、DOMへ
のクエリの
効率的な使用を示していますが、これだけでなくjQueryアプリケーションの実行が速くなります。
それぞれを使用しないでください
むしろ、「実際には」ではありませんが、正当化されていない場合:
var a = [1,2,3,4];
$.each(a, function ()
{
console.log( this );
});
// !
このように良い:
for ( var i = 0, l = a.length; i < l; i++)
{
console.log(a[i]);
}
通常のアプローチでは、ループを終了するためにコール
バック関数と不必要な
チェックを呼び出す時間を無駄にしません。 別の例:
var b = {c: 1, d: 2, e: 3};
$.each(b, function (k)
{
console.log(k, this );
});
//
このように良い:
for ( var k in b)
{
if ( b.hasOwnProperty(k) )
{
console.log(k, b[k]);
}
}
プラグインを書く
動くものや動くものすべてのプラグインを作成します。 プラグインの設計に今日費やした10分間は、明日の開発速度を向上させます。
人生からの例。 textareaフィールドのテキストの可用性に応じて、送信ボタンを有効/無効にする必要がありました。 最初に生まれたプラグイン:
$.fn.inputChange = function (callback)
{
return this .bind(
{
mousedown: callback,
keyup: callback,
blur: callback
});
};
そしてそれは次のように機能します:
var submit = $( "#submit" );
// 1
$( "#text" ).inputChange( function ()
{
submit[0].disabled = this .value.length === 0;
});
// 2
$( "#text" ).inputChange( function ()
{
if ( this .value.length === 0)
{
submit.attr( "disabled" , "disabled" );
}
else
{
submit.removeAttr( "disabled" );
}
});
ただし、両方のオプションは理想からはほど遠いものです。1は、サブミット内に突然要素がない場合にエラーが発生する可能性があり、2は面倒です。
2番目のプラグインが生まれました:
$.fn.disable = function ( bool )
{
return this .each( function ()
{
this .disabled = bool ;
});
};
このプラグインは、次のように$ .fn.inputChangeと連携して機能します。
$( "#text" ).inputChange( function ()
{
submit.disable( this .value.length === 0);
});
ただし、
inputChangeで指定された単一のイベントがクリップボードからの貼り付けを処理できないという問題がありました。 グーグル、私たちは決定に来ました:
$.fn.paste = function (listener)
{
if ($.browser.msie)
{
return this .bind( "paste" , function ( event )
{
var that = this ;
setTimeout(
function ()
{
listener.apply(that, [ event ]);
},
.001
);
});
}
else
{
return this .bind( "input" , function ( event )
{
listener.apply( this , [ event ]);
});
}
};
そして
inputChangeプラグインは次の形式を取りました。
$.fn.inputChange = function (callback)
{
return this
.paste(callback)
.bind(
{
keyup: callback,
blur: callback
});
};
そこで、「ブリックバイブリック」機能的な機能を組み合わせて、ライブラリを補完する優れたプラグインを提供します。
ネイティブコード
多くの人々は、jQueryがすべてを実行できると考えています。 そしてある程度は彼らは正しいが、この権利は彼らにネイティブJSを忘れる理由を与えない。
例を挙げます。
function warning(text)
{
$( "<div id='alert' class='warning'></div>" )
.appendTo( $( document .body) )
.css(
{
"padding" : "10px" ,
"background-color" : "red" ,
"color" : "white"
})
.html(text)
.append(
$( "<button>OK</button>" ).attr( "title" , "Close me!" ).click( function ()
{
$( this ).parent().remove();
})
);
}
多くの方法で、コードは指から吸い込まれますが、それはデモンストレーションのみを目的としています。 次に、純粋なJSでコードを書き直してみます。
function warning(text)
{
var div = document .createElement( "div" );
div.id = "alert" ;
div.className = "warning" ;
div.style.padding = "10px" ;
div.style.backgroundColor = "red" ;
div.style.color = "white" ;
div.innerHTML = text;
var button = document .createElement( "button" );
button.setAttribute( "title" , "Close me!" );
button.innerHTML = "OK" ;
$(button).click( function ()
{
div.parentNode.removeChild(div);
});
div.appendChild(button);
document .body.appendChild(div);
}
jQueryはaddEventListener / attachEventクロスブラウザーコールを適切にカプセル化するため、jQueryを使用してイベントを意図的に追加し、ブラウザー間の境界を消去しました。そのため、jQuery作成者は多くの敬意を払っています。 残りはDOMを操作するための標準的な方法を使用します。
どちらの例も優れています。1つ目はエレガントで、2つ目は高速です。 DOMの使用方法には多くの制限がありますが、jQuery(MooTools、Prototype、ExtJSなど)を使用する場合は、常に高速であるネイティブJSを忘れないでください。 結局のところ、フレームワークはフレームワークにあなたを置くのではなく、
ツールを提供するだけです。