Apa kebalikan dari evt.preventDefault ();

185

Setelah saya memecat seorang evt.preventDefault(), bagaimana saya bisa melanjutkan tindakan standar lagi?

Bryan
sumber
3
Saya pikir biasanya fungsi Anda akan berjalan dan kemudian perilaku default akan berjalan, jadi Anda tidak akan pernah memanggil evt.preventDefault () di tempat pertama
Prescott
1
Kemungkinan duplikat? : stackoverflow.com/questions/1551389/…
Nobita
2
@Nobita - Saya tidak begitu yakin ... yang khusus untuk jQuery.
gilly3
1
Wow, terima kasih untuk tanggapan cepat! Masalah saya adalah, bahwa saya bukan orang yang menembakkan evt.preventDefault () ;. Saya menjalankan aplikasi flash pihak ke-3 di dalam lightbox. Ketika saya menutup lightbox, entah bagaimana roda mouse saya untuk menggulir halaman berhenti. Dalam melakukan riset, saya menemukan bahwa aplikasi flash ini menonaktifkan pengguliran halaman karena fitur zoom. Jadi sekarang saya mencoba untuk melanjutkan pengguliran halaman setelah aplikasi ditutup. Mungkin ada beberapa metode yang bisa saya panggil untuk melanjutkan acara roda mouse?
Bryan

Jawaban:

90

Seperti yang dikomentari oleh @Prescott, kebalikan dari:

evt.preventDefault();

Bisa jadi:

Pada dasarnya menyamakan dengan 'lakukan default' , karena kami tidak lagi mencegahnya.

Kalau tidak, saya cenderung mengarahkan Anda ke jawaban yang diberikan oleh komentar dan jawaban lain:

Bagaimana cara melepaskan ikatan pendengar yang memanggil event.preventDefault () (menggunakan jQuery)?

Bagaimana cara mengaktifkan kembali event.preventDefault?

Perhatikan bahwa yang kedua telah diterima dengan solusi contoh, diberikan oleh redsquare (diposting di sini untuk solusi langsung jika ini tidak ditutup sebagai duplikat):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});
Grant Thomas
sumber
Terima kasih! Apakah menggaruk-garuk kepala saya untuk sementara waktu pada ini (saya perlu berhenti dan memeriksa beberapa hal sebelum mengirimkan formulir, tidak mengirimkan dalam keadaan tertentu, mengirimkan pada orang lain).
Katharine Osborne
1
Itu berfungsi tetapi saya tidak mengerti mengapa formulir selanjutnya mengirim panggilan fungsi lagi, saya pikir itu akan melepaskannya dengan pasti, tetapi sepertinya itu tidak mengikat hanya untuk panggilan saat ini ... Saya tidak bisa menjelaskannya, itu tidak persis apa yang saya inginkan tetapi bukan itu yang saya harapkan.
Vadorequest
53
function(evt) {evt.preventDefault();}

dan kebalikannya

function(evt) {return true;}

Bersulang!

foxybagga
sumber
8
Ini bekerja untuk saya, tapi saya bertanya-tanya apakah ada yang bisa menjelaskannya sedikit lebih baik mengapa?
edhedges
11
Ini tidak membatalkan preventDefault (), sebenarnya ia melakukan hal yang sama seperti jika Anda akan menonaktifkan return true: tidak ada.
br4nnigan
19

Untuk memproses perintah sebelum melanjutkan tautan dari clickacara di jQuery:

Misalnya: <a href="http://google.com/" class="myevent">Click me</a>

Cegah dan tindak lanjuti dengan 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");
    }
});

Atau jalankan window.location = this.href;setelahpreventDefault();

Bradley Flood
sumber
3
Benar, tetapi ini mengasumsikan bahwa preventDefault adalah tautan, dan tidak mengatakan touchmove pada badan dokumen.
Bangkok
4
Ini bukan pertanyaan yang diajukan.
Matt Fletcher
8

Saya harus menunda pengiriman formulir di jQuery untuk menjalankan panggilan asinkron. Berikut kode yang disederhanakan ...

$("$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();
    });
});
Bobby Pearson
sumber
Opsi lain dalam skenario ini mungkin menggunakan input type = "button" dan ikat ke event klik alih-alih menggunakan input type = "kirim" dan mengikat ke ajukan event.
Strixy
8

BAIK ! ini berfungsi untuk acara klik:

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

Saya akan menyarankan pola berikut:

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>

... kecuali aku kehilangan sesuatu.

http://jsfiddle.net/DdvcX/

karim79
sumber
4

Tidak ada metode yang berlawanan event.preventDefault()untuk memahami mengapa Anda pertama-tama harus melihat apa yang event.preventDefault()dilakukannya ketika Anda menyebutnya.

