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個です。
訳間違いがあったらご指摘いただけると助かります。。。
最近のコメント