Что является противоположностью evt.preventDefault ();

185

После того, как я запустил evt.preventDefault(), как я могу возобновить действия по умолчанию снова?

Bryan
источник
3
Я думаю, что обычно ваша функция будет работать, а затем будет работать поведение по умолчанию, поэтому вы никогда не вызовете evt.preventDefault () в первую очередь
Prescott
1
Возможный дубликат? : stackoverflow.com/questions/1551389/… ..
Nobita,
2
@Nobita - я не уверен, что это специфично для jQuery.
gilly3
1
Вау, спасибо за быстрые ответы! Моя проблема заключается в том, что я не тот, кто запускает evt.preventDefault () ;. Я запускаю стороннее флеш-приложение в лайтбокс. Когда я закрываю лайтбокс, как-то останавливается колесо мыши для прокрутки страницы. Проведя некоторые исследования, я обнаружил, что это флэш-приложение отключает прокрутку страницы из-за функции масштабирования. Поэтому теперь я пытаюсь возобновить прокрутку страницы после закрытия приложения. Может быть, есть какой-то метод, который я могу вызвать, чтобы возобновить событие колеса мыши?
Брайан
1
Возможный дубликат Как включить event.preventDefault?
Ричард Эв

Ответы:

90

Согласно комментарию @Prescott, противоположность:

evt.preventDefault();

Может быть:

По сути, приравнивается к «сделать по умолчанию» , так как мы больше не препятствуем этому.

В противном случае я склонен указать вам ответы, предоставленные другими комментариями и ответами:

Как отменить привязку слушателя, который вызывает event.preventDefault () (используя jQuery)?

Как включить event.preventDefault?

Обратите внимание, что второй вариант был принят с примером решения, заданного redsquare (здесь размещено прямое решение, если оно не закрыто как дубликат):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});
Грант Томас
источник
Спасибо! Некоторое время я царапал голову (мне нужно было остановиться и проверить несколько вещей, прежде чем отправлять форму, не отправляя в определенных обстоятельствах, отправляя в других).
Кэтрин Осборн
1
Это работает, но я не понимаю, почему следующая форма отправки вызывает функцию снова, я думал, что это определенно отменит привязку, но похоже, что она отменяет привязку только для текущего вызова ... Я не могу объяснить это, это делает именно то, что я хочу, но это не то, что я ожидал.
Vadorequest
53
function(evt) {evt.preventDefault();}

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

function(evt) {return true;}

ура!

foxybagga
источник
8
Это сработало для меня, но мне интересно, если кто-нибудь может объяснить это немного лучше, почему?
кромки
11
Это не отменяет функцию protectDefault (), фактически она делает то же самое, как если бы вы опускали return true: nothing.
br4nnigan
20

Чтобы обработать команду перед продолжением ссылки из clickсобытия в jQuery:

Например: <a href="http://google.com/" class="myevent">Click me</a>

Предотвратите и выполните с помощью jQuery:

$('a.myevent').click(function(event) {
    event.preventDefault();

    // Do my commands
    if( myEventThingFirst() )
    {
      // then redirect to original location
      window.location = this.href;
    }
    else
    {
      alert("Couldn't do my thing first");
    }
});

Или просто беги window.location = this.href;заpreventDefault();

Брэдли Флуд
источник
3
Правильно, но это предполагает, что protectDefault - это ссылка, а не «touchmove» в теле документа.
Бангкок,
4
Это не то, что задал вопрос.
Мэтт Флетчер
1
Я знаю, что это не дает прямого ответа на вопрос, но я рад, что @Bradley ответил на это, потому что это решило мою проблему. :)
Jovanni G
8

Мне пришлось отложить отправку формы в jQuery, чтобы выполнить асинхронный вызов. Вот упрощенный код ...

$("$theform").submit(function(e) {
    e.preventDefault();
    var $this = $(this);
    $.ajax('/path/to/script.php',
        {
        type: "POST",
        data: { value: $("#input_control").val() }
    }).done(function(response) {
        $this.unbind('submit').submit();
    });
});
Бобби Пирсон
источник
Другим вариантом в этом сценарии может быть использование input type = "button" и привязка к событию click вместо использования input type = "submit" и привязка к событию submit.
Strixy
8

ХОРОШО ! это работает для события click:

$("#submit").click(function(e){ 

   e.preventDefault();

  -> block the click of the sumbit ... do what you want

$("#submit").unbind('click').click(); // the html click submit work now !

});
SNS Web
источник
4

Я хотел бы предложить следующий шаблон:

document.getElementById("foo").onsubmit = function(e) {
    if (document.getElementById("test").value == "test") {
        return true;
    } else {
        e.preventDefault();
    }
}

<form id="foo">
    <input id="test"/>
    <input type="submit"/>
</form>

... если я что-то упустил.

http://jsfiddle.net/DdvcX/

karim79
источник
4

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

Под капотом, функция для protectDefault по сути вызывает возврат false, который останавливает любое дальнейшее выполнение. Если вы знакомы со старыми способами Javascript, было когда-то в моде использовать return false для отмены событий в таких вещах, как отправка формы и кнопки, используя return true (до того, как jQuery появился даже вокруг).

Как вы, возможно, уже разработали, основываясь на простом объяснении выше: противоположность event.preventDefault()ничто. Вы просто не предотвращаете событие, по умолчанию браузер разрешит событие, если вы не запрещаете его.

Смотрите объяснение ниже:

