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

jQuery触发器事件,但仍然有event.isTrigger false,jquery,unit-testing,events,Jquery,Unit Testing,Events,jQuery提供了一个isTrigger属性,它允许我们知道事件是“真实事件”还是仅“触发” 出于单元测试目的,是否有方法触发事件并以某种方式覆盖isTrigger属性。。在事件中,回调的行为(通过使用isTrigger===false)仍然像是一个真实的点击事件。。 正在尝试以下代码: var triggerClick = jQuery.Event("click", { isTrigger:false, data:{ isTrigger:false }

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

出于单元测试目的,是否有方法触发事件并以某种方式覆盖
isTrigger
属性。。在事件中,回调的行为(通过使用
isTrigger===false
)仍然像是一个真实的点击事件。。 正在尝试以下代码:

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

但是它似乎没有正确地传递它。

本地方式如何,完全避免jQuery iStriger:

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

如果您关心事件是由用户还是由代码触发的,也许您应该提取一个方法并直接调用该方法。然后,您可以添加一个
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传入,以测试所需的行为。这也从测试中消除了浏览器行为的依赖性,这是一件好事。

@adeneo的回答给了我错误。(未捕获的TypeError:未能在“MouseEvent”上执行“initMouseEvent”:参数4不是“Window”类型。)

此方法对我有效(尽管isTriggered未定义,不是false)

$('myBtn')。在('click',函数(e)上{
警报('isTrigger:'+e.isTrigger)
});
var事件=新事件(“单击”);
$(“#myBtn”)[0]。dispatchEvent(事件)


一般来说,这是一个好主意,但为什么仅仅为了测试而过度模块化代码,如果它能以更好的方式实现这一目的……我认为这种方法比模拟用户点击更清晰。这消除了不必要的事件处理程序触发,并允许您直接调用所需的功能。它不仅可能更有效,而且更容易阅读。
$(ele).on("click", function(e){
    doWork($(this), e, true);
}

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

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