如何创建一个完美的假 jQuery 事件对象

How to create a perfect fake jQuery Event object

我正在对一个网站进行自动化测试,有些事件我无法在 - 特别是但不限于 - IE 中使用 javascript 正确触发。 (我正在使用 selenium,但所有其他选项都不起作用,所以 javascript 是我最后的希望)

事件的函数似乎在 jquery 事件对象中使用了很多字段,我尝试遵循 official jquery documentation 但是虽然它显示了大多数字段名称但没有显示如何填充它们(因为这不是你通常用它做的,但在我的情况下是)

我的问题如下:

为了伪造鼠标事件 我应该使用 jQuery.Event("event type",{param1:value1,param2:value2,...}) 填充 Event 对象的哪些字段(如何设置这些值) (或其他方法,如果有更有效的方法)

此事件对象将与 element.trigger('eventname',EventObject)

一起使用

您可以使用 trigger() 函数来实现此目的。 像这样触发事件

  $('.some_element').trigger("damn", {param1:"value1",param2:"value2"});

而且您可以在任何地方收听

$('.some_element').on("damn", function(e,obj){
console.log(obj.param1,obj.param2);
});

我希望这有效!!

//在JQuery

中创建一个Event对象
var event = jQuery.Event("damn");
event.param1 = "value1";
event.param2 = "value2";

//触发事件

 $( ".some_element" ).trigger( event );

//接收事件

$('.some_element').on("damn", function(e){
    console.log(e.param1,e.param2);
});

您是否阅读了这份 jQuery 文档 Triggering Event Handlers

摘录:

How can I mimic a native browser event, if not .trigger()?

In order to trigger a native browser event, you have to use document.createEventObject for < IE9 and document.createEvent for all other browsers. Using these two APIs, you can programmatically create an event that behaves exactly as if someone has actually clicked on a file input box. The default action will happen, and the browse file dialog will display.

The jQuery UI Team created jquery.simulate.js in order to simplify triggering a native browser event for use in their automated testing. Its usage is modeled after jQuery's trigger.

基本上,整个东西可以概括如下:

function Settings() {
  this.bubbles = true;
  this.cancelable = true;
  this.view = window;
  this.screenX = 0;
  this.screenY = 0;
  this.clientX = 1;
  this.clientY = 1;
  this.ctrlKey = false;
  this.altKey = false;
  this.shiftKey = false;
  this.metaKey = false;
  this.button = 0; /* Which mouse button was pressed */
  this.relatedTarget = null;
  return this;
}

function simulateMouseEvent(type, target, s) {
  var e = document.createEvent("MouseEvents");
  e.initMouseEvent(type, s.bubbles, s.cancelable, s.view, 0, s.screenX, s.screenY, s.clientX, s.clientY, s.ctrlKey, s.altKey, s.shiftKey, s.metaKey, s.button, s.relatedTarget);
  target.dispatchEvent(e);
}

var settings = new Settings, target = document.getElementById('myButton');

/* Try with something like this: */
simulateMouseEvent('mousedown', target, settings);
simulateMouseEvent('mouseup', target, settings);
simulateMouseEvent('click', target, settings);

来源:https://github.com/jquery/jquery-simulate/blob/master/jquery.simulate.js

此处描述了完整的参数列表:MouseEvent.initMouseEvent()