Подтвердить что ты не робот

Существует ли [универсальный] способ вызвать действие по умолчанию после вызова event.preventDefault()?

Этот вопрос предназначен для разработки плагинов jQuery и других самодостаточных фрагментов JavaScript, которые не требуют модификации других файлов script для обеспечения совместимости.

Мы все знаем, что event.preventDefault() предотвратит событие по умолчанию, чтобы мы могли запускать пользовательскую функцию. Но что, если мы хотим просто задержать событие по умолчанию, прежде чем вызывать его? Я видел различные трюки и обходные пути для конкретных случаев, чтобы повторно вызвать действие по умолчанию, но, как я уже сказал, мой интерес к универсальному способу повторного запуска по умолчанию и не относится к триггерам по умолчанию для case- в зависимости от случая.

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    e.invokeDefault(); // Imaginary... :(
});

Даже для чего-то простого, как представление формы, похоже, нет универсального ответа. Обходное решение $(selector).closest("form").submit() предполагает, что действие по умолчанию - стандартное представление формы, а не что-то неловкое, как функция __doPostBack() в ASP.NET. В конце вызова обратных вызовов ASP.NET это самое близкое к тому, что я пришел к универсальному решению "set-it-and-forget-it":

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    var javascriptCommand = e.currentTarget.attributes.href.nodeValue;
    evalLinkJs(javascriptCommand);
});


function evalLinkJs(link) {
    // Eat it, Crockford. :)
    eval(link.replace(/^javascript:/g, ""));
}

Я полагаю, что я мог бы начать писать специальные случаи для обработки обычных ссылок с перенаправлением window.location, но затем мы открываем целую новую червь червей - набирая все больше и больше случаев для вызова по умолчанию, возникает больше проблем, чем решения.

Итак, как насчет этого? У кого есть волшебная пуля, которую я искал?

4b9b3361

Ответ 1

Взгляните на это:

Вы можете попробовать

if(!event.mySecretVariableName) {
   event.preventDefault();
} else {
   return; // do nothing, let the event go
}

// your handling code goes here
event.originalEvent.mySecretVariableName = "i handled it";

if (document.createEvent) {
   this.dispatchEvent(event.originalEvent);
} else {
    this.fireEvent(event.originalEvent.eventType, event.originalEvent);
}

Используя этот ответ: Как вызвать событие в JavaScript? и ссылку на событие jQuery: http://api.jquery.com/category/events/event-object/

Отметьте объект события, который вы получаете, поэтому, если вы его снова получите, вы не выполняете цикл.

Ответ 2

Не вызывайте preventDefault() в первую очередь. Затем действие по умолчанию произойдет после обработчика событий.

Ответ 3

Это должно сработать. Тем не менее, я тестировал только firefox.

<html>
<head>
<script>
    window.addEventListener("click",handleClick,false);
    function handleClick(e){
        if (e.useDefault != true){
            alert("we're preventing");
            e.preventDefault();
            alert(e.screenX);
            //Firing the regular action
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(e.type,e.bubbles,e.cancelable);
            evt["useDefault"] = true;
            //Add other "e" attributes like screenX, pageX, etc...
            this.dispatchEvent(evt);
        }
        else{
            alert("we're not preventing");
        }
    }
</script>
</head>
<body>

</body>
</html>

Конечно, вам придется копировать все атрибуты старых переменных событий. Я просто не кодировал эту часть, но это должно быть легко.

Ответ 4

Это невозможно, как JamWaffles уже доказал. Простое объяснение, почему это невозможно: если вы повторно запускаете действие по умолчанию, ваш повторитель прослушивания событий снова и у вас есть бесконечный цикл.

И этот

click(function (e) {
    e.preventDefault();
    // Do custom code here.
    e.invokeDefault(); // Imaginary... :(
});

то же самое (с вашей мнимой функцией).

click(function (e) {
    // Do custom code here.
});

Кажется, что вы хотите манипулировать URL-адресом выбранного вами элемента. Если вы делаете это так, это просто отлично работает. Пример.

Ответ 5

Мне нужно было отключить кнопку после клика, а затем запустить событие по умолчанию, это мое решение

$(document).on('click', '.disabled-after-submit', function(event) {
    event.preventDefault();
    $(event.currentTarget).addClass('disabled');
    $(event.currentTarget).removeClass('disabled-after-submit');
    $(event.currentTarget).click();
    $(event.currentTarget).prop('disabled', true);
});