'#' Bağlantısına yapılan bir tıklamanın sayfanın başına atlamasını nasıl önleyebilirim?


213

Şu anda <a>tıklama etkinlikleri vb. Gibi şeyleri başlatmak için jQuery ile etiketler kullanıyorum .

Örnek <a href="#" class="someclass">Text</a>

Ancak '#' ın sayfanın üst kısmına nasıl atladığından nefret ediyorum. Bunun yerine ne yapabilirim?



2
David Dorward ile buradayım ve bağlantılı yinelenen soru üzerine gargantaun . Web sitenizde bağlantılar varsa, normal bağlantılar olarak işlev görmeleri gerekir. JavaScript bunları keser ve farklı, iyi ve iyi bir şey yaparsa, ancak orada gerçek bir bağlantıya sahip olmanız gerekir, bu gerçek bir sayfaya yol açar. Bu, en az SEO ve erişilebilirlik değil, her türlü neden için gereklidir.
Daniel Pryden

“Aptalca aptalca” Hepimiz daha önce oradaydık :)
takeshin

Yanıtlar:


242

JQuery'de, click olayını işlediğinizde, bağlantının normal şekilde yanıt vermesini durdurmak için yanlış döndürhrefözelliği ziyaret edecek olan varsayılan eylemin gerçekleşmesini önleyin (PoweRoy'un yorumu ve Erik'in cevabı başına ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay: OP bu bağlantılarla çalışmak için jQuery kullandığını belirtti.
BoltClock

8
False döndürmek yerine bir event.preventDefault () yapın. Bu, kodunuzu okuyacak insanlar için daha açıktır.
RvdK

@PoweRoy: anladım. Düzenlemeyi yaptım ve yeni bir şeyler öğrendim :)
BoltClock

5
@BoltClock OP, çapa yerine tıklama olaylarını işlemek için düğmeler kullanmalıdır. Cevabınız oldukça faydalı, ancak href bir yere işaret ettiğinde ve şu anda yönlendirmeye ihtiyacınız olmadığında . Hiç gerekli olmayan varsayılan eylem davranışını önlemek, bir tür tavsiyedir: bıçağı alın, bıçağı tutun ve kolu kullanarak tırnakları çekiçleyin :) İş için doğru bir alet alın!
takeshin

1
Jquery ise:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Yani bu eski ama ... birisinin bunu bir aramada bulması durumunda.

Bunun "#/"yerine kullanın "#"ve sayfa atlanmayacaktır.


2
TAM ne ihtiyacım var! Yorumunuzdan bir yıl sonra bile bu benim için yararlı oldu, bu yüzden teşekkürler Chris
Zack

49
herhangi bir anlamı /olduğu için değil, adlandırılmış bağlantıya gittiği için çalışır #/. aynı şeyi yapabilirsiniz #whateveryouwantve üste atlamayı önleyecektir
argo

3
Bunun en iyi cevap olması gerekir. Teşekkürler.
Gilberto Sánchez

1
@slang, haklı olmanıza rağmen ve bu sadece nitpicking, ancak "# /" yerine "# /" kullanmayı tercih ederim çünkü "# /" oldukça yaygın olarak kullanılır ve böylece niyetleri (Temiz Kod) ortaya çıkarır. Yine de bu cevaba bir ilave olabilir.
jobbert

22
Dikkat - bu tarayıcı geçmişinde bir kayıt oluşturur, bu nedenle geri tıklamak, kullanıcının bir bağlantıyı tıkladıktan sonra #/veya başka bir şey tıkladıktan sonra ne yapacağını düşünmez #whatever.
Darren Sweeney

61

hatta şöyle yazabilirsiniz:

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

Im emin değilim onun daha iyi bir yol ama bir yoludur :)


Bu yöntem HTML öncesi 4 için iyiydi, ancak bugün "yeni sekmede bağlantı aç" gibi çok fazla gezinme eylemini bozduğu için çok kötü bir uygulamadır.
Steve-o

