jQuery触发器事件但仍然有event.isTrigger false

时间:2013-05-14 15:32:07

标签: jquery unit-testing events

jQuery提供了一个isTrigger属性,它允许我们知道事件是“真实事件”还是只是“触发”。

$(ele).on("click", function(e){
    if(e.isTrigger){
       // this event was only triggered, not a real event 
    }else{
      // this was a real event 
    }
}) 

对于单元测试目的,是否有办法trigger一个事件并以某种方式覆盖isTrigger属性..并且在事件中回调仍然表现为(通过isTrigger === false)为如果它是一个真正的点击事件.. 正在尝试以下代码:

var triggerClick = jQuery.Event("click", {
    isTrigger:false,
    data:{
        isTrigger:false
    }

但它似乎没有正确传递..

3 个答案:

答案 0 :(得分:5)

本机方式如何,完全避免使用jQuery isTrigger:

function simulateClick(elem) {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, elem,
          0, 0, 0, 0, 0, false, false, false, false, 0, null);
  if (document.createEvent) {
     elem.dispatchEvent(evt);
  } else {
     elem.fireEvent("on" + evt.eventType, evt); // support for IE crap
  }
}

要使用它,您只需:

$(ele).on("click", function(e){
    if(e.isTrigger){
       // this event was only triggered, not a real event 
       console.log('triggered');
    }else{
       // this was a real event 
       console.log('clicked');
    }
});

simulateClick(ele);

FIDDLE

答案 1 :(得分:1)

如果您担心某个事件是由用户还是代码触发,也许您应该提取一个方法并直接调用该方法。然后,您可以添加userTriggered参数并传递true或false。

$(ele).on("click", function(e){
    doWork($(this), e, true);
}

doWork($(ele), null, false);

function doWork(item, e, userTriggered)
{
    if(userTriggered) {
    }
    else {
    }
}

然后,当您测试doWork方法时,可以将userTriggered作为true或false传入,以测试所需的行为。这也消除了浏览器行为对测试的依赖性,这是一件好事。

答案 2 :(得分:1)

@ adeneo的答案给了我错误。(未捕获TypeError:无法执行' initMouseEvent' on' MouseEvent':参数4不属于' Window& #39;)

这个方法对我有用(虽然isTriggered是未定义的,不是假的)



$('#myBtn').on('click', function(e){
  alert('isTrigger: ' + e.isTrigger)
});

 var event = new Event('click');
$( "#myBtn" )[0].dispatchEvent(event);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" id="myBtn">dude</a>
&#13;
&#13;
&#13;