一尘不染

如何使用特定的假“事件”参数调用triggerHandler?

angularjs

我试图测试在链接上单击“ preventDefault”是否被调用。但是,我很难用我可以监视的对象来替换一个真实的“事件”对象:

这是触发点击事件的方式:

var e = jasmine.createSpyObj('e', [ 'preventDefault' ]);
$element.triggerHandler('click', [e]);

但是,在运行指令代码时,事件元素不会被伪造的事件元素替代:

$element.on('click', function(event) {
    console.log(event);
}

我尝试了不同的方法向触发器处理程序添加第二个参数-
作为数组,对象,只是一行,等等。都没有用。.同时没有太多的触发器处理程序示例和附加参数,所以我有点丢失…

提前致谢!


阅读 250

收藏
2020-07-04

共1个答案

一尘不染

文档说triggerHandler()将虚拟对象传递给处理程序:http
:
//docs.angularjs.org/api/ng/function/angular.element

如果检查源,则可以看到triggerHandler()创建了自己的事件对象,然后将第二个参数作为事件数据而不是实际事件对象传递:

https://github.com/angular/angular.js/blob/master/src/jqLit​​e.js#L882

相关代码:

var event = [{
  preventDefault: noop,
  stopPropagation: noop
}];

forEach(eventFns, function(fn) {
  fn.apply(element, event.concat(eventData));
});

我已经使用jQuery的内部事件模拟器来创建自己的事件。可能对您有用http :
//wingkaiwan.com/2012/09/23/triggering-mouse-events-with-jquery-simulate-
when-testing-in-javascript/

2020-07-04