7
belki haklısın ama .. bu durumda önemli değil çünkü yeni sekmede açık bir link veriyor çünkü yine de işe yaramayacaktı ...
Guy Schaller

Kısayol olduğunu href='javascript:;'ancak IE window.beforeUnload olayı tetikler dikkatli olmak
Mihir

Bu kendi işlevini kırabilir mi? Çünkü bunu yaparsam slayt oluşturma işlevim artık tetiklenmez.
user3806549

29

Çözüm # 1: (Düz)

<a href="#!" class="someclass">Text</a>

Çözüm # 2: (gerekli javascript)

<a href="javascript:void(0);" class="someclass">Text</a>

Çözüm # 3: (gerekli jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
İlk çözüm mükemmel. Kısa, temiz ve basit. Bu kabul edilen cevap olmalı. Teşekkürler!
NeredeysePitt

1 numara harika bir çözüm. Teşekkür ederim!
Brenton Scott


11

Sadece kullanmak <input type="button" />yerine <a>dilerseniz bir bağlantı gibi görünmek için stil onu ve kullanıma CSS.

Düğmeler özellikle tıklama için yapılır ve herhangi bir href özelliğine ihtiyaç duymazlar.

En iyi yol, düğmeyi oluşturmak ve javascript aracılığıyla ihtiyacınız olan yere eklemek için onload eylemini kullanmaktır, bu nedenle javascript devre dışı bırakıldığında, hiç gösterilmez ve kullanıcıyı karıştırmazlar.

Kullandığınızda href="#", aracı JavaScript'i desteklemediğinde çalışmayan tonlarca farklı bağlantıyı görürsünüz.


1
@kingjeffrey Ama hiçbir şey yapmamak hala navigasyondan daha iyi #.
Robert

8

Bir çapa kullanmak istiyorsanız, önerilen diğer cevaplar gibi http://api.jquery.com/event.preventDefault/ adresini kullanabilirsiniz .

Ayrıca yayılma alanı gibi başka bir öğeyi kullanabilir ve click olayını buna ekleyebilirsiniz.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

Kimlik olarak izin verilmediğinden #0href olarak kullanabilirsiniz 0, sayfa atlanmaz.

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
Lütfen kısa bir açıklama ekleyebilir misiniz?
JF Meier

Bana onunla ilişkili bir "#" href olan herhangi bir çapa bir tıklama işleyicisi ekliyor gibi görünüyor. Bu şekilde, zaten var olan tüm tıklama işleyicilerini aramak ve bunların içine e.preventDefault () eklemek zorunda kalmazsınız.
Mani5556

4

Sadece kullan

<a href="javascript:;" class="someclass">Text</a>

JQUERY

