Event.preventDefault () (jQuery kullanarak) çağıran bir dinleyicinin bağlantısı nasıl çözülür?


128

jquery toggle çağrıları varsayılan olarak preventDefault (), bu nedenle varsayılanlar çalışmaz. bir onay kutusunu tıklayamazsınız, bir bağlantıyı tıklayamazsınız vb.

varsayılan işleyiciyi geri yüklemek mümkün mü?


Örnek bir kod verebilir misiniz?
Jojo

4
Başlıktaki soru harika bir soru! Asıl soru çok kötü ... Burada, preventDefaultçağrıldıktan sonra etkisini (eğer mümkünse) nasıl 'ortadan kaldırabileceğimizin' cevabını bulmayı umuyordum . Şu anda bu soru aslında 'jQuery ile bir olay dinleyicisinin bağlantısını nasıl çözebilirim?' Şeklindedir.
Stijn de Witt

Yanıtlar:


80

Benim durumumda:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click'); varsayılan eylemi geri yüklemek için tek yöntem olarak çalıştı.

Burada görüldüğü gibi: https://stackoverflow.com/a/1673570/211514


2
Bu öğenin başka bir tıklama işleyicisi varsa, yalnızca engellenen işleyici değil, eklenen tüm etkinliklerin bağlantısını da
kaldırırsınız

56

Oldukça basit

Diyelim ki şöyle bir şey yaparsınız

document.ontouchmove = function(e){ e.preventDefault(); }

şimdi orijinal durumuna geri döndürmek için aşağıdakileri yapın ...

document.ontouchmove = function(e){ return true; }

Bu web sitesinden .


Bu çözüm $ ['# a_link']. Click (function (e) {e.preventDefault ();}); Çözme işlevini kullanın.
Denis Makarskiy

2
Sağladığınız bağlantı bozuk.
yığılmış

16

A'yı geri yüklemek mümkün değil preventDefault()ama yapabileceğiniz şey onu kandırmak :)

<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
   if($(this).hasClass('prevented')){
       e.preventDefault();
       $(this).removeClass('prevented');
   }else{
       $(this).addClass('prevented');
   }
});
</script>

Bir adım daha ileri gitmek isterseniz, bir olayı tetiklemek için tetik düğmesini bile kullanabilirsiniz.


Oldukça eminim - bunu geçenlerde bir tasarım üzerinde yaptım. İlk önce bir düğmeye tıklayarak bir iphone'da kaydırmayı, touchmove olayına e.preventDefault'u ekleyerek engelledim ve ardından animasyon tamamlandıktan sonra gerçekliğe döndüm ve bir cazibe gibi çalıştı.
foxybagga

11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);

Benim için çalışma şekli şuydu: $ (document) .off ('touchmove'); $ (belge) .on ('dokunma hareketi', işlev () {doğru dönüş;});
rogervila

9

bazı durumlarda * başlangıçta return falseyerine e.preventDefault(), sonra varsayılanı olarak geri yüklemek istediğinizde yapabilirsiniz return true.

* Bu, köpüren olayı önemsemediğiniz ve e.stopPropagation()birlikte kullanmadığınız zamane.preventDefault()

Ayrıca benzer soruya bakın (ayrıca Stack Overflow'da)

veya onay kutusu olması durumunda şunun gibi bir şeye sahip olabilirsiniz:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 

9

Bunu yaparak varsayılan eylemi geri yükleyebilirsiniz (bu bir HREF ise):

window.location = $(this).attr('href');


2
fikirler doğruydu ancak kutudan çıkan kod benim için işe yaramadı (sadece jquery'de bir sözdizimi değişikliği olmadığı sürece) kullandım: window.location = $ (this) .attr ('href');
Modika

3

eğer bir bağlantı ise $(this).unbind("click");, bağlantı tıklamayı yeniden etkinleştirir ve varsayılan davranış geri yüklenir.

Bunun nasıl çalıştığını göstermek için bir demo JS keman oluşturdum :

İşte JS kemanının kodu:

HTML:

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>

JavaScript:

<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
  event.preventDefault();

  $( "<div>" )
    .append( "default " + event.type + " prevented "+counter )
    .appendTo( "#log" );

    if(counter == 2)
    {
        $( "<div>" )
    .append( "now enable click" )
    .appendTo( "#log" );

    $(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
    }
    else
    {
        $( "<div>" )
    .append( "still disabled" )
    .appendTo( "#log" );
    }
    counter++;
});
});
</script>

