jQuery触发器事件,但仍然有event.isTrigger false
jQuery提供了一个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 }
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 {
}
}