Javascript のぼかしとクリック競合の解決

高洛峰
リリース: 2017-01-10 11:52:39
オリジナル
1628 人が閲覧しました

ブラーとクリックの競合を解決する

前書き:

開発中、ブラーとクリックの競合に頻繁に遭遇します。以下では、開発中によく遭遇する「ドロップダウン ボックス」の問題について説明し、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 サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート