“#” Veya “javascript: void (0)” JavaScript bağlantıları için hangi “href” değerini kullanmalıyım?


4076

Aşağıda, yalnızca JavaScript kodunu çalıştırmak amacıyla bir bağlantı oluşturmanın iki yöntemi verilmiştir. İşlevsellik, sayfa yükleme hızı, doğrulama amaçları vb. Açısından hangisi daha iyidir?

function myJsFunc() {
    alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>

veya

function myJsFunc() {
    alert("myJsFunc");
}
 <a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>


202
Bir şey eksik olmadıkça <a href="javascript:void(0)" onclick="myJsFunc();">, kesinlikle bir anlam ifade etmiyor. Eğer varsa gerekir kullanmak javascript:psuedo protokolü İhtiyacınız olmayan onclicközelliği de. <a href="javascript:myJsFunc();">iyi olacak.
Wesley Murch

65
@WesleyMurch - myJsFunc()Dönüş değeri varsa , sayfanız kesilir . jsfiddle.net/jAd9G Hala olur kullanmak zorunda voidşöyle: <a href="javascript:void myJsFunc();">. Ama sonra, davranış yine de farklı olurdu. Bağlantının bağlam menüsü aracılığıyla çağrılması clickolayı tetiklemez .
gilly3

38
Neden sadece <a href="javascript:;" onclick="myEvent()"?
3k-

26
javascript:;yazmak için çok daha hızlıjavascript:void(0)
Mike Causer

78
Buna bakarken ilk düşünce: "neden <a>yapmak istediğiniz şey yerel tarayıcı özelliği ile başka bir sayfa açmak DEĞİLDİR, bunun yerine bazı javascript 'eylemi' tetiklenecekse neden bir spanetiket kullanmalısınız? js-triggerbüyük olasılıkla çok daha iyi olur ". Yoksa bir şey mi kaçırıyorum?
Adrien Be

Yanıtlar:


2164

Ben kullanıyorum javascript:void(0).

Üç sebep. #Geliştiricilerden oluşan bir takımın kullanımını teşvik etmek kaçınılmaz olarak bazılarına şu şekilde adlandırılan işlevin dönüş değerini kullanmasına yol açar:

function doSomething() {
    //Some code
    return false;
}

Ama sonra return doSomething()onclick'te kullanmayı ve sadece kullanmayı unutuyorlar doSomething().

Bundan kaçınmanın ikinci bir nedeni , çağrılan işlev bir hata atarsa #finalin return false;yürütülmemesidir. Bu nedenle geliştiriciler aynı zamanda çağrılan fonksiyondaki herhangi bir hatayı uygun şekilde ele almayı hatırlamalıdır.

Üçüncü neden, onclickevent özelliğinin dinamik olarak atandığı durumlar olmasıdır. Bir işlevi çağırabilir veya işlevi bir ek yöntem için özel olarak kodlamak zorunda kalmadan dinamik olarak atamayı tercih ederim. Dolayısıyla benim onclick(ya da bir şey üzerine) Böyle HTML işaretleme görünüm:

onclick="someFunc.call(this)"

VEYA

onclick="someFunc.apply(this, arguments)"

kullanma javascript:void(0) yukarıdaki tüm baş ağrılarını önler ve herhangi bir dezavantaj örneği bulamadım.

Eğer yalnız bir geliştiriciyseniz, o zaman kendi seçiminizi açıkça yapabilirsiniz, ancak bir ekip olarak çalışıyorsanız her iki durumu da belirtmeniz gerekir:

Kullanın href="#", sonunda onclickher zaman içerdiğinden return false;, çağrılan herhangi bir fonksiyonun hata atmadığından onclickemin olun ve özelliğe bir işlevi dinamik olarak eklerseniz , hata atmanın yanı sıra hata döndürmediğinden emin olun false.

VEYA

kullanım href="javascript:void(0)"

İkincisi açıkça iletişim kurmak çok daha kolay.


329
Her bağlantıyı her zaman yeni bir sekmede açıyorum ve insanlar href="javascript:void(0)"yöntemi kullandıklarında kişisel olarak nefret
etmemin

182
Üzgünüm katılmıyorum bu cevabın neden bu kadar çok oyu var? Herhangi bir kullanımı javascript:kötü uygulama olarak düşünülmeli, rahatsız edici olmalı ve dereceli olarak zarif olmamalıdır.
Lankymart

52
Sonraki iki cevap bundan daha iyi ve makul. Ayrıca ilk iki argüman geçersizdir, çünkü event.preventDefault()varsayılan davranışı (bu durumda sayfanın üstüne atlamak gibi) tam olarak önlemek ve tüm return false;delilik olmadan daha iyi bir iş yapmak için tam olarak vardır .
sudee

136
2013'e javascript:void(0)hızlıca iletme: CSP'nin etkin olduğu HTTPS sayfalarındaki İçerik Güvenliği Politikasını ihlal ediyor . O zaman bir seçenek kullanmak href='#'ve event.preventDefault()işleyicide olmaktır , ancak bunu çok sevmiyorum. Belki de kullanmak için bir kural href='#void'oluşturabilir ve sayfadaki hiçbir öğenin olmadığından emin olabilirsiniz id="void". Bu şekilde, varolmayan bir bağlantıya giden bir bağlantı tıklandığında sayfa kaydırılmaz.
jakub.g

24
"#" Kullanın ve sonra "#" ile tüm bağlantılara bir tıklama olayı bağlayabilirsiniz href. Bu, $('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Nathan

1325

Ne.

Mantıklı bir URL'niz varsa bunu HREF olarak kullanın. Birisi yeni bir sekme açmak için bağlantınıza orta tıklarsa veya JavaScript devre dışı bırakılmışsa, onclick tetiklenmez.

Bu mümkün değilse, en azından bağlantı etiketini belgeye JavaScript ve uygun tıklama etkinliği işleyicileriyle enjekte etmelisiniz.

Bunun her zaman mümkün olmadığını anlıyorum, ancak bence herhangi bir kamu web sitesi geliştirmek için çaba gösterilmelidir.

Göze batmayan JavaScript ve Aşamalı geliştirmeye göz atın (her ikisi de Wikipedia).


19
"Bağlantı etiketini belgeye JavaScript ve uygun tıklama etkinliği işleyicileri ile nasıl enjekte edebileceğine" bir örnek verebilir misiniz?
user456584

11
Sadece bir öğenin a) tıklanması b) "işaretçi" imlecini görüntülemesine izin vermek için kullanılacaksa, bağlantı etiketini neden enjekte edin. Bu senaryoda bir çapa etiketi bile enjekte etmek ilgisiz görünüyor.
ezmek

