在javascript / jquery中克隆事件对象

如何创建一个完全独立的新事件对象,其中包含与给定事件对象e相同的所有属性。 到目前为止,我已尝试过以下但没有运气:

function myHandler(e) { // ... e = e.originalEvent; // method 1 var e2 = jQuery.extend(true, {}, e); // method 2 var e2 = JSON.parse(JSON.stringify(e)); // ... } 

编辑:我将添加更多细节,以帮助澄清。 非常类似于我想要做的这个问题 :div.dispatchEvent(e.originalEvent),但这样做导致:

  DISPATCH_REQUEST_ERR:DISPATCH_REQUEST_ERR:DOM事件例外1 

所以为了避免这种情况,我需要复制事件对象。 但是,此事件对象不是特定对象(即,有时e是触摸启动,触摸移动或触摸),因此如果我可以获得通用克隆function而不仅仅是对特定属性进行硬编码会更容易。 我的意思是“没有运气”是通过尝试上述方法并通过调度function发送我得到错误。 希望这有助于澄清一点。

我用这段代码“祝你好运”:

 $.extend($.Event(event.type /* click, mousedown, touchstart, ect. ect. */), { which: 1, clientX: event.clientX, clientY: event.clientY, pageX: event.pageX, pageY: event.pageY, screenX: event.screenX, screenY: event.screenY }); 

显然,这就是一切; 但是你可以在另一个对象中添加你真正需要的东西。 我在这里创建了一个新事件,因为我实际上是将一个事件转发给另一个元素。


更新

我使用jQuery Touch Punch插件 ,它基本上将点击/鼠标事件映射到相关的触摸事件:touchstart,touchesmoved,touchend。 因此,如果您将此事件转发为鼠标事件:

 var newEvent = $.extend($.Event(event.type), { which: 1, clientX: event.clientX, clientY: event.clientY, pageX: event.pageX, pageY: event.pageY, screenX: event.screenX, screenY: event.screenY }); // touch punch will convert to a touch event if needed $('.some-other-element').trigger(newEvent); 

您只需在页面上包含触摸打孔脚本即可。 这也将允许jQuery UI元素在触摸设备上运行。

引用:

  • jQuery事件构造函数
  • jQuery触发器

这里的答案,标记为“ 只是传入原生事件论证 ”,

 function (e) { var $event = $.Event(e.type, e); } 

如果要更改事件类型,则无效:jQuery将使用您传递的事件对象中的事件类型替换指定的事件类型参数。 因此,这种方法仅作为精确克隆事件对象的方法。 这样做时,我建议使用null代替事件类型参数,作为严格克隆事件的语义提示:

 function (e) { var event = $.Event(null, e); // clone event } 

当然,您可以随时在克隆后更改事件的类型值:

 function (kind, e) { var event = $.Event(null, e); // clone event event.eventType = kind; return event; } 

只需传入本机事件参数即可

 function (e) { var $event = $.Event(e.type, e); } 

因为您可以手动设置的所有属性已经存在于本机事件参数中,并且因为$.Event()构造函数将对象作为其第二个参数,所以您可以简单地将本机事件参数传递给它。

注意:您必须单独传入事件类型作为第一个参数才能工作,否则jQuery将只将事件对象存储在$event.originalEvent

 var eDemo = jQuery.Event("eventhandler", { target: e.currentTarget, relatedTarget: e.relatedTarget, pageX: e.pageX, pageY: e.pageY, which: e.which, }); var newObject = jQuery.extend(true, {}, eDemo);// deep copy 

Checkout Jquery事件构造 – > http://api.jquery.com/category/events/event-object/