交叉侦听多个事件并触发回调

时间:2017-04-07 11:24:16

标签: javascript arrays events data-structures

我有一个我需要监听的事件名列表,存储在数组中,如下所示:

var events = ['A', 'B'];

现在,我不确定哪个事件将首先触发,并且可能非常不一致(取决于他们等待的HTTP请求),所以我永远无法安全地只听其中一个。所以,我需要以某种方式"交叉倾听"所有这些都是为了触发我原来的回调。

所以我的想法是做以下事情:

  1. 为A创建一个侦听器,为B创建一个侦听器.B&#39的侦听器触发回调。
  2. 为B创建一个侦听器,为A创建一个侦听器。侦听器触发回调。
  3. 所以这会产生4个列表,看起来像这样(伪代码):

    var callback = function() { console.log('The callback'); };
    
    Event.on('A', function () {
        Event.on('B', callback);
    });
    
    Event.on('B', function () {
        Event.on('A', callback);
    });
    

    所以我相信这会解决我的问题(可能还有另一个问题,我在这里看不到)。

    问题是,当我只需要听2个事件时,我可以完成这个工作。但是当我有3-4个我想要的事件时,怎么样?#34; cross-listen"至?假设我们有['A', 'B', 'C', 'D']。这显然需要循环事件。这部分令我感到困惑,我不确定如何继续。这需要注册一个很好的事件组合。

    这需要在JavaScript中完成。

    在这种情况下,我的想象力和逻辑是有限的。

2 个答案:

答案 0 :(得分:1)

我在想这样的事情:



var callback = function() { console.log('The callback'); };
var events = {
  'click': false,
  'mouseover': false,
  'mouseout': false
};

for(prop in events) {
  $('.evt-button').on(prop, function(evt) {
    if(events[evt.type] === false) {
      console.log('First ' + evt.type + ' event');
      events[evt.type] = true;
      checkAll();
    }
  });
}

function checkAll() {
  var anyFalse = false;
  for(prop in events) {
    if(events.hasOwnProperty(prop)) {
      if(events[prop] === false) {
        anyFalse = true;
        break;
      }
    }
  }
  if(!anyFalse) {
    callback();
  }
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<button class="evt-button">The button</button>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

有很多方法可以做你要求的事情,但为了保持简单,你可以拥有一系列事件名称,就像你已经做的那样,只需删除它们,检查到看每次数组是否为空。像这样......

var events = ['A', 'B'];

var callback = function() { console.log('The callback'); };

var eventOccured = function(eventName) {
    // if the event name is in the array, remove it...
    var idx = events.indexOf(eventName);
    if (idx !== -1) {
        events.splice(events.indexOf(idx), 1);
    }

    // if the event array is empty then we've handled everything...
    calback();
};

Event.on('A', function () {
    // do whatever you need in the event handler
    eventOccured("A");
});

Event.on('B', function () {
    // do whatever you need in the event handler
    eventOccured("B");
});