12
İkisi için de +1, ama aşırı yaklaşımlar var. Gerçek, ya kötü uygulamalardan biridir ya javascript:da #her ikisi de kötü uygulamalardır ve teşvik edilmemelidir. Güzel makaleler btw.
Lankymart

13
@crush: Ben de div veya span kullanmazdım; açıkçası, bu çok şey <button>için yapılmış gibi görünüyor . Ancak kabul edildi: muhtemelen <a>bağlantı kurması için uygun bir yer yoksa özel olarak olmamalıdır .
cHao

14
@CHao Düğmesi belki de en iyi seçimdir. Ana nokta, HTML öğesinin varsayılan sunum görünümüne göre seçilmemesi gerektiğini, bunun yerine belgenin yapısına olan önemini varsayalım.
ezmek

775

Bir özellik içeren veya başka bir şey yapmak - <a href="#" onclick="myJsFunc();">Link</a>veya beş yıl önce geri döndü, ancak şimdi kötü bir uygulama olabilir. İşte nedeni:<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>onclick

  1. Bu, bakımı zor ve ölçeklendirilmesi zor olduğu ortaya çıkan rahatsız edici JavaScript uygulamasını teşvik ediyor. Bu konuda daha fazla bilgi göze batmayan JavaScript .

  2. Zamanınızı inanılmaz derecede ayrıntılı kod yazarak harcıyorsunuz - bu da kod tabanınıza çok az fayda sağlıyor (varsa).

  3. Artık istenen sonucu elde etmenin daha iyi, daha kolay ve daha kolay korunabilir ve ölçeklenebilir yolları var.

Göze batmayan JavaScript yolu

