javascript Как позже вызвать собственное действие клика (событие воспроизведения)? - PullRequest
3 голосов
/ 19 июля 2010

Я использую 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 () и у меня все работало, кроме этого - я упростил его до привязки ()чтобы упростить задачу.

Ответы [ 3 ]

1 голос
/ 02 января 2018

Обновленный ответ: да, вы можете (при условии, что вы больше не поддерживает 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, помечаются как "ненадежные" пользовательскими агентами, поэтому они не могут запускать действия по умолчанию. К счастью, click события - единственное исключение. (1)

0 голосов
/ 19 июля 2010

Оказывается, красный квадрат в основном правильный - он не работает, не рвя волосы.

IE - это проблема.dispatchEvent () отлично работает в FireFox.В IE вы можете выбрать fireEvent для запуска любых связанных событий (но не клика), или click () (для кликов, но не для событий), но вы не можете сделать оба правильно.

Я получил это "почти работает »путем временного изменения ссылок и целей ссылок, чтобы они загружали пустую страницу в iframe.Затем я прослушал события iframe «load», чтобы определить, имело ли место действие ссылки по умолчанию.В IE я мог затем запустить «click», если необходимо, или «fireEvent» в противном случае, после изменения href и target назад.

Однако это было слишком много взлома - что если одна из ссылок имеетсвязанное событие, которое полагается на наличие атрибута href?(Thickbox, казалось, продолжал работать, но я ожидаю, что это было условие гонки).

В конце концов мне вообще не нужно было это делать ( JavaScript / jQuery: Как убедиться,Событие междоменного отслеживания кликов завершается успешно, прежде чем пользователь покидает страницу? ), поэтому я рад.Оказывается, мне пришлось использовать POST в этом случае.

0 голосов
/ 19 июля 2010

Вы не можете вызвать событие щелчка на привязке и заставить его следовать кросс-браузеру href.

...