Evt.preventDefault () 'nin tam tersi;


185

Bir kez kovulduktan sonra evt.preventDefault(), varsayılan işlemleri nasıl tekrar başlatabilirim?


3
Bence tipik olarak işleviniz çalışır ve sonra varsayılan davranış çalışır, bu yüzden asla evt.preventDefault () ilk etapta çağırırsınız
Prescott


2
@Nobita - jQuery'ye özel olduğundan emin değilim.
gilly3

1
Vay, hızlı cevaplar için teşekkürler! Benim sorunum olsa da, ben evt.preventDefault (); Bir ışık kutusunda 3. taraf flash uygulaması çalıştırıyorum. Işık kutusunu kapattığımda, sayfa kaydırma için fare tekerleğim bir şekilde duruyor. Biraz araştırma yaparken, bu flash uygulamasının bir yakınlaştırma özelliği nedeniyle sayfa kaydırmayı devre dışı bıraktığını buldum. Şimdi uygulama kapandıktan sonra sayfa kaydırmaya devam etmeye çalışıyorum. Belki fare tekerleği etkinliğini sürdürmek için çağırabileceğim bir yöntem var mı?
Bryan

Yanıtlar:


90

@Prescott tarafından yorumlandığı gibi, tam tersi:

evt.preventDefault();

Olabilirdi:

Esasen 'varsayılan yap' ile eşittir , çünkü artık onu engellemiyoruz.

Aksi takdirde, sizi başka bir yorum ve cevap tarafından verilen yanıtlara yönlendirmeye meyilliyim:

Event.preventDefault () (jQuery kullanarak) öğesini çağıran bir dinleyiciyi nasıl açabilirim?

Event.preventDefault nasıl yeniden etkinleştirilir?

İkincisinin, redsquare tarafından verilen örnek bir çözümle kabul edildiğine dikkat edin (bunun yinelenen olarak kapatılmaması durumunda doğrudan bir çözüm için yayınlanmıştır):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});

Teşekkür ederim! Bu konuda bir süre başımı kaşıyordum (bir form göndermeden önce, bazı durumlarda göndermeden, başkalarında göndermeden önce birkaç şeyi durdurmam ve kontrol etmem gerekiyordu).
Katharine Osborne

1
İşe yarıyor ama bir sonraki formun neden işlevi tekrar çağırdığını anlamıyorum, kesinlikle onu bağlayacağını düşündüm, ama sadece mevcut çağrı için bağlanmamış gibi görünüyor ... Açıklayamıyorum, öyle tam olarak istediğim şey ama umduğum gibi değil.
Vadorequest

53
function(evt) {evt.preventDefault();}

ve tam tersi

function(evt) {return true;}

şerefe!


8
Bu benim için çalıştı, ama merak ediyorum neden biraz daha iyi açıklayabilir miyim?
edhedges

11
Bu, cancelDefault () işlevini geri almaz, aslında return true: hiçbir şeyi atlattığınız gibi yapar .
br4nnigan

20

clickJQuery'deki bir olaydan gelen bağlantıya devam etmeden önce bir komutu işlemek için :

Örneğin: <a href="http://google.com/" class="myevent">Click me</a>

JQuery ile önleyin ve takip edin:

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

Ya da sadece koşmak window.location = this.href;sonrapreventDefault();


3
Doğru, ancak bu, cancelDefault öğesinin bir bağlantı olduğunu varsayar ve belge gövdesinde touchmove demez.
Bangkokian

4
Sorunun sorduğu şey bu değil.
Matt Fletcher

1
Bu soruya doğrudan cevap vermediğini biliyorum, ama @Bradley bu sorunu yanıtladı sevindim çünkü sorunumu çözdü. :)
Jovanni G

8

Bir zaman uyumsuz çağrı yürütmek için jQuery bir form gönderme gecikmek zorunda kaldı. İşte basitleştirilmiş kod ...

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

Bu senaryoda başka bir seçenek de input type = "button" kullanmak ve input type = "send" kullanmak yerine click olayına bağlanmak yerine click olayına bağlanmak olabilir.
Strixy

8

TAMAM ! tıklama etkinliği için çalışır:

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

Aşağıdaki modeli öneririm:

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>

... bir şey eksik olmadıkça.

http://jsfiddle.net/DdvcX/


