Як відновити event.preventDefault?


80

У мене є веб-сторінка, на якій я заблокував дію за замовчуванням для всіх кнопок подання, однак я б хотів знову активувати дію за замовчуванням для кнопки, як я можу це зробити?

На даний момент я перешкоджаю дії за замовчуванням, використовуючи наступне:

$("form").bind("submit", function(e){
e.preventDefault();
});

Я успішно зробив це, використовуючи наступне:

$(document).ready(function(){
$("form:not('#press')").bind("submit", function(e){
e.preventDefault();
});

Але чи можу я це робити динамічно, коли натискаємо кнопку?


Відповіді:


123

Вам доведеться розв’язати подію та повторно прив’язати її до окремої події, яка не запобігаєDefault, або просто викликати подію за замовчуванням самостійно пізніше в методі після від’єднання. Немає магічної події.cancelled = false;

Як вимагалось

 $('form').submit( function(ev){

         ev.preventDefault();

         //later you decide you want to submit
         $(this).unbind('submit').submit()

  });

Дякую за вашу відповідь, не могли б ви навести приклад того, як це зробити.
Richbits

3
Одне з найкращих речей - це просто зателефонувати для запобігання затримці (), коли потрібно, на основі умов. Хоча це єдиний реальний спосіб досягти саме того, що ви описали, я закликаю вас перевірити, що це найкраще рішення вашої проблеми. :)
Поворот

Дякую за це. я зробив щось подібне на його основі, щоб змусити Google Analytics працювати.
Дерек,

Красиве, елегантне рішення. Дуже дякую!
Купер Маруяма,

1
@Swivelgames Гаразд, але те, що я маю на увазі, if (someLongRunningOperation()) {e.preventDefault();}може, безумовно, з цієї причини може провалитися; Я сам налагодив цю проблему незадовго до написання свого коментаря.
Кейсі

13

Або ви робите те, що пропонує redsquare із цим кодом:

function preventDefault(e) {
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now switching back
$("form#foo").unbind("submit", preventDefault);

Або ви призначаєте атрибут форми, коли дозволяється надсилання. Щось на зразок цього:

function preventDefault(e) {
    if (event.currentTarget.allowDefault) {
        return;
    }
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now allowing submissions on the form
$("form#foo").get(0).allowDefault = true;

Дивовижне просте рішення! Це вирішило мою проблему ввімкнення / вимкнення поведінки iOS за замовчуванням для еластичного прокручування тіла та збереження деяких елементів. Класно!
Garavani

5
function(e){ e.preventDefault();

і його протилежність

function(e){ return true; }

ура!


1
Одна проблема полягає в тому, що якщо все, що ви хочете зробити, триває занадто довго (наприклад, зробити виклик Ajax), ви ніколи не зможете досягти "return false" або "e.preventDefault ()", якщо ви ставите це після умовного.
Кейсі,

2
$('form').submit( function(e){

     e.preventDefault();

     //later you decide you want to submit
     $(this).trigger('submit');     or     $(this).trigger('anyEvent');

4
друкарська помилка evпроти eі $(this).trigger('submit')тут натрапить на те саме e.preventDefault(). це погана відповідь.
i--

@ i-- Дякую! Я виправив це, це була друкарська помилка
adardesign

1

За допомогою асинхронних дій (таймери, ajax) ви можете замінити властивість isDefaultPreventedтаким чином:

$('a').click(function(evt){
  e.preventDefault();

  // in async handler (ajax/timer) do these actions:
  setTimeout(function(){
    // override prevented flag to prevent jquery from discarding event
    evt.isDefaultPrevented = function(){ return false; }
    // retrigger with the exactly same event data
    $(this).trigger(evt);
  }, 1000);
}

Це найбільш повний спосіб повторного запуску події з точно такими ж даними.


0

Нещодавно у мене була подібна проблема. У мене була форма та функція PHP, яку слід запускати після подання форми. Однак спочатку мені потрібно було запустити javascript.

        // This variable is used in order to determine if we already did our js fun
        var window.alreadyClicked = "NO"
        $("form:not('#press')").bind("submit", function(e){
            // Check if we already run js part
            if(window.alreadyClicked == "NO"){
                // Prevent page refresh
                e.preventDefault();
                // Change variable value so next time we submit the form the js wont run
                window.alreadyClicked = "YES"
                // Here is your actual js you need to run before doing the php part
                xxxxxxxxxx

                // Submit the form again but since we changed the value of our variable js wont be run and page can reload (and php can do whatever you told it to)
                $("form:not('#press')").submit()
            } 
        });

-3

Ви можете повторно активувати дії, додавши

this.delegateEvents();  // Re-activates the events for all the buttons

Якщо ви додасте його до функції рендерингу магістрального js-подання, тоді ви можете використовувати event.preventDefault () за необхідності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.