前提・実現したいこと
特定の要素にchange
とblur
のイベントによる関数を重複して設定してます。
都合上、blur
イベントの処理を先にしてから、change
イベントの処理を後にする必要があるのですが、change
イベントが先になってしまいます。
イベント発生の順番を変更する方法などありますか?
例えば、数値フィールドにおいて3桁区切りの設定をしたり、編集中はカンマを外すことをblur
と
focus
でコントロールします。その後変更があった場合にchange
イベントをキャッチした上で、サーバーに送信するみたいな状況です。
該当のソースコード
html
1<html lang="ja"> 2 <head> 3 <meta charset="UTF-8"> 4 <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script> 5 <script src="sample.js"></script> 6 </head> 7 <body> 8 <div class="outer" id="outer"> 9 <div class="mid" id="mid"> 10 <div class="inner" id="inner"> 11 <input type="text" class="textfield" id="textfield"> 12 <input type="text" class="numberfield" id="numberfield" disabled="true"> 13 </div> 14 </div> 15 </div> 16 </body> 17</html>
javascript
1document.addEventListener('DOMContentLoaded', () => { 2 let numberWithComma = new Intl.NumberFormat(); 3 $(".textfield").on({ 4 "blur":(event) => { 5 console.log(event.currentTarget.id, event.type); 6 const v = event.target.value; 7 $("#numberfield").val(v); 8 $(this).val(numberWithComma.format(v)); 9 $("#textfield").val(numberWithComma.format(v)); 10 }, 11 "focus":function(){$(this).val($(this).val().replace(/[^0-9.-]/g, ""));} 12 }); 13 14 $('.outer').on({'change':(event) => { 15 console.log(event.currentTarget.id, event.type); 16 }}); 17 18 $('.mid').on({'change':(event) => { 19 console.log(event.currentTarget.id, event.type); 20 }}); 21 22 $('.inner').on({'blur':(event) => { 23 console.log(event.currentTarget.id, event.type); 24 }}); 25 26 const elements = document.querySelectorAll('.mid'); 27 elements.forEach(e => e.addEventListener('blur', (event) => {console.log(event.currentTarget.id, event.type);}, true)); 28 29});
試したこと
上記のサンプルソースでテキストフィールドをクリックしたのちフォーカスを外すと
javascript
1mid blur 2textfield blur
のログが出力されます。(イベントバブリング、イベントキャプチャで順番を制御したつもり)
テキストフィールドの内容を変更すると
javascript
1mid change 2outer change 3mid blur 4textfield blur
このようにchange
イベントが先に来てしまいす。
補足情報(FW/ツールのバージョンなど)
HTML5
jQuery 3.4
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。