Що протилежно evt.preventDefault ();


185

Як тільки я звільнив evt.preventDefault(), як я можу відновити дії за замовчуванням знову?


3
Я думаю, як правило, ваша функція працюватиме, і тоді буде виконуватися поведінка за замовчуванням, тому ви ніколи не зателефонуєте evt.preventDefault () в першу чергу
Прескотт,

1
Можливий дублікат? : stackoverflow.com/questions/1551389/…
Nobita

2
@Nobita - Я не дуже впевнений ... що стосується jQuery.
gilly3

1
Нічого, дякую за швидку відповідь! Моя проблема полягає в тому, що я не той, хто стріляє evt.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;}

ура!


8
Це працювало для мене, але мені цікаво, чи хтось може це пояснити трохи краще, чому?
границі

11
Це не скасовуєDefault (), адже воно робить те саме, як якщо б ви пропустили return true: нічого.
br4nnigan

19

Для обробки команди перед продовженням посилання з 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
Правильно, але це передбачає, що prevenDefault є посиланням, а не сказати touchmove на тілі документа.
Бангкокіян

4
Це не те запитання.
Метт Флетчер

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 = "button" та прив'язування до події клацання замість введення type = "submit" та прив'язування до події submit.
Strixy

8

ГАРАЗД ! він працює для події клацання:

$("#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 !

});


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/


4

Не існує протилежного способу event.preventDefault()зрозуміти, чому спочатку потрібно вивчити, що event.preventDefault()робить, коли ти його називаєш.

Під кришкою функціональність для prevenDefault по суті викликає помилку повернення, яка зупиняє подальше виконання. Якщо ви знайомі зі старими способами Javascript, колись у моді було використовувати false false для скасування подій у таких речах, як подання форми та кнопки з використанням true 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);

У наведеному вище коді ви помітите, що ми перевіряємо, чи разрешено дозволити подання. Це означає, що ми не дозволимо нашій формі подати користування, event.preventDefaultі тоді ми виконаємо певну логіку перевірки, і якщо ми будемо раді, встановимо дозвілSubmit на істинне.

Це дійсно єдиний ефективний метод робити протилежне 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");
  }
}

Ref: 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");
    }
});

Тепер, використовуючи простір імен, ви можете додати декілька цих подій і зможете видалити їх, залежно від ваших потреб .., хоча подання може бути не найкращим прикладом, це може стати в нагоді при натисканні або натисканні клавіші або будь-якому іншому ..


1

Це не пряма відповідь на питання, але це може допомогти комусь. Моя думка - ви лише зателефонуєте на попередні умови () на основі деяких умов, оскільки немає сенсу проводити подію, якщо ви викликаєте prevenDefault () для всіх випадків. Отже, якщо умови та виклик предотвращаютDefault () лише тоді, коли умова / и будуть виконані, функціонуватимуть звичайним чином для інших випадків.

$('.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

});


0

ви можете використовувати це після методу "предотвратиDefault"

// Тут evt.target повертає події за замовчуванням (наприклад: URL-адреса defult тощо)

var defaultEvent=evt.target;

// Тут ми зберігаємо подію за замовчуванням ..

if("true")
{
//activate default event..
location.href(defaultEvent);
}

0

Ви завжди можете використовувати це, що додається до якоїсь події клацання у вашому сценарії:

location.href = this.href;

Приклад використання:

jQuery('a').click(function(e) {
    location.href = this.href;
});

-1

цей код працював на мене для відновлення події після того, як я використав:

event.preventDefault(); to disable the event.


event.preventDefault = false;

-2

Я використав наступний код. Це прекрасно працює для мене.

$('a').bind('click', function(e) {
  e.stopPropagation();
});

2
Як пояснено в документації API jQuery , це запобігає появі бульбашки до дерева DOM, запобігаючи сповіщенню будь-яких батьківських обробників про подію. Це не те саме, що / або протилежне event.preventDefault();
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

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