我正在使用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()以简化问题。
答案 0 :(得分:1)
最新答案:是的,您可以(假设您不再支持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)
答案 1 :(得分:0)
您无法在锚点上触发点击事件并使其遵循href交叉浏览器。
答案 2 :(得分:0)
事实证明,redsquare基本上是正确的 - 如果不撕掉你的头发就行不通。
IE是问题所在。 dispatchEvent()在FireFox中运行正常。在IE中,您可以选择fireEvent来触发任何相关事件(但不是点击),或者点击()(针对点击而不是事件),但是您无法正确执行这两项事件。
我通过暂时更改链接的href和目标使其“几乎正常工作”,以便他们在iframe中加载空白页面。然后,我听取了iframe“加载”事件,以确定链接的默认操作是否已发生。在IE中,我可以在需要时点击“click”,否则在更改href和目标后点击“fireEvent”。
然而,这太糟糕了 - 如果其中一个链接有一个依赖于href属性的绑定事件呢? (thickbox似乎继续工作,但我认为这是竞争条件)。
最后我根本不需要这样做(JavaScript/jQuery: How to make sure cross-domain click tracking event succeeds before the user leaves the page?),所以我松了一口气。事实证明,在这种情况下我必须使用POST。