kdoc - jQuery

  • 作成日:2010-10-07 14:39:16
  • 修正日:2014-08-19 09:42:05

jQuery

↑ページトップへ

書き方見本とか

↑ページトップへ

// 変数は$始まりで&変数名はキャメルケースで。
var $myDiv = $("#myDiv");
$myDiv.click(function(){...});

// Bad
var $products = $(".products");
// Good
var $products = $("div.products");

// Bad
var $productIds = $("#products div.id");
// Good
var $productIds = $("#products").find("div.id");

// いまいち
$("div.data .gonzalez");
// 最適
$(".data td.gonzalez");

// これより
$(".data table.attendees td.gonzalez");
// こちら
$(".data td.gonzalez");

// 遅い
$('.class');
// この方が速い
$('.class', '#class-container');

// Bad
$('div.container > *');
// Better
$('div.container').children();

// Bad
$('div.someclass :radio');
// Good
$('div.someclass input:radio');

// Bad
$('#outer #inner');
$('div#inner');
$('.outer-container #inner');
// Good
$('#inner');

// DOMにいろいろ変更を加えるなら、一度デタッチしてから再度追加(DOM操作重いから)。
var $myList = $("#list-container > ul").detach();
//...a lot of complicated things on $myList
$myList.appendTo("#list-container");

// (同じ)
var $table = $( "#myTable" );
var $parent = $table.parent();
$table.detach();
// ... add lots and lots of rows to table
$parent.append( $table );

// 配列操作

// BAD
var $myList = $("#list");
for(var i = 0; i < 10000; i++){
    $myList.append("<li>" + i + "</li>");
}

// GOOD
var $myList = $("#list");
var list = "";
for(var i = 0; i < 10000; i++){
    list += "<li>" + i + "</li>";
}
$myList.html(list);

// EVEN FASTER
var array = [];
for(var i = 0; i < 10000; i ++){
    array[i] = "<li>" + i + "</li>";
}
$myList.html(array.join(''));

// 存在しない要素にアクションさせない

// BAD: This runs three functions before it realizes there's nothing in the selection
$("#nosuchthing").slideUp();

// GOOD
var $mySelection = $("#nosuchthing");
if ($mySelection.length) {
    $mySelection.slideUp();
}

// 以下続く…

jQuery 日本語リファレンスより。
その他、いろいろなページより。

読み込み

↑ページトップへ

// DOM準備が終わってからコード実行
$(function(){
  // code...
});

//より安全
jQuery(function($) {
  // $関数がjQueryオブジェクトのエイリアスとして安全に使える
});

//昔の書き方
$(document).ready(function(){
  // code...
});

Google APIを使うなら以下。
Google Libraries API - Developer's Guide - Google Libraries API - Google Code

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("jquery", "1.4.2");
google.setOnLoadCallback(function(){
  // code...
});
</script>

バージョン指定は、例えば以下等もあり。

google.load("jquery", "1.4");
google.load("jquery", "1");

jQuery UIもOK。

google.load("jqueryui", "1.8.5");

コンフリクトを避ける

jQuery.noConflict();
(function($) {
  $(function() {
    // ここでは、$関数はjQueryオブジェクトとして動作する
  });
})(jQuery);
// スコープの外では、他のライブラリで定義された$関数として動作する

要素の取得

↑ページトップへ

$()

↑ページトップへ

//documentの最初のform内にある、全てのinputタグでtypeがradioのもの
$("input:radio", document.form[0]);
//xmlの中の全てのdiv
$("div", xml.responseXML);

要素を追加

↑ページトップへ

$("<div><p>Hello</p></div>").appendTo("body");
$('<img/>', {
    id: 'myimg',
    src: 'img/001.jpg',
    css: {
        margin: '10px'
    }
}).appendTo('#container');
// Internet Explorerでは動作しない
$("<input/>").attr("type", "checkbox");
// Internet Explorerでも動作する
$("<input type='checkbox'/>");

Each

↑ページトップへ

//$(this)
$("span").click(function () {
  $("li").each(function(){
    $(this).toggleClass("example");
  });
});

//引数
$("span").click(function () {
  $("li").each(function(_index, _elem){
    $(_elem).toggleClass("example");
  });
});

新しいメソッドを追加

↑ページトップへ

jQuery.fn.extend({
  check: function() {
    return this.each(function() { this.checked = true; });
  },
  uncheck: function() {
    return this.each(function() { this.checked = false; });
  }
});
$("input[@type=checkbox]").check();
$("input[@type=radio]").uncheck();

入門

↑ページトップへ

jQuery言語入門 | tech.kayac.com - KAYAC engineers' blogより。

function

すべてjQuery pluguinとして。
elementsに対してのfunctionは$.fn、単独で使用するfunctionは$に実装。
最後にreturn this;。

$.fn.extend({
  'method_name' : function() {
    console.log(this);
    return this;
  }
});
$().method_name();
>> Document

変数

広域変数は$.extendで$に保持。

$.extend({
  'hoge' : 'huga'
});

