『mousedown > blur > click』の検証 (jQuery)
要するに
下記を見てもらえれば、わかります。(検証用サンプル)
http://www.usamimi.info/~sutara/sample/for_question.php
経緯
キテるタグで、普段は省スペースだけど、フォーカスされたら領域が広がるテキストエリアを設置したくなり、作ってみました。
フォーカスされれば行数が8に、
他にフォーカスが移れば行数が2になります。
が、しかし問題が。
【jQuery】
$('#textarea1')
.focus(function(){ $(this).attr('rows', 8) })
.blur (function(){ $(this).attr('rows', 2) });
テキストエリアの下に送信ボタンを設置しているため、
マウスクリックで送信しようとするとclickよりもblurが優先される(※1)ため、
まずテキストエリアの収縮が始まり、それにつられて送信ボタンの位置もズレます。
そして、わずかに遅れてclickが実行されるのですが、
ボタンよりも遙か下をクリックしたと認識され、
送信処理が行われません。
※1 【参考】
http://www.usamimi.info/~sutara/sample/jq_event_priority.php
対症療法として、テキストエリアの収縮を『setTimeout()』で
遅らせれば解決します。
しかし、そんなスマートじゃないやり方では我慢できないため、
Yahoo!知恵袋で質問しました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1076953090
回答者の方が触れていた『focusin、focusout』という、
僕の頭の中にはなかった検索ワードを得たことで調査の幅が広がり、
いろんなことを発見しました。
- jQuery1.4から、focusin(), focusout()が追加された。
-
主に1.2系でjQueryを学んだ僕には、知らないメソッドでした。
focus, blurではできない、『バブリングしたイベントも捕捉する』ことができます。
http://stacktrace.jp/jquery/api/events/focusout(fn).html - relatedTargetが得られるのは、マウス系のイベントのみ
- blurでは得られない、とわかっただけでも収穫でした…(^ ^;)
そんなこんなで試行錯誤を続ける中で『mouseout > blur』なら
すべて解決するんじゃないかと予想し、試してみたらそのとおりでした。
『.click()』も、Tabキー+Enterキーで送信されたときのために必要です。
$('#submit_button')
.click(sendTweet)
.mousedown(sendTweet);
function sendTweet(){
...