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
}
但它似乎没有正确传递..
答案 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);
答案 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;