簡體   English   中英

在if語句中添加多個EventListener

[英]add multiple EventListeners in if statement

是否可以在執行af函數之前檢查多個事件偵聽器?

以下代碼的目的是,當我單擊一個按鈕時,它隨后檢查是否兩個元素都被單擊,並放入一個箭頭。

我基本上想做的是檢查。 如果單擊(元素&&元素1),則應該在元素之間放入箭頭(在這種情況下,我使用圖片)。 有更好的方法嗎? 如果是,我應該采取哪種方式?

var el = document.getElementById("elements");
var el1 = document.getElementById("elements1");

document.getElementById("myBtn").addEventListener("click", function() {
    myFunction();
});    

function myFunction() {
    if (el.addEventListener && el1.addEventListener) {
        var arrow1 = document.getElementById("picture");
        alert("clicked"); //just to check if func is executed
    }
}

如果要檢查以前是否已單擊兩個框,則需要為每個框設置一個標志。 您可以通過幾種方法執行此操作,但一種方法是在每個按鈕的單擊處理程序中設置data- *屬性 然后,您可以在每個處理程序內部檢查這些數據屬性。

HTML

<button id="btn1">Button 1</button><button id="btn2">Button 2</button>

JavaScript的

var btn1 = document.getElementById('btn1');
var btn2 = document.getElementById('btn2');
btn1.addEventListener("click",checkClicks);
btn2.addEventListener("click",checkClicks);

function checkClicks(){
  this.dataset.clicked = 1;
  if(btn1.dataset.clicked == 1 && btn2.dataset.clicked == 1){
    //both were clicked do what is needed
  }
}

現在,既然您在列中提到了多個框,並在html中對它們進行了更多的設置,並且使用事件委托可以幫助使代碼保持較小。 例如,您可以再次使用data- *屬性並設置一個屬性以保存匹配元素的ID。 然后使用該ID來查找元素,並查看是否已單擊它:

HTML

<table>
  <tr>
    <td>
      <div id="box1" data-match="box5"></div>
      <div id="box2" data-match="box6"></div>
      <div id="box3" data-match="box7"></div>
      <div id="box4" data-match="box8"></div>
    </td>
    <td>
      <div id="box5" data-match="box1"></div>
      <div id="box6" data-match="box2"></div>
      <div id="box7" data-match="box3"></div>
      <div id="box8" data-match="box4"></div>
    </td>
  </tr>
</table>

JavaScript的

//Use event delegation so we only need a single event listener
//instead of multiple ones for each box
document.addEventListener("click",function(event){
  //get the box that was clicked
  var box = event.target;
  //set the clicked flag
  box.dataset.clicked = 1;

  //get the matching id for the other box from the data-match attribute
  var matchId = box.dataset.match;

  var box2 = document.getElementById(matchId);

  //don't really need the "box.dataset.clicked == 1" check
  //as we set it earlier, just have it here for clarity
  if(box.dataset.clicked == 1 && box2.dataset.clicked == 1){
    //do what needs done
  }
});

演示

 document.addEventListener("click", function(event) { var box = event.target; box.dataset.clicked = 1; var matchId = box.dataset.match; var box2 = document.getElementById(matchId); if (box2.dataset.clicked == 1) { //clear the click flags box.dataset.clicked = 0; box2.dataset.clicked = 0; //display that we have a match box.closest("tr").children[2].innerText = box.id + " matched to " + box2.id; } }); 
 div { border:1px solid rgba(0,0,0,0.3); padding:3px; } 
 <table> <tr> <td> <div id="box1" data-match="box5">box1</div> <div id="box2" data-match="box6">box2</div> <div id="box3" data-match="box7">box3</div> <div id="box4" data-match="box8">box4</div> </td> <td> <div id="box5" data-match="box1">box5</div> <div id="box6" data-match="box2">box6</div> <div id="box7" data-match="box3">box7</div> <div id="box8" data-match="box4">box8</div> </td> <td></td> </tr> </table> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM