Javascript InvalidStateError:无法执行';调度事件';在';EventTarget';

Javascript InvalidStateError:无法执行';调度事件';在';EventTarget';,javascript,dom-events,Javascript,Dom Events,我试图在Javascript中伪造一个鼠标事件。下面是正在发生的事情: // Create event object var event = new CustomEvent('mousedown'); // Initialize event.initCustomEvent('mousedown', true, false, {}); // Inherit event = Object.create(event); event.pageX = 10; event.pageY = 10;

我试图在Javascript中伪造一个鼠标事件。下面是正在发生的事情:

// Create event object
var event = new CustomEvent('mousedown');
    
// Initialize
event.initCustomEvent('mousedown', true, false, {});

// Inherit
event = Object.create(event);
event.pageX = 10;
event.pageY = 10;
现在,发送

targetElement.dispatchEvent(event);
当我这样做时,我会得到错误:

错误:未能对“EventTarget”执行“dispatchEvent”:提供的事件为空


我做错了什么?

问题是这条线

event = Object.create(event);
显然,
dispatchEvent
期望事件对象具有某些自己的属性,但它找不到,因为它没有检查原型。然后它假设传递的对象不是格式良好的事件实例。因此出现了错误

我不确定您为什么要在prototype中使用原始事件创建新对象,如果没有此功能,一切都应该工作。

事件必须具有类型为的自有属性,继承的类型属性是不够的,这意味着类型被视为未定义,因此会出现错误

// Create event object
var event = new CustomEvent('mousedown', {bubbles: true, cancelable: false});

// initCustomEvent deprecated, see below

// Inherit
event = Object.create(event);
event.type = 'mousedown';
event.pageX = 10;
event.pageY = 10;
此错误还可能是对其他意外行为的警告,这些行为将源于您分派从事件继承而不是拥有自己属性的对象的方式

CustomEvent实例不是密封的,因此您始终可以直接向其添加属性

var ev = new CustomEvent('mousedown', {bubbles: true, cancelable: false});
ev.pageX = 10;
ev.pageY = 10;

请注意,该方法已弃用
,您应该在第二个参数中将此信息作为字典传递到构造函数中

var cev = new CustomEvent('mousedown', {bubbles: true, cancelable: false});

如果您不需要细节属性,请考虑使用事件而不是CufEngult


mousedown事件通常具有只读详细信息
0
(很少由代码检查)

我需要从事件obj继承,因为
pageX
pageY
是只读属性。
pageX
pageY
对于
CustomEvent
实例也是只读的。@dopatraman即使在分派之后,它们在CustomEvent实例上也不是只读的,
document.addEventListener('mousedown',function(e){e.pageX=10;console.log(e.pageX);})
后跟
document.body.dispatchEvent(new CustomEvent('mousedown',{bubbles:true,cancelable:false}));
将记录
10
但它们在MouseEvent实例中是只读的,这就是为什么我没有建议
新建MouseEvent(…)
var eev = new Event('mousedown', {bubbles: true, cancelable: false});
// cev as above, now consider
'detail' in cev; // true
cev.detail; // null
// vs
'detail' in eev; // false
eev.detail; // undefined