第11回勉強会 (若手IT勉強会)に行ってきました。
2回目にしてまとめ記事が一気に適当になった気がしますが気にしない。
(第一回まとめ)
・jQueryはnative event呼ぶ機能無い
$0.addEventListener('click', function () { console.log(1) }, false);
$($0).click();
>>> consoleには1が表示されない
・独自イベントは処理の切り出しには便利だけど、どう切り出すかが微妙に難しいのでちょっと使いにくいかも
イベント伝播中心で組むのはどこにどの処理が割り当てられてるかわかりにくいので後々不要な処理が残りやすい気がする
(イベントが階層化できないので)
・sizzleは本家もほとんどコメント無いなぁ。。。
最近複雑な正規表現書くときはこんな感じにしてる。
mosix = function () {
var result = '';
$.each(Array.prototype.slice.call(arguments), function () {
result += this.test ? (this + '').replace(/^\/|\/\w*$/mg, '') : this;
});
return new RegExp(result);
};
mosix(
// schema
'^http://',
// domain
/\w+\.\w+\.\w+/,
// path
'/$'
).test(location.href);
まだそんなに試してないけど、それなりにいける気がする。
・elementsにsetInterval定義してevents貼り付けるとその要素はwindowとして解釈される
$0.setInterval = true;$($0).click(function () { console.log(1) });
>>> どこクリックしても1が表示される
まあ、そんなことしないと思うけど。
・event handlerに同じファンクションを2回設定しても1回しか呼び出されない。
function hoge () { console.log(1); };
$($0).click(hoge).click(hoge).click(hoge).click();
>>> 1しか表示されない
この場合、hoge.guidをdeleteすれば再度呼び出される。
・namespaceは複数設定可能
$('a').bind('click.hoge.huga')とか
・namespace指定でtrigger可能 ただし、triggerはevent名を省略できない
($('a').trigger('click.hoge')はOK $('a').trigger('.hoge')はNG)
・Array().slice().sort()はArray().concat().sort()と一緒
日破壊的なsortをしたいとき用。
concatで書いてくれればわかったのに。。。
・live eventのbindを使った貼り付け方。もちろんこっちからやるのは非推奨だと思う。
jQuery(document).bind('live.click.a', function () { alert(1) })
// 'live.event name.selector'。selectorは.を`にスペースを|に置き換える。
・こんな感じでそのイベント全体の初期化処理を挟める(イベント貼る毎に呼び出される?)
jQuery.event.special['click'] = { 'setup' : function () { console.log('setup'); } };
$($0).click(function () { console.log('click'); });
>>> setup
//'setup'のほかに'teardown'ってのも定義できるらしいけど、こっちはいつ呼ばれるのか不明
//(unbindしても呼ばれなかった。コードを読む分には呼ばれそうだけど。。。)
・safariのデバッガーはfirebugよりいいかも。
慣れてるからfirebug使うけど、safariも使っていいかも
・Fxのevent.originalEvent.timeStampはかなりむちゃくちゃな時間を返す。
$($0).click(function (e) { console.log(e.timeStamp, e.originalEvent.timeStamp) })
>>> 1252824662619 87914218
ブラウザ起動後の時間?PC起動後とかかも
・$('a:first').bind('click.abcaaaa.def', function () { alert(1) }).trigger('click.abc.def');
=>alert(1)
jQueryのバグっぽい(1.3.2)
2679行がおかしい。joinの正規表現を".*\\."ではなく、"\\..*\\."にして、handler.type.split(/\./).join('._.')みたいなコードを挟むと直る気がする
ただし、これが発生するのは複数ネームスペース指定してて、呼び出し時にソートして左側に来るイベントに余計な名前がくる場合だけ
2週間前に報告済みだった。http://dev.jquery.com/ticket/5138
ただ、この解決方法は微妙すぎるので、本家で華麗に修正されるのを待とう。
('._.')('._.')('._.')('._.')('._.')
その他
・遅刻しました。すいません。でもちょうどよかったです。
・懇親会でいろいろ聞けて楽しかった。
・勉強会自体はもうちょっと先まで読みたかったかも。結局remove周りは読めなかったので。。。
・javascript ninjaは結構読んで見たい。
・大根おいしかった。