2

Bu kodu test edin, sanırım probleminizi çözün:

event.stopPropagation();

Referans


Varsayılanı engelleyen işleyiciden önce gerçekleşen bir işleyicide Yayılmayı durdurmanız gerekir. Diğer işleyiciniz kabarcık aşamasında kayıtlıysa, bunu capturePhase üzerinde yapabilirsiniz.
Vitim.us

2

Bunu ad alanını kullanarak yapmanın en iyi yolu. Güvenli ve emniyetli bir yoldur. Burada .rb, unbind işlevinin o belirli keydown üzerinde çalışmasını ancak diğerlerinde çalışmamasını sağlayan ad alanıdır.

$(document).bind('keydown.rb','Ctrl+r',function(e){
            e.stopImmediatePropagation();
            return false;
        });

$(document).unbind('keydown.rb');

ref1: http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/

ref2: http://jqfundamentals.com/chapter/events


1

Devre Dışı:

document.ontouchstart = function(e){ e.preventDefault(); }

Etkinleştirme:

document.ontouchstart = function(e){ return true; }

1

Etkinlik arayüzünün preventDefault () yöntemi, kullanıcı aracısına, olay açıkça işlenmezse, varsayılan eyleminin normalde olduğu gibi gerçekleştirilmemesi gerektiğini söyler. Olay dinleyicilerinden biri stopPropagation () veya stopImmediatePropagation () 'ı çağırmadığı sürece olay her zamanki gibi yayılmaya devam eder.

Olay akışının herhangi bir aşamasında preventDefault () işlevinin çağrılması olayı iptal eder, bu da olayın bir sonucu olarak uygulama tarafından normal olarak gerçekleştirilen herhangi bir varsayılan eylemin gerçekleşmeyeceği anlamına gelir.

Olayın iptal edilebilir olup olmadığını kontrol etmek için Event.cancelable'ı kullanabilirsiniz. İptal edilemeyen bir olay için preventDefault () 'u çağırmanın hiçbir etkisi yoktur.

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

0

Varsayılan eyleme yalnızca bazı özel eylemler (bir formdaki aksi takdirde devre dışı bırakılmış giriş alanlarını etkinleştirin) sona erdikten sonra ihtiyacım olan bir sorun yaşadım. Varsayılan eylemi (submit ()) kendi özyinelemeli bir işleve (dosubmit ()) sardım.

var prevdef=true;
var dosubmit=function(){
    if(prevdef==true){
        //here we can do something else first//
        prevdef=false;
        dosubmit();
    }
    else{
        $(this).submit();//which was the default action
    }
};

$('input#somebutton').click(function(){dosubmit()});

1
Genel not: Bazı kodlayıcılar if (predef == true)daha açık olsa da, JS kodunuza sebepsiz yere 7 karakter ekliyorsunuz. if (prevdef)aynı derecede okunabilir. Ayrıca, hiçbir parametre aktarılmadığıyla .click(dosubmit)aynı şeyi yaptığında , gereksiz bir anonim olay işleyicisi eklediniz .click(function(){dosubmit()}).
Kodlamaya Gitti

0

Bir boole kullanın:

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

Bunu bir Aşamalı Web Uygulamasında bazı 'sayfalarda' kaymayı / yakınlaştırmayı önlemek için kullanıyorum ve diğerlerine izin veriyorum.


0

2 sınıf oluşturabilirsin. JS betiğinizi bunlardan birine ayarladıktan sonra, betiğinizi devre dışı bırakmak istediğinizde, bu formdan bağlı komut dosyası içeren sınıfı silmeniz yeterlidir.

HTML:

<form class="form-create-container form-create"> </form>   

JS

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});

-3
$('#my_elementtt').click(function(event){
    trigger('click');
});

-10

Ne demek istediğinden emin değilim: ama işte benzer (ve muhtemelen aynı) bir sorun için bir çözüm ...

Öğeleri kesmek için genellikle preventDefault () kullanıyorum. Ancak: tek engelleme yöntemi bu değildir ... çoğu zaman, hangi davranışın daha önce olduğu gibi devam ettiğini veya durduğunu takip eden bir "soru" isteyebilirsiniz. Yakın tarihli bir vakada aşağıdaki çözümü kullandım:

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

Temel olarak, "varsayılanı önleme", araya girmek ve başka bir şey yapmak anlamına gelir: "onayla", ... iyi - onaylamak için tasarlanmıştır!

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.