Heim  >  Artikel  >  Web-Frontend  >  Lösung zur Lösung von Javascript-Unschärfe- und Klickkonflikten

Lösung zur Lösung von Javascript-Unschärfe- und Klickkonflikten

高洛峰
高洛峰Original
2017-01-10 11:52:391580Durchsuche

Den Konflikt zwischen Unschärfe und Klick lösen

Vorwort:

In der Entwicklung stoßen wir häufig auf Konflikte zwischen Unschärfe und Klick. Im Folgenden werden die bei der Entwicklung häufig auftretenden „Dropdown-Box“-Probleme beschrieben und zwei Lösungen bereitgestellt.

1. Kurze Beschreibung der Unschärfe- und Klickereignisse

Unschärfeereignis: Das Unschärfeereignis wird ausgelöst, wenn das Element den Fokus verliert. Es handelt sich um ein Formularereignis. Unschärfe- und Fokusereignisse werden nicht angezeigt Formveranstaltungen werden Can.

Klickereignis: Ein Klickereignis wird ausgelöst, wenn auf ein Element geklickt wird. Alle Elemente verfügen über dieses Ereignis, was zu Blasenbildung führt.

Beispiel 1: Das Unschärfeereignis ist ein Formularereignis

<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

Beispiel 2: Das Klickereignis kann Blasen bilden

<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

Beispiel 3: Ein Klick auf ein Element führt dazu, dass das vorherige Element den Fokus verliert und das Unschärfeereignis Vorrang vor dem Klickereignis hat

<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. Die Unschärfe- und Klickereignisse des Dropdown-Felds führen dazu, dass Werte normalerweise nicht ausgewählt werden können.

In der tatsächlichen Entwicklung stoßen wir häufig auf ein Dropdown-Feld. Klicken Sie auf andere Elemente, um das Listenfeld auszublenden. Klicken Sie auf das Unterelement des Dropdown-Felds, um es auszublenden. Dies wird zu Konfliktproblemen führen.

<!-- 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);

Beim Ausführen des obigen Codes tritt ein Problem auf und ein bestimmter Wert im Dropdown-Feld kann nicht korrekt abgerufen werden.

Grund: Da JavaScript Single-Threaded ist, kann es jeweils nur ein Ereignis verarbeiten. Aus dem obigen Beispiel 3 können wir erkennen, dass „Unschärfe Vorrang vor der Klickausführung hat“. Da in diesem Beispiel der Unschärfe-Handler den entsprechenden Anzeigebereich des Dropdown-Felds ausblendet, wird sein nachfolgendes Klickereignis nicht ausgeführt. Die oben genannten Konsoleninformationen werden nicht ausgegeben.

Lösung 1: Verzögern Sie das Unschärfeereignis und lassen Sie es zuerst ausführen.

(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. Verwenden Sie Mousedown, um ihm Priorität zu geben

Beispiel 4: Ändern Sie das Klickereignis in Beispiel 3 in 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-Ereignis: Wenn der Mauszeiger über das Element bewegt und die Maustaste gedrückt wird, tritt das Mousedown-Ereignis auf.

Mouseup-Ereignis: Das Mouseup-Ereignis tritt auf, wenn die Maustaste auf einem Element losgelassen wird.

Hinweis:

(1) Das Mousedown-Ereignis unterscheidet sich vom Click-Ereignis. Das Mousedown-Ereignis erfordert nur das Drücken der Taste und muss nicht losgelassen werden auftreten.
(2) Das Mouseup-Ereignis unterscheidet sich vom Click-Ereignis. Das Mouseup-Ereignis erfordert nur das Entspannen der Schaltfläche. Dieses Ereignis wird ausgelöst, wenn die Maustaste losgelassen wird, wenn sich der Mauszeiger über dem Element befindet.

Ergänzung: Mousedown, Mouseup, Klick

<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

Die Ausführungsreihenfolge lautet also:

MouseDown >> MouseUp >> Click

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung dieser Website!

(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").mousedown(function(){
    $("input").val($(this).text());
  });
})(jQuery);
Weitere Artikel zur Lösung von Javascript-Unschärfen und Klickkonflikten finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn