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

时间:2010-07-19 03:31:56

标签: javascript jquery dom javascript-events cross-domain

我正在使用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()以简化问题。

3 个答案:

答案 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。