【问题标题】:add multiple EventListeners in if statement在 if 语句中添加多个 EventListener
【发布时间】:2018-10-03 07:57:37
【问题描述】:

是否可以在执行 af 函数之前检查多个事件监听器?

以下代码的目的是,当我单击一个按钮时,它会检查两个元素是否被单击,并放入一个箭头。

我基本上想做的是检查。如果 (element && element 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
    }
}

【问题讨论】:

  • 你的意思是他们之前是否被点击过?因为您不能同时单击两个或多个元素。或者你的意思是他们只是设置了一些事件监听器?
  • 按钮被点击后,它应该检查元素是否被点击了随后。老实说,我什至不确定 eventlistener 是否适合我的情况,这只是我能想到的。我基本上需要链接到彼此的盒子
  • 我要列,每列有 10 个盒子。我正在尝试的是,将每个框与另一列中的匹配框匹配
  • 这 10 个盒子中……是 5 个链接对吗? A0 链接到 A1?还是很多人喜欢:A0 链接到[A1,B1,C1,D1,E1]
  • 多对多,一个盒子可以链接几个盒子。一个盒子可以接收许多箭头。 ...稍后我应该将其映射到数据库。

标签: javascript addeventlistener


【解决方案1】:

如果您要检查之前是否已单击这两个框,则需要为每个框设置一个标志。您可以通过多种方式执行此操作,但一种是在每个按钮的单击处理程序中设置 data-* attribute。然后,您可以在每个处理程序中检查这些数据属性。

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-* attributes 并设置一个属性来保存匹配元素的 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>

【讨论】:

  • 感谢您的回答,但如果没有预定义的数据匹配,我该怎么做。前任。如果我想将框 2 链接到 8 和 5。再次将框 4 链接到 6 和 8 和 5。我正在考虑使框可点击,但哪种事件处理程序/类型最适合?
猜你喜欢
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
相关资源
最近更新 更多