javascript如何在以后触发本机点击操作(重播事件)?

我正在使用jQuery绑定页面上的所有链接(我正在使用’click’事件,但尝试了’mousedown’和’mouseup’的各种组合,以及bind()和live()无济于事)。

我可以拦截点击没问题(使用上述所有方法)。 我想要做的是通过GET请求发送一些数据,当它完成时,允许默认点击操作继续。

由于我在跨域通信,我必须使用GET而不是POST,因此无法进行同步调用。

因此,我必须从截获的点击事件返回’false’,将事件存储起来以供日后使用,然后在通信完成后再次手动触发它。 如果我返回true,则随着页面位置的改变,通信将在中途被切断。

问题是,我找不到以后触发本机点击事件的方法。

var storedEvent; $("#wrapper a").bind('click', function(event, processed) { $(event.target).unbind('click'); // temporary to make code branching easier storedEvent = event.target; event.stopPropagation(); $.ajax({ dataType: 'jsonp', data: linkData, jsonp: 'cb', url: 'xxx', cache: false, complete: function(response) { // How do I now go back and fire the native click event here? $(storedEvent).click(); } }); return false; } 

我尝试使用click()和trigger()指示,但都没有工作。

我知道提交成功了,代码正确分支 – 我调试了那么远。 我似乎无法重播该事件。

请注意,我不能做一些简单的事情,比如存储href并稍后设置window.location – 一些链接有自己的onClicks设置,而其他链接指定了varius目标。 我最好只是重播我之前停止的事件。

我开始使用带有live()的事件委托,并且除此之外还有一切工作 – 我已将其简化为bind()以简化问题。

您无法在锚点上触发点击事件并使其遵循href交叉浏览器。

最新答案: 是的,你可以 (假设你不再支持IE8)。

使用dispatchEvent()来触发原始事件的副本

首先,您需要一个实用程序函数来克隆事件(因为出于安全原因,浏览器只允许调度一次事件):

 var cloneNativeMouseEvent = function (original) { var copy; try { copy = new MouseEvent(original.type, original); } catch (stupidInternetExplorer) { copy = document.createEvent('MouseEvent'); copy.initMouseEvent(original.type, original.bubbles, original.cancelable, original.view, original.detail, original.screenX, original.screenY, original.clientX, original.clientY, original.ctrlKey, original.altKey, original.shiftKey, original.metaKey, original.button, original.relatedTarget) } return copy; }; 

在您的单击处理程序中存储对jQuery事件的引用,以便以后重放:

 $("#wrapper a").bind('click', function (event) { event.preventDefault(); storedEvent = event; ... } 

最后,在要再次触发点击的回调中,按以下步骤操作:

 var originalEventClone = cloneNativeMouseEvent(storedEvent.originalEvent); storedEvent.target.dispatchEvent(originalEventClone); 

请注意,通常,JavaScript创建或修改的事件被用户代理标记为“不信任”,因此它们无法触发默认操作。 幸运的是点击事件是唯一的例外。 (1)

事实certificateredsquare基本上是正确的 – 如果不撕掉你的头发它就行不通。

IE是问题所在。 dispatchEvent()在FireFox中工作正常。 在IE中,您可以选择fireEvent来触发任何相关事件(但不是点击),或者单击()(针对点击而不是事件),但是您无法正确执行这两项事件。

我通过暂时更改链接的href和目标来使其“几乎正常工作”,以便他们在iframe中加载空白页面。 然后,我听取了iframe“加载”事件,以确定链接的默认操作是否已发生。 在IE中,我可以在需要时触发“click”,否则在更改href和目标后触发“fireEvent”。

然而,这太糟糕了 – 如果其中一个链接有一个依赖于href属性的绑定事件呢? (thickbox似乎继续工作,但我认为这是一个竞争条件)。

最后我根本不需要这样做( JavaScript / jQuery:如何在用户离开页面之前确保跨域点击跟踪事件成功? ),所以我松了一口气。 事实certificate,在这种情况下我必须使用POST。