Bir <a> etiketinde preventDefault ()


133

divBir bağlantı tıklandığında göstermek veya gizlemek için yukarı ve aşağı kayan bazı HTML ve jQuery'im var:

<ul class="product-info">
  <li>
    <a href="#">YOU CLICK THIS TO SHOW/HIDE</a>
    <div class="toggle">
      <p>CONTENT TO SHOW/HIDE</p>
    </div>
  </li>
</ul>
$('div.toggle').hide();
$('ul.product-info li a').click(function(event){
  $(this).next('div').slideToggle(200);
}

Sorum şu: preventDefault()Bağlantının bağlantı görevi görmesini ve URL'min sonuna "#" eklemesini ve sayfanın üst kısmına atlamayı nasıl durdurabilirim?

Doğru sözdizimini bulamıyorum, sadece bir hata alıyorum

preventDefault () bir işlev değildir.

Yanıtlar:


194

Şöyle bir şey dene:

$('div.toggle').hide();
$('ul.product-info li a').click(function(event) {
    event.preventDefault();
    $(this).next('div').slideToggle(200);
});

İşte jQuery belgelerinde bununla ilgili sayfa


53

hrefÖzniteliği şu şekilde ayarlayın:href="javascript:;"

<ul class="product-info">
  <li>
   <a href="javascript:;">YOU CLICK THIS TO SHOW/HIDE</a>
  <div class="toggle">
    <p>CONTENT TO SHOW/HIDE</p>
  </div>
 </li>
</ul>

Çapalar için güzel küçük mücevher - teşekkürler! Bunun neden işe yaradığını kimse açıklayabilir mi?
justinpage

8
hrefÇapa etiketinin ( a) @KLVTZ özniteliği boş olmayabilir ... Ancak bunu javascript:<code-here>yasal / geçerli olarak ayarlayabiliriz . Daha sonra <code-here>noktalı virgül ekleyerek sadece boş bir ifade giriyoruz . Bu şekilde bağlantı hiçbir şey yapmaz.
Stijn de Witt

1
Çok teşekkürler! Bu, CalePHP'nin bu $ this-> Html-> addCrumb ('Oturumlar', 'javascript: window.history.back (); ');
Patronot


13

Alternatif olarak, tıklama etkinliğinden yalnızca yanlış döndürebilirsiniz:

 $('div.toggle').hide();
 $('ul.product-info li a').click(function(event){
  $(this).next('div').slideToggle(200);
+ return false; 
 });

Bu, A-Href'in tetiklenmesini durdurur.

Bununla birlikte, kullanılabilirlik nedenlerinden ötürü, href'in bir yere gitmesi gereken ideal bir dünyada, bağlantıyı yeni sekmede açmak isteyen kişiler için;)


1
evet, sanırım soru yerine niyetinin ne olduğunu düşündüğümü cevaplıyordum :)
Kent Fredric

Değeri ne olursa olsun, yıllar önce href'in tetiklenmesini önlemek için -1 döndürmeniz gerektiği lanse edildi. Bunun artık HERHANGİ tarayıcıda çalıştığını sanmıyorum ve sayfanın atlamasını önlemek için "yanlış döndürmeniz" gerekir.
Randy

12

Bu az önce test ettiğim JQuery olmayan bir çözüm ve çalışıyor.

<html lang="en">
<head>
<script type="text/javascript">
addEventListener("load",function(){
    var links= document.getElementsByTagName("a");
    for (var i=0;i<links.length;i++){
        links[i].addEventListener("click",function(e){
        alert("NOPE!, I won't take you there haha");
        //prevent event action
        e.preventDefault();
        })
    }
}); 

</script>
</head>
<body>
<div>
<ul>
    <li><a href="http://www.google.com">Google</a></li>
    <li><a href="http://www.facebook.com">Facebook</a></li>
    <p id="p1">Paragraph</p>
</ul>
</div>
<p>By Jefrey Bulla</p>
</body>
</html>

12
<ul class="product-info">
  <li>
    <a href="javascript:void(0);">YOU CLICK THIS TO SHOW/HIDE</a>
      <div class="toggle">
        <p>CONTENT TO SHOW/HIDE</p>
      </div>
  </li>
</ul>

kullanım

JavaScript: void (0);


@AhmadSharif Bugün FF 40.0.3 ve IE 11 üzerinde test ettim, hala iş var.
HATCHA

1
Bence void (0), bağlantının üzerine geldiklerinde onu görebilen kullanıcılar için çirkin / kafa karıştırıcı olabilir. Aslında herhangi bir geçerli JS koyabilirsiniz, bu yüzden ne yaptığını açıklayan bir yorum koymak isterim. örneğinhref="javascript:// Send Email"
colllin

11

Oysa kullanarak JavaScript bunu yapmanın başka bir yolu inline onclick, IIFE, eventve preventDefault():

<a href='#' onclick="(function(e){e.preventDefault();})(event)">Click Me</a>

Merhaba, ya da basitçe<a href='#' onclick="event.preventDefault()">Click Me</a>
ankabot

6

Birkaç işlemden sonra, sayfanın sonunda bağlantıya gitmesi gerektiğinde aşağıdakileri yapabilirsiniz:

          jQuery("a").click(function(e){
            var self = jQuery(this);
            var href = self.attr('href');
            e.preventDefault();
            // needed operations

            window.location = href;
          });

1
Neden yapın preventDefaultve sonra varsayılan eylemi kendiniz yapın? Sadece eklemeniz gerekeni yapın ve varsayılanın gerçekleşmesine izin verin.
nathanvda

5

Neden css ile yapmıyorsunuz?

Bağlantı etiketinizdeki "href" özelliğini çıkarın

<ul class="product-info">
  <li>
    <a>YOU CLICK THIS TO SHOW/HIDE</a>
    <div class="toggle">
      <p>CONTENT TO SHOW/HIDE</p>
    </div>
  </li>
</ul>

CSS'nizde

  a{
    cursor: pointer;
    }

1
Bu şekilde kötü tarayıcılarda (yani aile): hover özniteliğini kaybedecek
Strae

4

Olayın yayılmasını durdurmak sizi rahatsız etmiyorsa, sadece

return false;

işleyicinizin sonunda. JQuery'de varsayılan davranışı engeller ve olay köpürmesini durdurur.


4

Sen yararlanabilirler return false;bir gibi davranır, olay yayılmasını durdurmak için olay çağrısından event.preventDefault();negating o. Veya javascript:void(0)verilen ifadeyi değerlendirmek için href özniteliğini kullanabilir ve ardından undefinedöğeye geri dönebilirsiniz .

Olay çağrıldığında geri döndürme:

<a href="" onclick="return false;"> ... </a>

Geçersiz durum:

<a href="javascript:void(0);"> ... </a>

Şu konuda daha fazlasını görebilirsiniz: href için void (0) eklemenin ve bağlantı etiketinin tıklama olay dinleyicisine 'yanlış döndür' eklemenin etkisi nedir?

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.