console.log($.hoge);
>> huga

$.dataに保存する場合(「events」、「handler」は予約語なので避ける)。

$('a:first').data('first_link', true);

console.log($('a:first').data('first_link', true));
>> true

イベント

DOMに関連性のあるfunctionは独自イベントとして実装。

$('#header .tag a').bind('blink', function () {
  $(this).stop().fadeOut(300).fadeIn(300);
});

$('.meta a').click(function (e) { e.preventDefault();
  var contains = $(this).text();
  $('#header .tag a:contains("'+contains+'")').blink();
});

デバッグ用

8行でjQueryのデバッグが楽になるjQuery.pの紹介 | tech.kayac.com - KAYAC engineers' blogより。

$.fn.p = function (id) {
    var arg = [this];
    if (id) arg.unshift(id);
    if (!window.console) return this;
    var c = window.console || { 'log' : function () {} };
    (c.debug || c.log).apply(c, arg);
    return this;
};

使い方。

$('#aaa').p()
    .find('.bbb').p()
        .filter(':first').p()
            .addClass('head').p()
            .end()
        .end()
    .parents('tag').p()
        .children(':first').p()
            .addClass('head').p()
            .end()
        .end()
    .end()
;

スタイルの保持

javascript libraryを作るときに便利な3つのfunction | tech.kayac.com - KAYAC engineers' blogより。

(function ($) {
    var name_space = 'save_style';
    $.fn[name_space] = function () {
        $(this).each(function () {
            var result = {};
            var style = $(this).get(0).style;
            $.each(style, function (key, val) {
                result[val] = style[val];
            });
            $(this).data(name_space, result);
        });
        return this;
    };
    $.fn['load_style'] = function () {
        $(this).each(function () {
            $(this).attr('style', '');
            $(this).css($(this).data(name_space));
        });
        return this;
    };
})(jQuery);

jQuery pluginの書き方

jQuery Pluginの書き方 | tech.kayac.com - KAYAC engineers' blogより。

注意点

  • window.$に依存しない ($.noConflict()時にも動くように)
  • 最後はreturn this; (method chainが切れるので)
  • 複数要素が指定されている場合を考慮する (Plugin内のthisは.eachで処理する)
  • 名前空間を汚染しない (無名関数に閉じているのでPlugin自体の変数も外部から見えない)
(function($) {
    //このPluginの名前
    var name_space = 'basePlugin';
    $.fn[name_space] = function(options) {
        //いったん退避
        var elements = this;

        //設定情報の構築
        var settings = $.extend({
            //optionの初期値を設定
            'param' : 'value'
        }, options);

        //内部用method
        var inner_method = function () {
            //内部の共通処理の記述
        };

        //要素を一個ずつ処理
        elements.each(function() {
            $(this)
                //イベント等の設定
                .keyup(inner_method)
            ;
        });

        //method chain
        return this;
    };
})(jQuery);

フォーム値チェック

↑ページトップへ

// text 空チェック
if($('form input[name="text"]').val() == ''){
}
// チェックボックス チェックチェック
if(!$('form input[name="checkbox"]').attr('checked')){
}

もろもろ

↑ページトップへ

//要素数を返す
var n = $('li').size();
var n = $('li').length;

//pタグの中からポジションが1(ゼロから数えて2番目)のものを、赤色に変える。
$("p").eq(1).css("color", "red");

//.get() → 配列として返す

//配列の1つ目 $(this)[0]と同じ
$(this).get(0);

//配列の中のいくつめか(index)を返す
.index(elem);

aリンクを無効

そのままだと、画面遷移してしまうので。

$('#a').click(function(e){
    e.preventDefault();
});

location.hash

location.hash = 'aaaa';
// -> http://www.officek.jp/#aaaa

var location_hash = location.hash;
// -> aaaa

location.hashが変化した時にイベント。
Ben Alman » jQuery hashchange event

画像サイズ

ロードされてから。

$('#img').load(function(){
    var w = $(this).width();
    var h = $(this).height();
});

Enterでsubmitさせない

# .allow_submitなinput(検索キー入力テキストボックスとか)はenter submit OK。
$(function() {
  $(document).on("keypress", "input:not(.allow_submit)", function(event) {
    return event.which !== 13;
  });
});

プラグイン

↑ページトップへ

テキストエリアtextarea 自動リサイズ

カルーセル

ーTiny Carousel: A lightweight jQuery plugin
http://www.baijs.nl/tinycarousel/

ツールチップ

確認ダイアログ

モバイル

カレンダー

Googleスプレッドシート

テンプレート

jQuery UIのダイアログ

Googleマップ

  • gmaps.js — the easiest way to use Google Maps
    http://hpneo.github.com/gmaps/examples.html

パノラマ画像

可変グリッドレイアウト

可変グリッドレイアウトのjQueryプラグイン書いたよ | Xlune::Blog
http://blog.xlune.com/2009/09/jqueryvgrid.html

select プルダウン インクリメンタルサーチ