Event

Event bubbling / Event propagationイベントチェーンを防ぐ

$("#btn").click(function(event){

...

event.preventDefault(); //方法1

event.stopPropagation(); //方法

return false; //方法3

};

ready()の書き方

$(document).ready(function(){

...

});

$.ready(function(){

...

});

$(function(){

...

});

jQuery(document).ready(function(){

...

});

jQuery(function(){

...

});

※実行の順番:ready(DOM) ⇒ imgダウンロードなど ⇒ onload

bind(type,[data],fn)

blur、focus、load、resize、scroll、unload、click、dbclick、

mousedown、mouserup、mousemove、mouseover、mouseout、mouseenter、mouseleave、

change、select、submit、keydown、keypress、keyup

$("#btn").bind("click mouseout", function(){ // 複数指定

...

});

var message="テスト";

$("#txt_name").bind("focus", {msg:message}, function(event){

$("#div1").show().html(event.data.msg);

});

//イベントのバインド(書き方1)

$('#foo').click(function(event) {

...

});

//イベントのバインド(書き方2) 引数渡し

$('#foo').bind('click', {test1:"xxx", test2:"yyy"}, function(event) {

alert(event.data.test1 + event.data.test2 );

});

イベントの切り替え

1.hover(over, out)

$("a").hover(function(){

$("#content").show();

}, function(){

$("#content").hide();

});

↓同様

$("a").mouseenter(function(){

$("#content").show();

});

$("a").mouseleave(function(){

$("#content").hide();

});

2.toggle(fn1,fn2,[fn3,fn4,...]) クリック

$("a").toggle(function(){

$("#content").show();

}, function(){

$("#content").hide();

});

unbind([type],[fn]) イベントを削除

$("input").unbind(); //すべて

$("input").unbind("click");

そのほか

1.one() 一回のみ

$('#btn').one('click', function(){

...

});

2.trigger(type,[data]) ブラウザのデフォルトイベントも発生

triggerHandler ブラウザのデフォルトイベントは発生しない

var $target = $("input");

$target.bind("btn_click", function(){

var txt = $(this).val();

$("#div1").html(txt);

});

$target.trigger("btn_click");

★Event変遷

1.click

$('ol li').click( function() {...});

2. bindとunbind

$('ol li').bind( 'click', function() {...});

3.liveとdie

$('ol li').live( 'click', function() {...});

$('li', $('ol')[0]).live(...);

4.delegateとundelegate

$('ol').delegate('li', 'click', function() {...});

5.onとoff 推薦

$('ol').on('click', 'li', function() {...}); // delegateに相当

$('ol li').on('click', function() {...}); // bindに相当

※定義ソース

bind: function( types, data, fn ) {

return this.on( types, null, data, fn );

}

live: function( types, data, fn ) { // 1.7から廃棄

jQuery( this.context ).on( types, this.selector, data, fn );

return this;

}

delegate: function( selector, types, data, fn ) {

return this.on( types, selector, data, fn );

}

★Event BindとEvent Delegate

Event Delegate(Bubble原理により)のメリット:メモリ消費小、追加したDOMも適用

JavaScript例

<div id="wrap">

<input type="button" value="ボタン1" />

<input type="button" value="ボタン2" />

</div>

var wrap = document.getElementById('wrap'),

var inputs = wrap.getElementsByTagName('input');

for (var i = 0, l = inputs.length; i < l; i++) {

inputs[i].onclick = function () {

alert(i); // ボタン押下:1, 1

}

}

// Closure版

for (var i = 0, l = inputs.length; i < l; i++) {

(function (cur) {

inputs[cur].onclick = function () {

alert(cur); // ボタン押下:0, 1

}

})(i);

}

// delegate版

wrap.onclick = function (event) {

var event = event || window.event,

var target = event.target || event.srcElement;

for (var i = 0, l = inputs.length; i < l; i++) {

if (inputs[i] === target) {

alert(i);

}

}

}

var newInput = document.createElement('input');

newInput.setAttribute('type', 'button');

newInput.setAttribute('value', 'ボタン3');

wrap.appendChild(newInput);

jQuery例

$(function(){

$('.ul a').click(function(e){

alert('xxx');

});

});

$(function(){

$('.ul').on('click', 'a', function(e){

alert('xxx');

});

});

$(document).on("click", "td", function(){

$(this).toggleClass("click");

});

$(document).off("click", "td");

★Event書き方の改良版

書き方1

$('.action').on('click', '#btn-add, #btn-del', function(){

if($(this).attr('id') == 'btn-add'){

...

} else{

...

}

});

書き方2

$('.action').coffee({

click: {

'#btn-add': function(){

...

},

'#btn-del': function(){

...

}

},

mouseenter: {

'#btn-sort': function(){

...

}

}

});

$.fn.coffee = function(obj){

for(var event in obj) {

for(var selector in obj[event]) {

$(this).on(event, selector, obj[event][selector]);

}

}

}

PS CSSも同様

書き方1

.action { width: 100%; color: #000; }

.action #btn-add { color: blue; }

.action #btn-del { color: red; }

書き方2

.action {

width: 100%;

color: #000;

#btn-add {

color: blue;

}

#btn-del {

color: red;

}

}