ブラーとクリックの競合を解決する
前書き:
開発中、ブラーとクリックの競合に頻繁に遭遇します。以下では、開発中によく遭遇する「ドロップダウン ボックス」の問題について説明し、2 つの解決策を提供します。
1. ブラー イベントとクリック イベントの簡単な説明
ブラー イベント: 要素がフォーカスを失ったときにブラー イベントがトリガーされます。ブラー イベントとフォーカス イベントはバブルアップされません。
クリック イベント: 要素がクリックされるとクリック イベントがトリガーされ、すべての要素にこのイベントが発生し、バブリングが発生します。
例 1: ブラー イベントはフォーム イベントです
<input type="text" id="tel"> <script> document.addEventListener("blur", function(){ console.log("my document blur"); }); var ipt = document.getElementById("tel"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); </script> // 输出结果:document为非表单元素 my input blur
例 2: click イベントはバブルする可能性があります
<input type="text" id="tel"> <script> document.addEventListener("click", function(){ console.log("my document click"); }); var ipt = document.getElementById("tel"); ipt.addEventListener("click", function(){ console.log("my input click"); }); </script> // 输出结果: my input click my document click
例 3: 要素をクリックすると、前の要素がフォーカスを失い、ブラーイベントはクリックイベントより優先されます
<input type="text" id="ipt"> <input type="button" id="btn" value="点我"> <script> var ipt = document.getElementById("ipt"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); var btn = document.getElementById("btn"); btn.addEventListener("click", function(){ console.log("my button click"); }); </script> // 输出结果: my input blur my button click
2. ドロップダウンボックスのブラーイベントとクリックイベントが競合し、値を正常に選択できなくなる
実際の開発ではよく遭遇しますドロップダウン リスト ボックス。リスト ボックスを非表示にするには、他の要素をクリックします。有効にするには、ドロップダウン ボックス要件のサブ要素をクリックします。これは競合の問題につながります。
<!-- DOM结构示意 --> <input type="text" placeholder="请选择姓氏" readonly> <div class="search-list" data-status="hide"> <ul> <li><a href="javascript:">赵</a></li> <li><a href="javascript:">钱</a></li> <li><a href="javascript:">孙</a></li> <li><a href="javascript:">李</a></li> </ul> </div>
/** 说明: * 目前通过ul外层div自定义属性“data-status”控制其是否显示 */ (function($){ $("input").focus(function(){ // input框获取焦点,展示下拉框 $(".search-list").attr("data-status", "show"); }).blur(function(){ // input框失去焦点,隐藏下拉框 $(".search-list").attr("data-status", "hide"); }); // 选择对应选项,并赋值给input框 $(".search-list li a").click(function(){ console.log("执行"); $("input").val($(this).text()); }); })(jQuery);
上記コードを実行すると問題が発生し、ドロップダウンボックスの特定の値が正しく取得できなくなります。
理由: JavaScript はシングルスレッドであるため、同時に処理できるイベントは 1 つだけです。上記の例 3 から、「クリックの実行よりもぼかしが優先される」ことがわかります。この例では、ブラー ハンドラーが対応するドロップダウン ボックスの表示領域を非表示にするため、後続のクリック イベントは実行されません。上記コンソール情報は出力されません。
解決策 1: ぼかしイベントを遅らせ、最初にクリックを実行させます。
(function($){ $("input").focus(function(){ // input框获取焦点,展示下拉框 $(".search-list").attr("data-status", "show"); }).blur(function(){ setTimeout(function(){ // input框失去焦点,隐藏下拉框 $(".search-list").attr("data-status", "hide"); }, 300); }); // 选择对应选项,并赋值给input框 $(".search-list li a").click(function(){ console.log("执行"); $("input").val($(this).text()); }); })(jQuery);
3. 優先順位を付けるには、mousedown を使用します
例 4: 例 3 のクリック イベントを、mousedown に変更します
<input type="text" id="ipt"> <input type="button" id="btn" value="点我"> <script> var ipt = document.getElementById("ipt"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); var btn = document.getElementById("btn"); btn.addEventListener("mousedown", function(){ console.log("my button mousedown"); }); </script> // 输出结果: my button mousedown my input blur
mousedown イベント: マウス ポインターが要素上に移動し、[When] を押したときマウスボタンが押されると、mousedown イベントが発生します。
mouseup イベント: 要素上でマウス ボタンが放されると、mouseup イベントが発生します。
注:
(1) マウスダウン イベントはクリック イベントとは異なります。マウスダウン イベントはキーを押すだけで発生し、キーを離す必要はありません。
(2) マウスアップ イベントはクリック イベントとは異なり、ボタンを緩めるだけです。このイベントは、マウス ポインターが要素上にあるときにマウス ボタンが放されると発生します。
追加: マウスダウン、マウスアップ、クリック
つまり、実行順序は次のとおりです:
マウスダウン >> マウスアップ >> 解決策 2: クリック イベントをマウスダウンに変更します。ブラーイベントよりも優先させてください
<input type="button" id="btn" value="点我"> var btn = document.getElementById("btn"); btn.addEventListener("mousedown", function(){ console.log("my button mousedown"); }); btn.addEventListener("click", function(){ console.log("my button click"); }); btn.addEventListener("mouseup", function(){ console.log("my button mouseup"); }); 输出结果: my button mousedown my button mouseup my button click
読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトのサポートに感謝します!
JavaScript のぼかしとクリック競合の解決に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。