4

event.preventDefault()Neden event.preventDefault()onu çağırdığınızda nelere dikkat etmeniz gerektiğini anlamak için zıt bir yöntem yoktur .

Kaputun altında, cancelDefault işlevi, daha fazla yürütmeyi durduran bir dönüş yanlışı çağırıyor. Javascript'in eski yollarını biliyorsanız, form gönderimleri ve return true kullanan düğmelerdeki olayları (jQuery bile daha önce olmadan) iptal etmek için return false kullanmak bir zamanlar moda oldu.

Muhtemelen yukarıdaki basit açıklamaya dayanarak zaten çalışmış olabileceğiniz gibi: bunun tersi event.preventDefault()hiçbir şey değildir. Sadece olayı engellemezsiniz, varsayılan olarak tarayıcı olayı engellemezseniz izin verir.

Bir açıklama için aşağıya bakın:

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

Yukarıdaki kodda allowSubmit'in yanlış olup olmadığını kontrol ettiğimizi göreceksiniz. Bu, formumuzu kullanarak göndermemizi engelleyeceğiz event.preventDefaultve sonra bazı doğrulama mantığı yapacağız ve mutluysak, allowSubmit'i true olarak ayarlayın.

Bu gerçekten tam tersini yapmanın tek etkili yoludur event.preventDefault()- aynı şeyi başaracak olayları da kaldırmayı deneyebilirsiniz.


4

İşte faydalı bir şey ...

Her şeyden önce bağlantıyı tıklayacağız, bazı kodlar çalıştıracağız ve daha sonra varsayılan işlemi gerçekleştireceğiz. Bu olay event.currentTarget kullanılarak mümkün olacaktır . Bir göz atın. Burada Google'a yeni bir sekmede erişmeye çalışacağız, ancak bir kod çalıştırmamız gerekmeden önce.

<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

Ben ayarlamak için kullanılan budur:

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

Ve geri almak için:

$("body").unbind("touchmove");

2

Çözümlerin hiçbiri burada bana yardımcı olmadı ve bunu durumumu çözmek için yaptım.

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

Ve fonksiyon 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

Sanırım "karşıt" bir olayı simüle etmek olacaktır. Kullanabilirsin.createEvent()

Aşağıdaki Mozilla örneği:

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

Referans: document.createEvent


jQuery .trigger()öğelerde olayları tetikleyebilmenizi sağlar - bazen yararlıdır.

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

$('#foo').trigger('click');

1

jquery on () buna başka bir çözüm olabilir. özellikle ad alanlarının kullanımı söz konusu olduğunda .

jquery on () yalnızca bağlama olaylarının geçerli yoludur (bind () yerine). off () bunları çözmek içindir. ve bir ad alanı kullandığınızda, birden fazla farklı etkinlik ekleyebilir ve kaldırabilirsiniz.

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

şimdi ad alanı kullanımı ile, bu olayların birden ekleyebilir ve ihtiyaçlarınıza bağlı olarak bunları kaldırabilirsiniz .. Gönderme en iyi örnek olmayabilir, ancak bu bir tıklama veya tuşa basma ya da her neyse kullanışlı olabilir ..


1

Bu soru için doğrudan bir cevap değildir, ancak birisine yardımcı olabilir. Demek istediğim, tüm durumlar için preventDefault () öğesini çağırdığınızda olay olmanın bir anlamı olmadığından, yalnızca bazı koşullara bağlı olarak preventDefault () öğesini çağırmanızdır. Bu nedenle, koşulların olması ve yalnızca koşul / koşulların karşılanması durumunda preventDefault () işlevinin çağrılması işlevi diğer durumlarda olağan şekilde çalışacaktır.

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

bunu "preventDefault" yönteminden sonra kullanabilirsiniz

// Burada evt.target varsayılanı döndürme olayı (ör: defult url etc)

var defaultEvent=evt.target;

// Burada varsayılan etkinliği kaydediyoruz ..

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

0

Bunu her zaman komut dosyanızdaki bazı tıklama etkinliklerine ekli olarak kullanabilirsiniz:

location.href = this.href;

kullanım örneği:

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

-1

bu kod kullandıktan sonra olayı yeniden başlatmak için benim için çalıştı:

event.preventDefault(); to disable the event.


event.preventDefault = false;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.