mprove your jQuery – 25 excellent tips
jQueryを利用する際の25のTipsを見つけたので紹介します。
ちょっと長いですが、かなりいいです。
google jsapiを利用しましょう
google.load("jquery", "1.2.6");
google.setOnLoadCallback(function() {
// Your code goes here.
});
これを利用すると読み込み時間が高速になります。
チートシートを利用しましょう
わからなくなったら、チートシートを利用し、さくっと。
チートシートはこちらがいいかもしれません。
http://www.gscottolson.com/weblog/2008/01/11/jquery-cheat-sheet/
http://colorcharge.com/jquery/
ライブラリとか、自作ものはパッケージにしましょう
パッケージ化するとソース容量が軽くなり、読み込みが早くなります。
パッケージ化するならPacker by Dean Edwardsがいいですよ!
FireBugのコンソールは使うべき
コンソールを使って実行時間を計測してみるといいかもしれません。
コンソールでの計測は以下の様な感じ。
console.time("create list");
for(var i = 0; i < 1000; i++){
var mylist = $(".mylist") ;
mylist.append('This is list item ' + i);
}
console.timeEnd('create list');
キャッシュを有効に利用しましょう
ブラウザキャッシュじゃないですが、varで定義するのは1回で押さえる要にする。ってことですね。
書くとこんな感じ。
for(var i = 0; i < 1000; i++){
var mylist = $(".mylist") ;
mylist.append('This is list item ' + i);
}
これでは同じことを何度も繰り返さない(DRY)プログラムには当てはまらないよね!
同じことをするなら1回だけにすませようよ!となると以下の世なものがいいです。
var mylist = $(".mylist") ;
for(var i = 0; i < 1000; i++){
mylist.append('This is list item ' + i);
}
だいたい4倍程度実行速度は上がります。
DOMの操作は必要最低限にしましょう
after()とかappend()とかを毎回繰り返すと偉いことになるので、一回で処理してしまいましょう。
var mylist = $(".mylist") ;
for(var i = 0; i < 1000; i++){
insHtml += 'This is list item ' + i;
}
mylist.html(insHtml);
こうすると、毎回appendするより、50倍近く早くなります。
1つの要素で囲い込んでしまうテクニック
1つの要素である要素を囲んでしまう為に非常に素早い方法を。
var myList = $('.myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
myListItems += '<li>This is list item ' + i + '</li>';
}
myListItems += '</ul>';
myList.html(myListItems);
すっごくはやいよ!
可能な限りclassでは無く、IDを使いましょう
// Create our list
var myList = $('.myList');
var myListItems = '';
for (i = 0; i < 1000; i++) {
myListItems += 'This is a list item';
}
myListItems += '';
myList.html(myListItems);
// Select each item once
for (i = 0; i < 1000; i++) {
var selectedItem = $('.listItem' + i);
}
これだと5秒以上かかってしまいます。
// Create our list
var myList = $('.myList');
var myListItems = '';
for (i = 0; i < 1000; i++) {
myListItems += 'This is a list item';
}
myListItems += '';
myList.html(myListItems);
// Select each item once
for (i = 0; i < 1000; i++) {
var selectedItem = $('#listItem' + i);
}
しかし、これだと0.61秒ほどで終わります。500倍近く違いますね!
セレクタを利用する時はコンテキストも指定しましょう
var selectedItem = $('#listItem' + i);
こっちよりは
var selectedItem = $('#listItem' + i, $('.myList'));
こっちがいいですよ!
理由は検索対象を狭くするんです。「class=’myList’」の中から検索した方がはやいですよね!
チェーンメソッドを利用しましょう
セレクタからなるべく切らないように連結しましょう。
$('myDiv').removeClass('off').addClass('on');
$('#mypanel')
.find('TABLE .firstCol')
.removeClass('.firstCol')
.css('background' : 'red')
.append('This cell is now red');
取得したい要素を変えるにはfind()とend()を利用しましょう
$('#myTable')
.find('.firstColumn')
.css('background','red')
.end()
.find('.lastColumn')
.css('background','blue');
自分で作った関数もチェーンメソッドとして登録して使うこともできます。
$.fn.makeRed = function() {
return $(this).css('background', 'red');
}
$('#myTable').find('.firstColumn').makeRed().append('hello');
animateメソッドを習得しよう
fadeInだってslideDownだって簡単にできます。
slideDown: function(speed,callback){
return this.animate({height: "show"}, speed, callback);
},
fadeIn: function(speed, callback){
return this.animate({opacity: "show"}, speed, callback);
}
たったこれだけで見た目をゴージャスに!
そして、高さや幅を変えるときはこんな感じ。
以下の場合はマウスオーバーしたら、高さを100pxにします。
$('#myList li').mouseover(function() {
$(this).animate({"height": 100}, "slow");
});
// 複数ある場合は以下の様に書きます。
$('#myBox').mouseover(function() {
$(this).animate({ "width": 200 }, "slow");
$(this).animate({"height": 200}, "slow");
});
でもこれって同じことしてるようにみえません?
そんなときは以下の様にまとめることができます!
$('#myBox').mouseover(function() {
$(this).animate({ "width": 200, "height": 200 }, "slow");
});
eventデリゲートについて学びましょう
$('#myTable TD').click(function(){
$(this).css('background', 'red');
});
こんなスクリプトがあったとして、10行50列のテーブルがあったら、500個のイベントが用意されてしまいます。
$('#myTable').click(function(e) {
var clicked = $(e.target);
clicked.css('background', 'red');
});
こうすることで、eに対してスタイルを適用することができます。
classに情報を設定しよう
メニューが開閉するものを作る場合。
click me <ul> <li>Menu item 1</li> <li>Menu item 2</li> <li>Menu item 3</li> </ul>
こんなのがあったら、addClass()を使ってclassを追加して、開閉を確認しましょう。
$('.button').click(function() {
var menuItem = $(this).parent();
var panel = menuItem.find('.panel');
if (menuItem.hasClass("expanded")) {
menuItem.removeClass('expanded').addClass('collapsed');
panel.slideUp();
}
else if (menuItem.hasClass("collapsed")) {
menuItem.removeClass('collapsed').addClass('expanded');
panel.slideDown();
}
});
dataメソッドを使って情報を保存し利用しよう
dataを使うと情報を保存することができます。
htmlにclassを使うだけじゃなく、dataメソッドを使うのもいいです。
$('.button').click(function() {
var menuItem = $(this).parent();
var panel = menuItem.find('.panel');
if (menuItem.data('collapsed')) {
menuItem.data('collapsed', false);
panel.slideDown();
}
else {
menuItem.data('collapsed', true);
panel.slideUp();
}
});
自作セレクタを作って使ってみよう
jQueryではセレクタを自作することができます。
$.extend($.expr[':'], {
over100pixels: function(a) {
return $(a).height() > 100;
}
});
$('.box:over100pixels').click(function() {
alert('The element you clicked is over 100 pixels high');
});
自作セレクタを使って処理するのもまた醍醐味でもありますね!
HTMLが読み込まれてから処理を行いましょう
<div class="fieldOuter"> <div class="inner"> <div class="field">This is field number 1</div> </div> <div class="errorBar"> <div class="icon"><img src="icon.png" alt="icon" /></div> <div class="message"><span>This is an error message</span></div> </div> </div> <div class="fieldOuter"> <div class="inner"> <div class="field">This is field number 2</div> </div> <div class="errorBar"> <div class="icon"><img src="icon.png" alt="icon" /></div> <div class="message"><span>This is an error message</span></div> </div> </div>
なんてHTMLがあって、タグを入れ込みます。
以下の様に簡単にしておくといいでしょう。
<div class="field">This is field 1</div> <div class="field">This is field 2</div> <div class="field">This is field 3</div> <div class="field">This is field 4</div> <div class="field">This is field 5</div>
後は、jQueryを使ってHTMLを流し込みます。
$(document).ready(function() {
$('.field').before('
<div class="fieldOuter">
<div class="inner">');<br /> $('.field').after('</div>
<div class="errorBar">
<div class="icon"><img src="icon.png" alt="icon" /></div>
<div class="message"><span>This is an error message</span></div>
</div>
</div>');
});
読み込みがコンテンツはSEO効果が薄い
google mapとかおもいものは、load()メソッドを使ってよみこみましょう。
$('#forms').load('content/headerForms.html', function() {
// Code here runs once the content has loaded
// Put all your event handlers etc. here.
});
jQueryの組み込み関数を利用しましょう
普通のjavascriptのみで処理してしまうともったいないなぁと思うこともあります。
selectの値を取得するのは以下の1行で終わるのに・・・
$('#selectList').val();
ほかのライブラリを使うならnoconflictを使って回避しましょう
ほかのライブラリとかぶってしまって、処理が行えない!って場合は以下の様に書いてみると幸せになれますよ。
var $j = jQuery.noConflict();
$j('#myDiv').hide();
noConflict()関数は、バッティングを回避する魔法の呪文なのです。
画像の読み込み完了を伝えてみよう
$('#myImage').attr('src', 'image.jpg').load(function() {
alert('Image Loaded');
});
これだけ。
常に最新バージョンを使いましょう
最新バージョンを使っていると幸せになれることがいっぱい!
新しい便利な関数の追加とか、bugfixとか!
要素の存在有無を確かめる
if ($('#myDiv).length) {
// your code
}
これで0ならば、要素が無いってことですよね!
HTML要素にJSクラスをつけましょう
以下の様にクラスをつけます。
$('HTML').addClass('JS');
そんで、cssには以下のように指定しておきます。
.JS #myDiv{display:none;}
こうすることで、javascriptがONの時は、myDivが見えません。
myDivにはjavascriptがoffの状態でも内容を閲覧できるようにしておきましょう。
初期の挙動を止めるにはreturn falseを使って止めましょう
Click me!
こんなのがあって、
$('popup').click(function(){
// Launch popup code
});
こんなのがあったときに、クリックすると、ページ上部に移動してしまいます。。。
これを回避するには、
$('popup').click(function(){
// Launch popup code
return false;
});
こうすると、ページ上部へ移動することをキャンセルすることができます!
ショートハンドを使いましょう
$(document).ready(function (){
// your code
});
長い(´・ω・)
ショートハンドラを使って短くすませましょう!
$(function (){
// your code
});
以上で25個です。
訳間違いがあったらご指摘いただけると助かります。。。



最近のコメント