$('.someclass').click(function(e) { alert("action here"); }

4

Öğenin anlamlı bir href değeri yoksa, o zaman gerçekten bir bağlantı değildir, neden bunun yerine başka bir öğe kullanmıyorsunuz?

Neothor'un önerdiği gibi, bir açıklık da en az uygundur ve doğru bir şekilde biçimlendirilirse, tıklanabilecek bir öğe olarak görülebilir. Kullanıcının faresi üzerinde hareket ederken öğeyi 'aydınlatır' yapmak için bir fareyle üzerine gelme olayı bile ekleyebilirsiniz.

Bununla birlikte, bunu söyledikten sonra, sitenizin tasarımını javascript olmadan çalışacak şekilde yeniden düşünmek isteyebilirsiniz, ancak kullanılabilir olduğunda javascript ile güçlendirilir.


4

Href = "#" ile bağlantılar neredeyse her zaman bir düğme öğesiyle değiştirilmelidir:

<button class="someclass">Text</button>

Href = "#" ile bağlantıların kullanılması da erişilebilirlikle ilgili bir sorundur, çünkü bu bağlantılar ekran okuyucuları tarafından görülebilir ve "Bağlantı - Metin" okunur, ancak kullanıcı tıklarsa hiçbir yere gitmez.


3

Bir href özelliği olmadan bir bağlantı etiketi geçirebilir ve gerekli eylemi yapmak için jQuery kullanabilirsiniz:

<a class="foo">bar</a>


Kullanıcı js devre dışı bırakılmışsa herhangi bir geri dönüş eylemi olmadığından genellikle bu yaklaşımı önermiyorum. Ama zaten href'i ayarladığınız için #, bunun sizin için bir endişe olmadığını varsaydım ve bu nedenle bu çözümü, muhtemelen ihtiyacınızı karşılamanın en basit yolu olduğu için önerdim.
kingjeffrey

1
a:linkCSS seçicileri bu bağlantı etiketini hedeflemez.
BoltClock

BoltClock, bu doğru. Ancak st4ck0v3rfl0w böyle bir ihtiyacı göstermedi.
kingjeffrey

O zaman bir <div> de kullanabilirsiniz. <a> 'i korumanın asıl amacının, düzenli <a>' ler tarafından tanımlanan stilini korumak olduğuna inanıyorum. Href olmadan, diğer <a> 'ler gibi algılanmayacak ve stil verilmeyecektir.
MarsAndBack


3

#/Hile çalışır, ancak tarayıcıya bir tarih olayı ekler. Bu nedenle, geri tıklamak kullanıcının istediği / beklediği gibi çalışmaz.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); zaten var olan içerik ve çalıştıktan sonra DOM'a eklenen tüm öğeler için çalıştığım şekilde gittim.

Özellikle, bir .btn-group(Referans) içindeki bir bootstrap açılır menüsünde bunu yapmak gerekiyordu , bu yüzden yaptım:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

Bu şekilde hedeflendi ve sayfadaki başka hiçbir şeyi etkilemedi.


3

Her zaman kullandım:

<a href="#?">Some text</a>

sayfa atlamasını önlemeye çalışırken. Bunun en iyisi olup olmadığından emin değilim, ancak yıllardır iyi çalışıyor gibi görünüyor.


3

Sayfanın herhangi bir JavaScript olmadan en üste atlamasını önlemek için 4 benzer yol vardır:

Seçenek 1:

<a href="#0">Link</a>

Seçenek 2:

<a href="#!">Link</a>

Seçenek 3:

<a href="#/">Link</a>

Seçenek 4 ( Önerilmez ):

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

Ancak event.preventDefault(), jQuery'de click olayını veriyorsanız kullanmak daha iyidir .


3
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
A.Suliman

2

Ayrıca jquery işleme sonra false dönebilirsiniz.

Örneğin.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
Bu ve canlı yöntem hem kullanımdan kaldırılmıştır hem de artık kullanılmamalıdır.
Quentin

2

Böyle bir şey kullanıyorum:

<a href="#null" class="someclass">Text</a>

2

Sayfanın atlamasını önlemek için, e.stopPropagation();aradıktan sonra aramanız gerekir e.preventDefault();:

stopPropagationetkinliğin DOM ağacına çıkmasını önler. Daha fazla bilgi için: https://api.jquery.com/event.stoppropagation/


benim html yapıştırılabilir olabilir tam kodu verebilir misiniz? Zurb Foundation 5.5.3 kullanıyorum.
Julie

2

Sayfa atlamadan aynı sayfada bir Bağlantı Bölümü'ne geçmek istiyorsanız şunu kullanın:

"#" Yerine "# /" kullanın, ör.

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

Sonra bir şey eklemek #, sayfanın odağını o kimliğe sahip öğeye ayarlar. En basit çözüm, #/jQuery kullanıyor olsanız bile kullanmaktır. Ancak olayı jQuery'de yürütüyorsanız, event.preventDefault()işte böyle bir yol var.


0

<a href="#!">Link</a>Ve <a href="#/">Link</a>does not iş bir kereden fazla aynı girişe tıklayın varsa .. sadece çoklu girişler üzerinde her biri için 1 olay tıklama alır.

hala en iyi yol <a href="#">Link</a>

sonra,

event.preventDefault();
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.