Di bawah tenda, fungsionalitas untuk preventDefault pada dasarnya memanggil return false yang menghentikan eksekusi lebih lanjut. Jika Anda terbiasa dengan cara-cara lama Javascript, sudah saatnya untuk menggunakan return false untuk membatalkan acara pada hal-hal seperti pengiriman formulir dan tombol menggunakan return true (sebelum jQuery bahkan ada).

Seperti yang mungkin sudah Anda lakukan berdasarkan penjelasan sederhana di atas: kebalikan dari event.preventDefault()tidak ada. Anda hanya tidak mencegah acara tersebut, secara default browser akan mengizinkan acara jika Anda tidak mencegahnya.

Lihat penjelasan di bawah ini:

;(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);

Dalam kode di atas Anda akan melihat kami memeriksa apakah allowSubmit salah. Ini berarti kami akan mencegah formulir kami mengirimkan menggunakan event.preventDefaultdan kemudian kami akan melakukan beberapa logika validasi dan jika kami senang, set allowSubmit menjadi true.

Ini benar-benar satu-satunya metode yang efektif untuk melakukan yang sebaliknya event.preventDefault()- Anda juga dapat mencoba menghapus acara yang pada dasarnya akan mencapai hal yang sama.

Partha
sumber
4

Ini sesuatu yang bermanfaat ...

Pertama-tama kita akan mengklik tautan, menjalankan beberapa kode, dan kemudian kita akan melakukan tindakan default. Ini akan dimungkinkan menggunakan event.currentTarget Lihatlah. Di sini kita akan mencoba mengakses Google pada tab baru, tetapi sebelum kita perlu menjalankan beberapa kode.

<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>
Rafael Xavier
sumber
2

Ini yang saya gunakan untuk mengaturnya:

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

Dan untuk membatalkannya:

$("body").unbind("touchmove");
Joe McLean
sumber
2

Tidak ada solusi yang membantu saya di sini dan saya melakukan ini untuk menyelesaikan situasi saya.

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

Dan fungsinya 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();
}
Raza
sumber
2

Saya kira "lawannya" adalah untuk mensimulasikan suatu peristiwa. Anda bisa menggunakannya.createEvent()

Berikut contoh 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 memiliki .trigger()sehingga Anda dapat memicu peristiwa pada elemen - terkadang bermanfaat.

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

$('#foo').trigger('click');
Gary Green
sumber
1

jquery on () bisa menjadi solusi lain untuk ini. escpacially ketika datang ke penggunaan ruang nama .

jquery on () hanyalah cara saat ini untuk mengikat acara (bukan bind ()). off () adalah untuk melepaskan ikatan ini. dan ketika Anda menggunakan namespace, Anda dapat menambah dan menghapus beberapa acara yang berbeda.

$( 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");
    }
});

sekarang dengan menggunakan namespace, Anda dapat menambahkan beberapa dari acara ini dan dapat menghapusnya, tergantung pada kebutuhan Anda .. sementara mengirimkan mungkin bukan contoh terbaik, ini mungkin berguna pada klik atau penekanan tombol atau apa pun ..

membunyikan 31
sumber
1

Ini bukan jawaban langsung untuk pertanyaan tetapi dapat membantu seseorang. Maksud saya adalah Anda hanya memanggil preventDefault () berdasarkan pada beberapa kondisi karena tidak ada gunanya mengadakan acara jika Anda memanggil preventDefault () untuk semua kasus. Jadi memiliki jika kondisi dan panggilan preventDefault () hanya ketika kondisi puas akan berfungsi dengan cara biasa untuk kasus-kasus lain.

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

Anda dapat menggunakan ini setelah metode "preventDefault"

// Di sini evt.target kembali acara default (mis .: url urung dll)

var defaultEvent=evt.target;

// Di sini kita menyimpan acara default ..

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

Anda selalu dapat menggunakan ini terlampir pada beberapa acara klik dalam skrip Anda:

location.href = this.href;

contoh penggunaannya adalah:

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

kode ini berfungsi untuk saya instantiate ulang acara setelah saya menggunakan:

event.preventDefault(); to disable the event.


event.preventDefault = false;
LCMr_music
sumber
-2

Saya telah menggunakan kode berikut. Ini bekerja dengan baik untuk saya.

$('a').bind('click', function(e) {
  e.stopPropagation();
});
VeeraPrasad
sumber
2
Seperti dijelaskan dalam dokumentasi API jQuery , ini mencegah acara melebur pohon DOM, mencegah penangan orang tua mana pun diberi tahu tentang peristiwa tersebut. Itu tidak sama dengan / atau kebalikan dari event.preventDefault();
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
Ini juga bukan pertanyaannya.
Matt Fletcher