;(function($, window, document, undefined)) {

    $(function() {
        // By default deny the submit
        var allowSubmit = false;

        $("#someform").on("submit", function(event) {

            if (!allowSubmit) {
                event.preventDefault();

                // Your code logic in here (maybe form validation or something)
                // Then you set allowSubmit to true so this code is bypassed

                allowSubmit = true;
            }

        });
    });

})(jQuery, window, document);

В приведенном выше коде вы заметите, что мы проверяем, имеет ли значение allowSubmit значение false. Это означает, что мы event.preventDefaultзапретим отправку нашей формы с использованием, а затем сделаем некоторую логику проверки, и, если мы довольны, установите для allowSubmit значение true.

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

Парта
источник
4

Вот что-то полезное ...

Прежде всего, мы перейдем по ссылке, запустим некоторый код, а затем выполним действие по умолчанию. Это будет возможно с помощью event.currentTarget. Посмотрите. Здесь мы попытаемся получить доступ к Google на новой вкладке, но прежде чем нам нужно будет запустить код.

<a href="https://www.google.com.br" target="_blank" id="link">Google</a>

<script type="text/javascript">
    $(document).ready(function() {
        $("#link").click(function(e) {

            // Prevent default action
            e.preventDefault();

            // Here you'll put your code, what you want to execute before default action
            alert(123); 

            // Prevent infinite loop
            $(this).unbind('click');

            // Execute default action
            e.currentTarget.click();
        });
    });
</script>
Рафаэль Ксавье
источник
2

Вот что я использовал для его установки:

$("body").on('touchmove', function(e){ 
    e.preventDefault(); 
});

И отменить это:

$("body").unbind("touchmove");
Джо Маклин
источник
2

Ни одно из решений не помогло мне здесь, и я сделал это, чтобы решить мою ситуацию.

<a onclick="return clickEvent(event);" href="/contact-us">

И функция clickEvent(),

function clickEvent(event) {
    event.preventDefault();
    // do your thing here

    // remove the onclick event trigger and continue with the event
    event.target.parentElement.onclick = null;
    event.target.parentElement.click();
}
Раза
источник
2

Я полагаю, что «противоположность» будет моделировать событие. Вы могли бы использовать.createEvent()

Следуя примеру Mozilla:

function simulateClick() {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
  var cb = document.getElementById("checkbox"); 
  var cancelled = !cb.dispatchEvent(evt);
  if(cancelled) {
    // A handler called preventDefault
    alert("cancelled");
  } else {
    // None of the handlers called preventDefault
    alert("not cancelled");
  }
}

Ссылка: document.createEvent


jQuery имеет .trigger()так что вы можете запускать события на элементах - иногда полезно.

$('#foo').bind('click', function() {
      alert($(this).text());
});

$('#foo').trigger('click');
Гари Грин
источник
1

jquery on () может быть другим решением этой проблемы. особенно когда речь идет об использовании пространств имен .

jquery on () - это просто текущий способ привязки событий (вместо bind ()). off () это отменить привязку. и когда вы используете пространство имен, вы можете добавлять и удалять несколько различных событий.

$( selector ).on("submit.my-namespace", function( event ) {
    //prevent the event
    event.preventDefault();

    //cache the selector
    var $this = $(this);

    if ( my_condition_is_true ) {
        //when 'my_condition_is_true' is met, the binding is removed and the event is triggered again.
        $this.off("submit.my-namespace").trigger("submit");
    }
});

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

honk31
источник
1

Это не прямой ответ на вопрос, но может кому-то помочь. Моя точка зрения заключается в том, что вы можете вызывать warnDefault () только на основании некоторых условий, поскольку не имеет смысла иметь событие, если вы вызываете warnDefault () для всех случаев. Таким образом, наличие условий if и вызов метода protectDefault () только тогда, когда выполняется условие / условия, будут работать в обычном режиме для других случаев.

$('.btnEdit').click(function(e) {

   var status = $(this).closest('tr').find('td').eq(3).html().trim();
   var tripId = $(this).attr('tripId');

  if (status == 'Completed') {

     e.preventDefault();
     alert("You can't edit completed reservations");

 } else if (tripId != '') {

    e.preventDefault();
    alert("You can't edit a reservation which is already attached to a trip");
 }
 //else it will continue as usual

});

Peck_conyon
источник
0

Вы можете использовать это после метода "protectDefault"

// Здесь evt.target возвращает событие по умолчанию (например, defult url и т. Д.)

var defaultEvent=evt.target;

// Здесь мы сохраняем событие по умолчанию ..

if("true")
{
//activate default event..
location.href(defaultEvent);
}
user3631514
источник
0

Вы всегда можете использовать это, прикрепленное к некоторому событию click в вашем скрипте:

location.href = this.href;

Пример использования:

jQuery('a').click(function(e) {
    location.href = this.href;
});
kkatusic
источник
-1

этот код работал для меня, чтобы восстановить экземпляр события после того, как я использовал:

event.preventDefault(); to disable the event.


event.preventDefault = false;
LCMr_music
источник
-2

Я использовал следующий код. Он отлично работает для меня.

$('a').bind('click', function(e) {
  e.stopPropagation();
});
VeeraPrasad
источник
2
Как объясняется в документации по API jQuery , это предотвращает всплытие события в дереве DOM, предотвращая уведомление любых родительских обработчиков о событии. Это не то же самое, что / или противоположность event.preventDefault();
ʙᴀᴋᴇʀ ʙᴀᴋᴇʀ
2
Это не то, что задал вопрос.
Мэтт Флетчер