2009-07-22 6 views
56

У меня есть веб-страница, на которой я запретил действие по умолчанию для всех кнопок отправки, однако я хотел бы снова включить действие отправки по умолчанию на кнопку, как я могу это сделать?Как повторно использовать event.preventDefault?

я в настоящее время предотвращая действие по умолчанию, используя следующие:

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

Я успешно сделал это с помощью следующего:

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

Но я могу сделать это динамически при нажатии на кнопку?

+0

Возможный дубликат [как включить значение по умолчанию после события.preventDefault()?] (Http://stackoverflow.com/questions/1551389/how-to-enable-default-after-event-preventdefault) –

ответ

104

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

По просьбе

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

     ev.preventDefault(); 

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

    }); 
+0

Спасибо за ваш ответ, не могли бы вы привести мне пример того, как это сделать. – Richbits

+0

Спасибо, думал, что я пробовал это, но, очевидно, нет. – Richbits

+3

Одна из лучших вещей, которые нужно сделать, это просто вызвать preventDefault(), когда вам нужно, на основе условных выражений. Хотя это единственный реальный способ добиться именно того, что вы описали, я рекомендую вам убедиться, что это лучшее решение вашей проблемы. :) – Swivel

12

Либо вы делаете то, что 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; 
+0

Awewome простое решение! Это решило мою проблему включения/выключения поведения по умолчанию iOS для гибкой прокрутки тела и сохранения прокрутки некоторых элементов. Круто! – Garavani

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

    e.preventDefault(); 

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

typo 'ev' vs' e' и '$ (this) .trigger ('submit')' здесь будет выполняться в том же 'e.preventDefault()'. это плохой ответ. –

+0

@ i-- Спасибо! Я исправил его, это была опечатка – adardesign

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

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

function(e){ return true; } 

ура!

+0

Одна из проблем, которая заключается в том, что если все, что вы хотите сделать, занимает слишком много времени (например, сделать вызов Ajax), вы никогда не сможете достичь «return false» или «e.preventDefault()», если вы положите его после условного. – Casey

-3

Вы можете повторно активировать действия, добавив

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

Если добавить его к функции визуализации позвоночника зрения расслоение плотной, то вы можете использовать event.preventDefault(), как это требуется.

0

с асинхронными действиями (таймерами, 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); 
} 

Это наиболее полным способ перезапуска события с точно тем же данными.

Смежные вопросы