Sadece bir hrefniteliği yok ! İyi bir CSS sıfırlaması, eksik varsayılan imleç stiliyle ilgilenir, bu nedenle sorun olmaz. Ardından, mantığınızın ayrılmasını gerektiren büyük ölçekli JavaScript uygulamaları geliştirmeye başladığınızda gerekli olan, zarif ve göze çarpmayan en iyi uygulamaları (JavaScript mantığınızın biçimlendirmeniz yerine JavaScript'te kalması nedeniyle daha sürdürülebilir) kullanarak JavaScript işlevlerinizi ekleyin. blackboxed bileşenler ve şablonlar. Bununla ilgili daha fazla bilgi Büyük Ölçekli JavaScript Uygulama Mimarisinde

Basit kod örneği

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="cancel-action">Cancel this action</a>

Kara kutulu Backbone.js örneği

Ölçeklenebilir, kara kutulu , Backbone.js bileşen örneği için buradaki jsfiddle örneğine bakın . Göze batmayan JavaScript uygulamalarını nasıl kullandığımıza ve az miktarda kodda, farklı bileşen örnekleri arasında yan etkiler veya çakışmalar olmadan sayfada birden çok kez tekrarlanabilen bir bileşene sahip olduğunuzu unutmayın. İnanılmaz!

notlar

  • hrefÖzelliğin aöğe üzerinde atlanması, öğenin tabtuş gezinmesi kullanılarak erişilebilir olmamasına neden olur . Bu öğelere tabanahtar aracılığıyla erişilmesini istiyorsanız, tabindexözniteliği ayarlayabilir veya buttonbunun yerine öğeleri kullanabilirsiniz . Tracker1'in cevabında belirtildiği gibi normal elemanlara benzemek için düğme elemanlarına kolayca stil uygulayabilirsiniz .

  • Öğe hrefüzerindeki özniteliğin atlanması, Internet Explorer 6 ve Internet Explorer 7'nin stil almamasına neden olur, bu yüzden bunun yerine bunu gerçekleştirmek için basit bir JavaScript şimi ekledik . Href özelliğiniz ve zarif bir bozulmanız yokmuş gibi, bağlantınız yine de çalışmaz - ve endişelenmeniz gereken daha büyük sorunlarınız olacak.aa:hovera.hover

  • İşleminizin hala JavaScript devre dışı bırakılmış olarak çalışmasını istiyorsanız, işlemi Ajax isteği yerine veya gitmesi gereken her şey yerine manuel olarak gerçekleştirecek bir URL'ye asahip bir hrefniteliğe sahip bir öğe kullanmak . Bunu yapıyorsanız event.preventDefault(), düğme tıklandığında bağlantıyı takip etmediğinden emin olmak için tıklama çağrınızda bir açık arama yaptığınızdan emin olmak istersiniz . Bu seçeneğe zarif bozulma denir.


163
Dikkatli olun, href özelliklerini kapalı bırakmak tarayıcıyla uyumlu değildir ve internet explorer'da fareyle üzerine gelme efektleri gibi şeyleri kaybedeceksiniz
Thomas Davis

16
Dikkat: buttonBurada önerilen bağlantı tarzı yaklaşım IE9 ve altındaki kaçınılmaz "3d" aktif durum tarafından rahatsız edilmektedir .
Brennan Roberts

44
Bu cevabı aşırı dogmatik buluyorum. JS davranışını sadece 1 veya 2 a href'e uygulamak istediğiniz zamanlar vardır. Bu durumda, ekstra CSS tanımlamak ve tüm JS işlevini enjekte etmek aşırı derecede doludur. Bazı durumlarda (örneğin, bir CMS aracılığıyla içerik ekleme) yeni CSS veya bağımsız JS enjekte etmenize izin verilmez ve tek yapmanız gereken satıriçi olabilir. Satır içi çözümün 1 veya 2 basit JS a href için pratikte nasıl daha az bakım yapılabilir olduğunu görmüyorum . Bunun da dahil olmak üzere kötü uygulama hakkındaki genel açıklamalardan daima şüphelenin :)
Jordan Rieger 29:13

17
Çözülmesi zor olan tüm bu "notlar" ile (bir tabindex ayarlamak karmaşık bir sayfada sorun istiyor!). Sadece yapmak daha iyi javascript:void(0). Bu pragmatik cevaptır ve gerçek dünyadaki tek mantıklı cevaptır.
Abhi Beckert

14
Web uygulamanızı erişilebilir kılmayı önemsiyorsanız (ve yapmalısınız), href için basitlik ve akıl sağlığı tartışır. Delilik tabindex yönünde yatıyor.
jkade

328

'#'kullanıcıyı sayfanın en üstüne geri götürür, bu yüzden genellikle birlikte gelirim void(0).

javascript:; ayrıca gibi davranır javascript:void(0);


68
Bundan kaçınmanın yolu, onclick olay işleyicisinde false döndürmektir.
Guvante

34
Olay işleyicisinde false döndürmek, JavaScript JavaScript'in başarıyla çalışmadığını engellemez.
Quentin

28
"#someNonExistantAnchorName" kullanmak iyi bir performans göstermediği için iyi çalışmıyor.
scunliffe

21
Bir temel href'iniz varsa, o zaman #ya da geçerli sayfa yerine temel href sayfasındaki #somethingbağlantıya götürürsünüz .
Abhi Beckert

11
Mesele ( #!) hile yapar ama kesinlikle kötü bir uygulamadır.
Neel

276

Ben dürüstçe ne de öneririm. Ben <button></button>bu davranış için stilize bir kullanırdım .

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type="button" class="link">link</button>.</p>

Bu şekilde onclick'inizi atayabilirsiniz. Ayrıca onclicköğe etiketi üzerindeki özniteliği kullanarak değil, komut dosyası üzerinden bağlama öneririz . Tek gotcha, devre dışı bırakılamayan eski IE'lerde psuedo 3d metin efekti.


Eğer sen MUTLAKA bir A elemanı kullanmak, kullanmak javascript:void(0);önce bahsedilen nedenlerle.

  • Onclick etkinliğinizin başarısız olması durumunda her zaman araya girer.
  • Hatalı yükleme çağrıları olmayacak veya karma değişikliğe dayalı diğer etkinlikleri tetiklemeyecek
  • Hash etiketi, tıklama düşerse (onclick atar) beklenmedik davranışlara neden olabilir, uygun bir düşme davranışı olmadıkça ve gezinme geçmişini değiştirmek istemiyorsanız bunlardan kaçının.

NOT: yerine , tıklamanın gerçekte ne yapacağını gösteren fazladan bir gösterge 0olarak javascript:void('Delete record 123')kullanılabilecek bir dize kullanabilirsiniz.


IE8 / IE9'da, düğmenin: aktif durumundaki 1px "3D" ofsetini kaldıramıyorum.
Brennan Roberts

@BrennanRoberts Evet, ne yazık ki, herhangi bir düğme stili IE ile daha sorunlu ... Ben hala muhtemelen en uygun yaklaşım olduğunu hissediyorum, zaman zaman kendi kurallarımı ihlal değil.
Tracker1

O zaman kullanmayın <button>ama input type=buttononun yerine?
Patrik Affentranger

4
Sonra bir <clickable>eleman kullanın . Ya da <clickabletim>eğer isterseniz. Ne yazık ki, standart olmayan bir etiket veya düz bir div kullanmak, klavye kullanıcılarının öğeye odaklanmasını zorlaştırabilir.
joeytwiddle

28
Bu cevap en üstte olmalıdır. Eğer bu ikilemi yaşıyorsanız, aslında a button. Ve IE9 hızlı bir şekilde pazar paylarını kaybediyor ve 1px aktif etkisi anlamsal işaretlemeyi kullanmamızı engellememeli. <a>bir bağlantıdır, sizi bir yere göndermek içindir, yaptığımız eylemler için <button>.
mjsarfatti

141

Birincisi, ideal olarak kullanıcının JavaScript'i devre dışı bırakması durumunda takip edilecek gerçek bir bağlantı ile. JavaScript yürütülürse tıklama etkinliğinin tetiklenmesini önlemek için false değerini döndürdüğünüzden emin olun.

<a href="#" onclick="myJsFunc(); return false;">Link</a>

Angular2 kullanıyorsanız, bu şekilde çalışır:

<a [routerLink]="" (click)="passTheSalt()">Click me</a>.

Buraya bakın https://stackoverflow.com/a/45465728/2803344


19
JavaScript'in etkin olduğu ve işlevin desteklendiği kullanıcı aracılarında, sayfanın üst kısmındaki bağlantıya (JS'nin herhangi bir nedenle başarısız olduğu kullanıcı aracıları için) geri düşen bir JavaScript işlevi çalıştırın? Bu nadiren mantıklı bir düşüştür.
Quentin

21
"ideal olarak kullanıcının JavaScript'i devre dışı bırakılmış olması durumunda gerçek bir bağlantı ile takip etmek", sitenin çalışması için JS'ye ihtiyaç duyduğuna dair bir açıklama olsa bile yararlı bir sayfaya gitmemesi gerekir. başarısız olarak gelince, geliştirici dağıtmadan önce uygun tarayıcı özellik algılama, vb kullanmak için beklenir.
Zach

Böyle bir şeyin sadece bir pop-up veya benzer şekilde basit bir şey göstermek için olacağını umuyorum (umarım). Bu durumda, varsayılan açılır sayfa URL'si olur. Bu bir web uygulamasının bir parçasıysa veya JS'nin devre dışı bırakılması sayfayı tamamen
kırarsa

5
Web uygulamalarım incelikle indirilecek şekilde tasarlandığından, bağlantı yine de faydalı bir sayfa olacak. Web uygulamanız bir sohbet istemcisi veya etkileşimli bir şey olmadığı sürece, tasarımda bozulma düşünülerek zaman ayırırsanız bu işe yarayacaktır.
Zach

2
Sorun, myJsFunc bir hata atarsa, yanlış dönüş için yakalanmaz.
Tracker1

106

Bana sorarsanız;

"Bağlantınızın" tek amacı JavaScript kodunu çalıştırmaksa bağlantı olarak nitelendirilmez; bunun yerine bir JavaScript işlevine bağlı bir metin parçası. Bir bağlantıyı taklit etmek için ona bağlı bir <span>etiket onclick handlerve bazı temel CSS kullanmanızı tavsiye ederim . Bağlantılar gezinme için yapılır ve JavaScript kodunuz gezinme için değilse bir <a>etiket olmamalıdır .

Misal:

function callFunction() { console.log("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class="jsAction" onclick="callFunction();">here</span>.</p>


126
Bu yaklaşım, 'link'i sadece bir fare işlemiyle sınırlar. Bir çapa klavye aracılığıyla ziyaret edilebilir ve enter tuşuna basıldığında 'onclick' olayı tetiklenir.
AnthonyWJones

40
CSS'nizdeki sabit kodlama renkleri, tarayıcının kullanıcının tanımlayabileceği özel renkleri kullanmasını önler, bu da erişilebilirlikle ilgili bir sorun olabilir.
Hosam Aly

30
<span>ler anlamına gelmez yapmak şey. <A>çapa ve <buttons>bunun için kullanılır!
redShadow

22
A kullanırken buttonsburada kullanmak daha iyi bir seçimdir span.
Aralık'ta

1
Bence bir açıklık bir çapa etiketinden daha iyidir. Sabit etiket sizi zorunlu href özelliğine yönlendirmek için vardır. Eğer href kullanmayacaksanız, çapa kullanmayın. Bağlantıyı fareyle sınırlamaz, çünkü bir bağlantı değildir. Bir href yok. Daha çok bir butona benziyor ama yayınlamıyor. Hiçbir şey yapmama süresi tamamen geçersizdir. Fareyle üzerine geldiğinizde etkinleşen bir açılır menü düşünün. Muhtemelen açıklık ve div'ların birleşimidir ve ekrandaki bir alanı genişleten bir düğmenin işlevini yerine getirir.
NibblyPig

97

İdeal olarak bunu yaparsınız:

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Daha da iyisi, HTML'de varsayılan işlem bağlantınız olur ve DOM oluşturulduktan sonra onclick olayını öğeye göze çarpmadan JavaScript aracılığıyla eklersiniz, böylece JavaScript yoksa / kullanılmıyorsa, kodunuzu bilmeden ve gerçek içeriğinizi potansiyel olarak şaşırtmaktan (veya en azından dikkatinizi dağıtmaktan) yararsız olay işleyicilere sahip olmak.


76

Kullanmak sadece #bazı komik hareketler yapar, bu yüzden #selfyazma çabalarından tasarruf etmek istiyorsanız kullanmanızı tavsiye ederim JavaScript bla, bla,.


7
WOW, bu ipucu için başparmak. #selfAdlandırılmış etiketleri kullanabileceğinizi ve sayfanın üstüne atlamaktan rahatsız edici tarayıcı davranışından kaçınabileceğinizi asla bilmiyordum . Teşekkür ederim.
alonso.torres

34
Referans olarak, #selfözel görünmüyor. Belgedeki herhangi bir öğenin adıyla veya kimliğiyle eşleşmeyen (ve boş veya "üst" olmayan) herhangi bir parça tanımlayıcı aynı etkiye sahip olmalıdır.
cHao

1
Genellikle sadece tamamlanmış bir bağlantı adı kullanıyorum, ancak bence bunu işim boyunca tutarlı olacak şekilde yapmaya başlayacağım.
Douglas.Sesar

11
Ben #voiddiğer yorumda kongre kurulması önerdi ama aslında #selfezberlemek kadar kısa ve kolaydır. Her şey daha iyi#
jakub.g

6
Ancak bu bağlantıyı tıklarsanız, kullanıcı için URL'de "# void" ifadesini görmek garip olur, #self veya başka bir şekilde aynı hata ve hata gibi görünür.
pmiranda

68

Aşağıdakileri kullanıyorum

<a href="javascript:;" onclick="myJsFunc();">Link</a>

yerine

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

2
javascript:Fareyle üzerine geldiğimde durum çubuğunda en düzenli göründüğü için (noktalı virgül yok) kullanıyorum.
Boann

4
Bu kod eski IE'de kötü sürprizlere neden olabilir. Bir noktada, rollover'lar ve hatta hareketli gifler de dahil olmak üzere resimlerle animasyon efektlerini kırmak için kullanılır: groups.google.com/forum/#!topic/comp.lang.javascript/…
Ilya Streltsyn

Her zaman yapabilirsiniz ... javascript:void('Do foo')void ne olursa olsun tanımsız olarak geri döneceğinden, kullanıcıya tıklamanın ne yapacağını gösteren bir gösterge verecektir. Nerede Do fooolabilir Delete record Xya da her neyse gibi.
Tracker1

53

Başka bir yerde, hrefözellikte normal URL kullanmanız gerektiğini belirten , ardından onclick'te bazı JavaScript işlevlerini çağırmanız gerektiğini belirten önerileri kabul ediyorum . Kusur, return falseçağrıdan sonra otomatik olarak ekledikleri .

Bu yaklaşımdaki sorun, işlev çalışmazsa veya herhangi bir sorun olursa, bağın silinemez hale gelmesidir. Onclick etkinliği her zaman geri döner false, bu nedenle normal URL çağrılmaz.

Çok basit bir çözüm var. Düzgün çalışıyorsa işlevin geri gelmesine izin verin true. Ardından, tıklamanın iptal edilip edilmeyeceğini belirlemek için döndürülen değeri kullanın:

JavaScript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

HTML

<a href="path/to/some/url" onclick="return !doSomething();">link text</a>

Ben, doSomething()işlevin sonucunu reddettiğimi unutmayın . trueÇalışırsa geri döner , bu yüzden reddedilir ( false) ve path/to/some/URLçağrı yapılmaz. İşlev dönecekse false(örneğin, tarayıcı işlev içinde kullanılan bir şeyi desteklemiyorsa veya başka bir şey yanlış giderse), reddedilir trueve path/to/some/URLçağrılır.


50

#daha iyidir javascript:anything, ancak aşağıdakiler daha da iyidir:

HTML:

<a href="/gracefully/degrading/url/with/same/functionality.ext" class="some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

Her zaman zarif bir bozulma için çaba göstermelisiniz (kullanıcının JavaScript'in etkin olmaması durumunda ... ve özellikler ve bütçe ile olduğunda). Ayrıca, JavaScript niteliklerini ve protokolünü doğrudan HTML'de kullanmak kötü bir form olarak kabul edilir.


1
@Muhd: Dönüş clickbağlantılar üzerinde etkinleşmeli …
Ry-

50

Bunun <button>yerine, özellikle kontrolün verilerde bir değişiklik üretmesi gerekiyorsa bir eleman kullanmanızı öneririm . (POST gibi bir şey.)

Elemanları dikkat çekmeden enjekte ederseniz, bir tür ilerici geliştirme daha da iyidir. ( Bu yoruma bakın .)


2
Ben de bunun en iyi çözüm olduğunu düşünüyorum. Bir eylemi gerçekleştirmeyi amaçlayan bir öğeniz varsa, bunun bir bağlantı olması için bir neden yoktur.
mateuscb

Eğer sormak isteseydiniz ve hrefiniz "#something" gibi görünebilirdi, ancak listelenen diğer cevaplardan bazıları işe yarayabilir, ancak: Href mantıklı bir şeye bağlantı vermeden, bir href'e, hatta bir bağlantıya sahip olmanın bir anlamı yoktur. Düğmenin önerilen kullanımı hiçbir yerde bir bağlantı teşekkür bağlantıları dışında herhangi bir öğe kullanabilir veya kullanabilir.
kontur

1
Bunun bir başka avantajı, Bootstrap'ın .btndüğmeleri ve bağlantıları tamamen aynı göstermesidir.
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Kullanıcı açısından, buttonURL'ye bir # sokmaz veya ahref'i javascript olarak göstermez ;;
Coll

39

Bağlantıyı JavaScript kullanarak yazmadığınız sürece (tarayıcıda etkinleştirildiğini bilmeniz için), ideal olarak JavaScript devre dışı bırakılan kişiler için uygun bir bağlantı sağlamanız ve ardından bağlantınızdaki bağlantının varsayılan eylemini önlemeniz gerekir. olay işleyicisi. Bu şekilde JavaScript etkin olanlar işlevi çalıştıracak ve JavaScript devre dışı olanlar yalnızca bağlantıyı tıklayıp hiçbir şey olmamak yerine uygun bir sayfaya (veya aynı sayfa içindeki bir konuma) atlayacaktır.


36

Kesinlikle hash ( #) daha iyidir çünkü JavaScript'te bir pseudoscheme:

  1. tarihi kirletir
  2. motorun yeni bir kopyasını başlatır
  3. global kapsamda çalışır ve etkinlik sistemine saygı göstermez.

Tabii ki varsayılan eylemi önleyen bir onclick işleyici ile "#" daha iyi. Ayrıca, JavaScript'i çalıştırmak için tek amacı olan bir bağlantı, kullanıcıyı bir şey ters gittiğinde sayfada mantıklı bir çapa (sadece # en üste gönderir) göndermediğiniz sürece gerçekten "bir bağlantı" değildir. Sadece stil sayfası ile bağlantının görünümünü ve hissini simüle edebilir ve href'i unutabilirsiniz.

Buna ek olarak, cowgod'un önerisiyle ilgili olarak, özellikle bu: ...href="javascript_required.html" onclick="...Bu iyi bir yaklaşımdır, ancak "JavaScript devre dışı" ve "onclick başarısız" senaryoları arasında ayrım yapmaz.


1
@Berker Yüceer, neden CW?
Ücretsiz Danışmanlık

30

Genellikle giderim

<a href="javascript:;" onclick="yourFunction()">Link description</a>

Javascript'ten daha kısadır: void (0) ve aynısını yapar.


27

Kullanmak istiyorum:

<a href="#" onclick="myJsFunc();return false;">Link</a>

Nedenleri:

  1. Bu href, arama motorlarının ihtiyaç duyduğu basit hale getirir . Başka bir şey kullanırsanız (dize gibi), 404 not foundhataya neden olabilir .
  2. Fare bağlantının üzerine geldiğinde, bunun bir komut dosyası olduğunu göstermez.
  3. Kullanarak return false;sayfa en üste atlamaz veya backdüğmeyi kırmaz .

"1" ile aynı fikirde değilim. çünkü komut dosyalarına izin verilmiyorsa ur komut dosyası bağlantısını koyduğunuzda hata veriyor. js kodu ile bu tür bağlantılar eklenmelidir. Bu şekilde, komut dosyasına izin verilmezken kullanıcılar bu bağlantılardan kaçınabilir ve hiçbir hata görmez.
Berker Yüceer

25

Kullanmayı seçiyorum javascript:void(0), çünkü bunu kullanmak içerik menüsünü açmak için sağ tıklamayı engelleyebilir. Ama javascript:;daha kısa ve aynı şeyi yapıyor.


24

Dolayısıyla, bir <a />etiketle bazı JavaScript işlemleri yaparken ve href="#"aynı zamanda koyarsanız , etkinliğin sonuna (satır içi etkinlik bağlaması durumunda) aşağıdaki gibi false değerini ekleyebilirsiniz :

<a href="#" onclick="myJsFunc(); return false;">Run JavaScript Code</a>

Veya href özelliğini aşağıdaki gibi JavaScript ile değiştirebilirsiniz :

<a href="javascript://" onclick="myJsFunc();">Run JavaScript Code</a>

veya

<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>

Fakat anlamsal olarak, bunu başarmak için yukarıdaki tüm yöntemler yanlıştır (yine de iyi çalışır) . Sayfada gezinmek için herhangi bir öğe oluşturulmamışsa ve onunla ilişkili bazı JavaScript öğeleri varsa, bu bir <a>etiket olmamalıdır .

Bunun <button />yerine bir şeyleri veya b, span veya ihtiyacınıza göre orada uygun olan herhangi bir öğeyi yapmak için kullanabilirsiniz , çünkü tüm öğelere etkinlik eklemenize izin verilir.


Yani, kullanmanın bir yararı var<a href="#"> . İmleç işaretçisini varsayılan olarak bu öğede alırsınız a href="#". Bunun için, CSS'yi cursor:pointer;bu sorunu da çözecek şekilde kullanabileceğinizi düşünüyorum .

Ve sonunda, etkinliği JavaScript kodunun kendisinden bağlıyorsanız, etiket event.preventDefault()kullanıyorsanız bunu başarmak için yapabilirsiniz <a>, ancak bunun için bir <a>etiket kullanmıyorsanız , bir avantaj elde edersiniz. Bunu yapmak zorunda değilim.

Bu nedenle, bu tür şeyler için bir etiket kullanmamak daha iyidir.


23

Bağlantıları yalnızca JavaScript'i çalıştırmak için kullanmayın.

Href = "#" kullanımı sayfayı yukarı kaydırır; void (0) kullanımı tarayıcıda gezinme sorunları yaratır.

Bunun yerine, bağlantı dışında bir öğe kullanın:

<span onclick="myJsFunc()" class="funcActuator">myJsFunc</span>

Ve CSS ile şekillendirin:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}

13
Aralık değil, bir düğme kullanın. Düğmeler doğal olarak odak sırasına düşer, böylece fare / izleme dörtgeni / vb. Olmadan erişilebilir.
Quentin

4
Ton Quentin'ın yorumu ekleniyor: şu anda yazıldığı gibi, klavye kullanıcıları spanodaklanamayan bir öğe olduğu için öğeye ulaşmayacak . Bu yüzden bir düğmeye ihtiyacın var.
Tsundoku

1
tabindex="0"Yayılma alanına ekleyerek odaklanabilir hale getirebilirsiniz . Bununla birlikte, düğmeyi kullanmak daha iyidir, çünkü size ücretsiz olarak istenen işlevselliği sağlar. Bir yayılma alanı kullanarak erişilebilir olmasını sağlamak için yalnızca bir tıklama işleyicisi eklemeniz değil, boşluk çubuğuna veya enter tuşuna basmayı arayan ve ardından normal tıklama işleyicisini tetikleyen bir klavye olay işleyicisi eklemeniz gerekir. Ayrıca, ikinci CSS seçicisini .funcActuator:hover, .funcActuator:focus, öğenin odağı olduğu gerçeği olarak değiştirmek istersiniz .
Yararsız Kod

22

JQuery kullanmak daha iyi olur,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

ve ikisini de atlayın href="#"vehref="javascript:void(0)" .

Bağlantı etiketi işaretlemesi aşağıdaki gibi olacaktır

<a onclick="hello()">Hello</a>

Yeterince basit!


5
Bunu söyleyecektim. Bir bağlantının anlamlı bir yedek URL'si varsa bunu kullanın. Aksi takdirde, href'i atlayın veya <a> 'den daha semantik olarak uygun bir şey kullanın. Eğer href de dahil olmak üzere herkesin savunmasının tek nedeni parmağınızı üzerine getirmektir, basit bir "imleç: işaretçi;}" işinizi görecektir.
Matt Kantor

12
Bu korkunç erişilebilirlik sağlar. SO'da deneyin: fareyi kullanmadan bir gönderiyi işaretleyemezsiniz. "Bağlantı" ve "düzenle" bağlantılarına sekme yoluyla erişilebilir, ancak "işaret" kullanılamaz.
Nicolás

6
Bu seçeneğe katılıyorum. Çapanın JavaScript dışında bir amacı yoksa, href içermemelidir. @Fatih: jQuery kullanmak, JavaScript devre dışı bırakılırsa bağlantının bir işaretçisi OLMAYACAK anlamına gelir.
Scott Rippey

3
Bu rotaya gidecekseniz, neden jQuery kullanarak tıklamayı bağlamıyorsunuz? JQuery kullanma hakkında harika bir şey, javascript işaretleme ayırmak için yeteneğidir.
Muhd

4
Bu cevabın 11 oyu olduğuna inanamıyorum. Bu korkunç. Neden Javascript (ve jQuery ??) ile bir stil ekliyor ve ardından HTML'de onclick eyleminizi tanımlıyorsunuz? Korkunç.
MMM

20

Kullanacağınız edersek angularjs , aşağıdaki kullanabilirsiniz:

<a href="">Do some fancy JavaScript</a>

Hangi hiçbir şey yapmaz.

Ek olarak

  • (#) İle olduğu gibi sizi sayfanın en üstüne götürmez
    • Bu nedenle, açıkça falseJavaScript ile geri dönmenize gerek yoktur
  • Kısa bir öz

6
Ancak bu, sayfanın yeniden yüklenmesine neden olur ve sayfayı değiştirmek için her zaman javascript kullandığımız için bu kabul edilemez.
Henry Hu

@HenryHu Yeniden yüklememesinin nedeninin AngularJS yüzünden olduğunu anladım. Güncellenmiş cevabımı görün.
whirlwin

19

Yoksa hiçbir hrefbelki bir tutturma etiketini kullanmak için hiçbir neden yoktur.

Hemen hemen her öğeye etkinlik (tıklama, fareyle üzerine gelme vb.) Ekleyebilirsiniz, neden yalnızca a spanveya a kullanmıyorsunuz div?

JavaScript devre dışı bırakılmış kullanıcılar için: bir yedek yoksa (örneğin, bir alternatif href), en azından bir öğe <a>veya <span>etiket ne olursa olsun bu öğeyi hiç görememeli ve etkileşime girmemelidir.


19

Genellikle, JavaScript devre dışı bırakılmış istemcilerin hala bazı işlevlere sahip olduğundan emin olmak için her zaman bir geri dönüş bağlantınız olmalıdır. Bu konsepte göze batmayan JavaScript denir.

Örnek ... Diyelim ki aşağıdaki arama bağlantınız var:

<a href="search.php" id="searchLink">Search</a>

Her zaman aşağıdakileri yapabilirsiniz:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

Bu şekilde, JavaScript'i devre dışı bırakılan kullanıcılar yönlendirilirken search.php, JavaScript kullanan izleyicileriniz gelişmiş işlevlerinizi görüntüler.


17

Onları birlikte kullanıyorum. Örneğin:

HTML

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

biraz jQuery ile

$('a[href="#"]').attr('href','javascript:void(0);');

veya

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

Ancak bunu, kullanıcı boş bir bağlantıya tıkladığında sayfanın üste atlamasını önlemek için kullanıyorum. Nadiren onClick ve diğer onetkinlikleri doğrudan HTML'de kullanıyorum .

Benim önerim, bağlantı yerine öznitelikli <span>öğe kullanmaktır class. Örneğin:

<span class="link">Link</span>

Ardından, işlevi .linkgövdeye ve </body>etiketin hemen önüne veya harici bir JavaScript belgesine sarılmış bir komut dosyasıyla atayın .

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

* Not: Dinamik olarak oluşturulan öğeler için şunları kullanın:

$('.link').on('click', function() {
    // do something
});

Dinamik olarak oluşturulan öğelerle oluşturulan dinamik olarak oluşturulan öğeler için şunları kullanın:

$(document).on('click','.link', function() {
    // do something
});

Ardından, span öğesini küçük bir CSS'ye sahip bir çapa gibi görünecek şekilde şekillendirebilirsiniz:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

İşte bir jsFiddle yukarıda belirtilen yukarıdaki örneği.


16

Neyi başarmak istediğinize bağlı olarak, onclick'i unutabilir ve sadece href'i kullanabilirsiniz:

<a href="javascript:myJsFunc()">Link Text</a>

Yanlış geri dönme ihtiyacı ortadan kalkar. Bu #seçeneği sevmiyorum çünkü belirtildiği gibi kullanıcıyı sayfanın en üstüne götürecektir. Kullanıcıları JavaScript etkin değilse göndermek için başka bir yere sahipseniz (çalıştığım yerde nadirdir, ancak çok iyi bir fikirdir), Steve'in önerilen yöntemi harika çalışır.

<a href="javascriptlessDestination.html" onclick="myJSFunc(); return false;">Link text</a>

Son olarak, javascript:void(0)kimsenin bir yere gitmesini istemiyorsanız ve bir JavaScript işlevini çağırmak istemiyorsanız kullanabilirsiniz. Fareyle üzerine gelme etkinliğinin olmasını istediğiniz bir resminiz varsa harika çalışır, ancak kullanıcının tıklayacağı hiçbir şey yoktur.


3
Bu ile tek dezavantajı (bellekten, yanlış olabilir) IE içinde bir href yoksa A bir A olarak düşünmüyor olmasıdır. (Yani CSS kuralları çalışmaz)
Benjol

16

Birkaç sahte bağım olduğunda, onlara 'bağlantısız' bir sınıf vermeyi tercih ederim.

Sonra jQuery, ben aşağıdaki kodu ekleyin:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

Ve HTML için, bağlantı basitçe

<a href="/" class="no-link">Faux-Link</a>

Çapa için kullanılmadıkça Hash-Tags kullanmayı sevmiyorum ve sadece ikiden fazla sahte bağlantım olduğunda yukarıdakileri yapıyorum, aksi takdirde javascript: void (0) ile gidiyorum.

<a href="javascript:void(0)" class="no-link">Faux-Link</a>

Tipik olarak, sadece bir bağlantı kullanmaktan kaçınmayı ve sadece bir açıklığa bir şey sarmayı ve bunu bir pop-up veya içerik ortaya çıkarma gibi bazı JavaScript kodlarını etkinleştirmenin bir yolu olarak kullanmayı seviyorum.


16

Yanlış bir ikilik sunduğuna inanıyorum. Bunlar sadece iki seçenek değil.

Ankraj etiketini kullanıyor olsanız bile, burada gerçekten bir ankrajınızın olmadığını öneren D4V360'a katılıyorum. Sahip olduğunuz tek şey, belgenin biraz farklı davranması gereken özel bir bölümüdür. Bir <span>etiket çok daha uygundur.


Bir değiştirmek olsaydı da abir ile span, sen klavye ile bunu odaklanabilir hale getirmek için hatırlamak gerekir.
AndFisher

16

Google Chrome'da geliştirici araçlarıyla birlikte denedim ve id="#"0,32 saniye sürdü. İken javascript:void(0)yöntemi sadece 0.18 saniye sürdü. Google Chrome'da javascript:void(0)daha iyi ve daha hızlı çalışır.


Aslında aynısını yapmıyorlar. #, sayfanın üstüne atlamanızı sağlar.
Jochen Schultz

13

Temelde bu pratik makaleden aşamalı geliştirme kullanarak yorum yapıyorum . Kısa cevap, hiçbir zaman kullanmamanız javascript:void(0);veya #kullanıcı arayüzünüz JavaScript'in etkin olduğunu önceden belirlemediyse, bu durumda kullanmanız gerekirjavascript:void(0); . Ayrıca, span'ı link olarak kullanmayın, çünkü bu başlangıç ​​olarak anlamsal olarak yanlıştır.

Uygulamanızda / Home / Action / Parameters gibi SEO dostu URL rotalarını kullanmak da iyi bir uygulamadır. Öncelikle JavaScript olmadan çalışan bir sayfaya bağlantınız varsa, daha sonra deneyimi artırabilirsiniz. Çalışan bir sayfaya gerçek bir bağlantı kullanın, ardından sunuyu geliştirmek için tek bir etkinlik ekleyin.

İşte bir örnek. Home / ChangePicture, kullanıcı arabirimi ve standart HTML gönderme düğmeleriyle tamamlanmış bir sayfadaki formun çalışan bir bağlantısıdır, ancak jQueryUI düğmeleriyle kalıcı bir iletişim kutusuna daha hoş bir şekilde enjekte edilmiş görünüyor. Her iki şekilde de, mobil ilk geliştirmeyi tatmin eden tarayıcıya bağlı olarak çalışır.

<p><a href="Home/ChangePicture" onclick="return ChangePicture_onClick();" title="Change Picture">Change Picture</a></p>

<script type="text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if(!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>

SEO açısından bu yolu tercih ederim. Kolay URL kullanımı, sayfa değeri faktörünü kesinlikle geliştirecektir.
Chetabahana
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.