JavaScriptリンクに使用する「href」値は、「#」または「javascript:void(0)」ですか?


4076

以下は、JavaScriptコードを実行することのみを目的としたリンクを作成する2つの方法です。機能、ページの読み込み速度、検証目的などの点でどちらが優れていますか?

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

または

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


202
私が何かを逃していない限り、<a href="javascript:void(0)" onclick="myJsFunc();">全く意味がありません。あなたがいる場合必要があります使用してjavascript:擬似プロトコルを、あなたは必要としないonclick属性を同様。<a href="javascript:myJsFunc();">うまくいきます。
ウェズリーマーチ2013年

65
@WesleyMurch- myJsFunc()戻り値がある場合、ページは壊れます。 jsfiddle.net/jAd9G次のvoidよう に使用する必要があります<a href="javascript:void myJsFunc();">。しかし、それでも動作は異なります。コンテキストメニューからリンクを呼び出しても、clickイベントはトリガーされません。
gilly3 2013

38
なぜ<a href="javascript:;" onclick="myEvent()"ですか?
3k- 2013年

26
javascript:;入力するよりもはるかに高速ですjavascript:void(0)
マイクコーザー

78
これを見て最初に考えたのは、「<a>ネイティブブラウザ機能を使用して別のページを開くのではなく、JavaScriptの「アクション」をトリガーするのにspanタグを使用するのはなぜですか。js-triggerおそらくはるかに良いでしょう」。それとも何か不足していますか?
Adrien Be

回答:


2164

使用しますjavascript:void(0)

3つの理由。#開発者のチームの間での使用を奨励すると、必然的に、次のように呼び出される関数の戻り値を使用するようになります。

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

しかし、彼らreturn doSomething()はonclickで使うのを忘れて、ただを使いますdoSomething()

回避する2番目の理由は、呼び出された関数がエラーをスローした場合、#ファイナルreturn false;が実行されないことです。したがって、開発者は呼び出された関数でエラーを適切に処理することも覚えておく必要があります。

3番目の理由は、onclickイベントプロパティが動的に割り当てられる場合があることです。アタッチメントのメソッドごとに特別に関数をコーディングせずに、関数を呼び出したり、動的に割り当てたりできるようにしたい。したがって、onclickHTMLマークアップの私の(または何でも)は次のようになります。

onclick="someFunc.call(this)"

または

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

使用するjavascript:void(0)ことで上記のすべての頭痛の種が回避され、私はマイナス面の例を見つけていません。

ですから、もしあなたが一人の開発者なら、あなた自身の選択を明確にすることができますが、チームとして働くなら、あなたはどちらかを述べなければなりません:

を使用しhref="#"onclick常にreturn false;最後にが含まれていることを確認してください。呼び出された関数がエラーをスローしないonclickことを確認しますfalse。関数を動的にプロパティにアタッチする場合は、エラーをスローせず、エラーが返されないことを確認してください。

または

使用する href="javascript:void(0)"

2つ目は、明らかにコミュニケーションがはるかに簡単です。


329
私は常にすべてのリンクを新しいタブで開きます。これが、このhref="javascript:void(0)"方法を使用するときに私が個人的にそれを嫌う理由です
Timo Huovinen

182
この回答に賛成票が非常に多いのはなぜですか。の使用はすべてjavascript:、悪い習慣、邪魔なものと見なされるべきであり、優雅な格下げにはなりません。
Lankymart 2013

52
次の2つの答えは、これよりもはるかに優れており、合理的です。また、最初の2つの引数は無効です。これevent.preventDefault()は、デフォルトの動作(この場合はページの上部にジャンプするなど)を完全にreturn false;回避して、すべての狂気なしでより良い仕事をするためです。
sudee 2013

136
2013年に早送り:CSP対応のHTTPSページのコンテンツセキュリティポリシーjavascript:void(0)違反します。1つのオプションは、その後の使用になりますと、ハンドラで、私はこれだけ好きではありません。おそらく、使用する規則を確立して、ページの要素にがないことを確認できます。この方法では、存在しないアンカーへのリンクをクリックしてもページはスクロールされません。href='#'event.preventDefault()href='#void'id="void"
jakub.g 2013年

24
「#」を使用して、クリックイベントを「#」をとしてすべてのリンクにバインドできますhref。これはとjQueryの中で行われることになります$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
ネイサン

1325

どちらでもない。

意味のある実際のURLがある場合は、それをHREFとして使用します。リンクをクリックして新しいタブを開くか、JavaScriptが無効になっている場合、onclickは発生しません。

それが不可能な場合は、JavaScriptと適切なクリックイベントハンドラーを使用して、少なくともアンカータグをドキュメントに挿入する必要があります。

私はこれが常に可能であるとは限らないことを理解していますが、私の意見では、公開ウェブサイトを開発するために努力すべきです。

邪魔にならないJavaScriptプログレッシブ拡張(両方のWikipedia)を調べてください。


19
「JavaScriptと適切なクリックイベントハンドラーを使用してアンカータグをドキュメントに挿入する」方法の例を教えてください。
user456584 2013

11
要素をa)クリックするためだけに使用することを意図しているのに、なぜアンカータグを挿入するのですか。このシナリオでは、アンカータグを挿入することも重要ではないようです。
2013年

12
どちらも+1しますが、オーバーアプローチがあります。事実は、どちらか一方javascript:または#両方の使用を維持しているため、推奨されません。ところで素敵な記事。
Lankymart 2013

13
@crush:divもspanも使用しません。率直に言って、これはまさにその<button>目的のために作られたようです。しかし、同意<a>しました。リンクするのに適した場所がない場合は、おそらく具体的にはすべきではありません。
cHao

14
@cHao Buttonがおそらく最良の選択です。要点は、HTML要素は、そのデフォルトのプレゼンテーションの外観に基づいて選択されるべきではなく、むしろドキュメントの構造に対する重要性だと思います。
2014

775

やること<a href="#" onclick="myJsFunc();">Link</a><a href="javascript:void(0)" onclick="myJsFunc();">Link</a>またはonclick属性を含む他のこと-5年前は大丈夫でしたが、今は悪い習慣になる可能性があります。理由は次のとおりです。

  1. それは邪魔なJavaScriptの実践を促進します-それは維持するのが難しく、スケーリングするのが難しいことが判明しました。詳細については、控えめなJavaScriptをご覧ください。

  2. あなたはあなたの時間を費やして、信じられないほど非常に冗長なコードを書いています-これはコードベースにほとんど(もしあれば)利益をもたらしません。

  3. 現在、望ましい結果を達成するためのより優れた、より簡単で、より保守可能でスケーラブルな方法があります。

控えめなJavaScriptの方法

まったくhref属性を持たないでください!CSSを適切にリセットすると、欠落しているデフォルトのカーソルスタイルが処理されるため、問題はありません。次に、優雅で控えめなベストプラクティスを使用してJavaScript機能をアタッチします。これは、マークアップではなくJavaScriptロジックがJavaScriptに留まるため、より保守しやすくなります。これは、ロジックを分割する必要がある大規模なJavaScriptアプリケーションの開発を始めるときに不可欠です。ブラックボックス化されたコンポーネントとテンプレート。これについてもっと大規模なJavaScriptのアプリケーションアーキテクチャ

簡単なコード例

// 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>

ブラックボックス化されたBackbone.jsの

スケーラブルでブラックボックス化されたBackbone.jsコンポーネントの例については、こちらの動作するjsfiddleの例をご覧ください。控えめなJavaScriptプラクティスをどのように利用しているかに注意してください。少量のコードで、異なるコンポーネントインスタンス間の副作用や競合なしに、ページ全体で複数回繰り返すことができるコンポーネントがあります。すごい!

ノート

  • 要素のhref属性を省略aすると、tabキーナビゲーションを使用して要素にアクセスできなくなります。tabキーを介してこれらの要素にアクセスできるようにする場合は、tabindex属性を設定するか、button代わりに要素を使用できます。Tracker1の回答で述べたように、ボタン要素のスタイルを通常のリンクのように簡単に設定できます

  • 要素のhref属性を省略するaと、Internet Explorer 6Internet Explorer 7a:hoverスタイルを適用しa.hoverなくなります。そのため、代わりに単純なJavaScriptシムを追加してこれを実現しています。これは完全に問題ありません。href属性がなく、適切な低下がない場合、リンクはいずれにしても機能せず、さらに大きな問題が発生する可能性があります。

  • JavaScriptを無効にしてもアクションを引き続き機能させたい場合は、Ajaxリクエストなどを経由する代わりに手動でアクションを実行するURLにアクセスaするhref属性を持つ要素を使用します。これを行ってevent.preventDefault()いる場合は、ボタンがクリックされたときにリンクをたどらないことを確認するために、クリック呼び出しを確実に実行する必要があります。このオプションは、グレースフルデグラデーションと呼ばれます。


163
注意してください。href属性をオフのままにしておくと、ブラウザー間での互換性がなくなり、インターネットエクスプローラーのホバー効果などが失われます
Thomas Davis

16
注意:buttonここで提案されているリンクスタイルのアプローチは、IE9以前で避けられない「3d」アクティブ状態に悩まされています。
ブレナンロバーツ

44
この答えは過度に独断的であると思います。JSの動作を1つまたは2つのa hrefに適用したい場合があります。その場合、追加のCSSを定義してJS関数全体を挿入するのはやりすぎです。場合によっては(CMSを介してコンテンツを追加するなど)、実際には新しいCSSまたはスタンドアロンのJSを挿入することが許可されておらず、インラインで実行できます。1つまたは2つの単純なJS a hrefの場合、インラインソリューションの保守性が実際にどのように低下​​するかはわかりません。これを含む、悪い習慣に関する幅広い一般的な声明には常に疑いを持ってください:)
ジョーダン・リーガー2013年

17
解決するのが難しいこれらすべての「メモ」を使用します(tabindexを設定すると、複雑なページで問題が発生します!)。ただ行う方がはるかに良いjavascript:void(0)。それが実用的な答えであり、現実の世界で唯一の賢明な答えです。
Abhi Beckert 2013

14
Webアプリケーションをアクセス可能にすることに関心がある場合は(そうする必要があります)、hrefについては単純さと健全性が主張されます。狂気はtabindexの方向にあります。
jkade 2013

328

'#'ユーザーをページの上部に戻すので、通常はを使用しvoid(0)ます。

javascript:; のようにも動作します javascript:void(0);


68
これを回避する方法は、onclickイベントハンドラでfalseを返すことです。
Guvante 2008

34
イベントハンドラーでfalseを返しても、JavaScriptの場合、JSが正常に実行されないことは避けられません。
クエンティン

28
「#someNonExistantAnchorName」を使用すると、ジャンプ先がないため、うまく機能します。
scunliffe 2008

21
あなたはベースのhrefを持っている場合、#または#somethingそのアンカーに行くことができますベースのhref上のページの代わりに、現在のページに。
Abhi Beckert

11
シバン(#!)はトリックを行いますが、それは間違いなく悪い習慣です。
Neel

276

どちらも正直に提案します。私は<button></button>その振る舞いに様式化されたものを使用します。

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>

このようにして、onclickを割り当てることができます。またonclick、要素タグの属性を使用するのではなく、スクリプトを介してバインドすることをお勧めします。唯一の問題は、無効にできない古いIEの疑似3dテキスト効果です。


A要素を使用する必要がある場合javascript:void(0);前述の理由で使用してください。

  • onclickイベントが失敗した場合に備えて、常にインターセプトします。
  • 誤ったロード呼び出しが発生したり、ハッシュの変更に基づいて他のイベントがトリガーされたりすることはありません
  • ハッシュタグは、クリックがフォールスルー(onclick throws)した場合に予期しない動作を引き起こす可能性があり、適切なフォールスルー動作でない場合は回避し、ナビゲーション履歴を変更する必要があります。

注:は、クリックによって実際に何が行われるかを示す追加のインジケータとして機能0する文字列に置き換えることができjavascript:void('Delete record 123')ます。


IE8 / IE9では、ボタンの:アクティブ状態の1px "3D"オフセットを削除できません。
ブレナンロバーツ

@BrennanRobertsええ、残念ながら、IEではボタンのスタイル設定の方が問題があります...たまに自分のルールを破らないのではなく、おそらくそれがおそらく最も適切なアプローチだと思います。
Tracker1

次に<button>input type=button代わりに使用しないでください?
Patrik Affentranger 2014

4
次に、<clickable>要素を使用します。または、<clickabletim>必要に応じて。残念ながら、非標準のタグまたは単純なdivを使用すると、キーボードユーザーが要素に集中することが難しくなる場合があります。
joeytwiddle

28
この答えは上にする必要があります。このジレンマを抱えている場合は、実際にが必要な可能性がありますbutton。そして幸運にもIE9は市場シェアを急速に失いつつあり、1ピクセルのアクティブな効果がセマンティックマークアップの使用を妨げることはないはずです。<a>リンク<button>です。私たちが持っているアクションのために、どこかにあなたを送ることを意図しています。
mjsarfatti 2016年

141

最初のものは、理想的には、ユーザーがJavaScriptを無効にしている場合にたどる実際のリンクがあります。JavaScriptが実行された場合にクリックイベントが発生しないように、必ずfalseを返してください。

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

Angular2を使用する場合、この方法は機能します:

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

こちらをご覧くださいhttps://stackoverflow.com/a/45465728/2803344


19
それで、JavaScriptが有効で、サポートされている機能を持つユーザーエージェントでは、JavaScript関数が実行され、ページの上部へのリンクにフォールバックします(何らかの理由でJSが失敗するユーザーエージェントの場合)?これはめったに賢明なフォールバックではありません。
クエンティン

21
「ユーザーがJavaScriptを無効にしている場合にたどる実際のリンクを使用するのが理想的です」。たとえサイトがJSを動作させる必要があるという単なる説明である場合でも、#ではなく便利なページに移動する必要があります。失敗に関しては、開発者が展開する前に適切なブラウザ機能の検出などを使用することを期待します。
Zach

私は、このようなものはポップアップまたは同様に単純なものを表示するためだけのものであると思います(期待します)。その場合、デフォルトはポップアップページのURLになります。これがWebアプリケーションの一部である場合、またはJSを無効にするとページが完全に壊れる場合、このコードには別の問題があります...
Brian Moeskau 2009

5
私のWebアプリは適切に機能が低下するように設計されているため、リンクは引き続き有用なページです。Webアプリがチャットクライアントやインタラクティブなものでない限り、劣化を念頭に置いて設計する時間を費やせば、これは機能するはずです。
ザック、

2
問題は、myJsFuncがエラーをスローした場合、falseが返されてもキャプチャされないことです。
Tracker1

106

あなたが私に尋ねてもどちらも;

「リンク」がJavaScriptコードを実行することのみを目的としている場合は、リンクと見なされません。JavaScript関数が結合されたテキストの一部です。リンクを模倣するために、<span>タグをonclick handler付けたタグといくつかの基本的なCSS を使用することをお勧めします。リンクはナビゲーション用に作成されており、JavaScriptコードがナビゲーション用でない場合は、<a>タグにすることはできません。

例:

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
このアプローチは、「リンク」をマウスのみの操作に制限します。キーボードを介してアンカーにアクセスでき、Enterキーが押されるとその「onclick」イベントが発生します。
AnthonyWJones 2008

40
CSSの色をハードコーディングすると、ユーザーが定義したカスタム色をブラウザが使用できなくなり、アクセシビリティに問題が生じる可能性があります。
Aly、

30
<span>sは何もすることを意図していません<A>アンカーと<buttons>そのために使用されます!
redShadow 2011

22
ここでbuttonsは使用する方が良いですが、そうでspanはありません。
apnerve

1
アンカータグよりスパンの方がいいと思います。必須のhref属性に移動するためのアンカータグが存在します。hrefを使用しない場合は、アンカーを使用しないでください。リンクではないため、リンクをマウスに制限しません。hrefはありません。ボタンのようなものですが、投稿しません。何もすることを意図していないスパンは完全に無効です。ホバーするとアクティブになるドロップダウンメニューを検討してください。これはおそらく、スパンとdivの組み合わせであり、画面上の領域を拡張するボタンの機能を実行します。
NibblyPig 14

97

理想的にはこれを行うでしょう:

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

または、さらに良いのは、HTMLにデフォルトのアクションリンクがあり、DOMがレンダリングされた後、JavaScriptを介して控えめにonclickイベントを要素に追加することで、JavaScriptが存在しない/利用されていない場合は、コードを無効にし、実際のコンテンツを難読化(または少なくとも混乱させる)する無用のイベントハンドラーがある。


76

使うだけで#面白い動きができるので#self、のタイピングの手間を省きたい場合に使用することをお勧めしますJavaScript bla, bla,


7
うわー、このヒントを高く評価します。#selfが名前付きタグに使用できることを知らず、ページの先頭にジャンプするというブラウザの煩わしい動作を回避します。ありがとうございました。
alonso.torres

34
参考までに、#self特別ではないようです。文書内の要素の名前またはIDと一致しない(そして空白でも「トップ」でもない)フラグメント識別子は、同じ効果を持つはずです。
cHao 2013年

1
私は通常、構成されたアンカー名を使用しますが、私の作業全体で一貫性を保つために、これを行うことを開始すると思います。
Douglas.Sesar 2014年

11
#void他のコメントでコンベンションを確立することを提案しましたが、実際に#selfは短くて覚えやすいです。何よりも優れている#
jakub.g 2014年

6
しかし、そのリンクをクリックすると、URLに「#void」が表示され、エラーまたはバグのように見えるので、ユーザーには奇妙なものになります。#selfなどと同じです。
プミランダ2017

68

私は以下を使用します

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

代わりに

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

2
javascript:(セミコロンなし)を使用します。ホバーしたときにステータスバーで整然と表示されるためです。
Boann、2012

4
このコードは、古いIEで予期しない事態を引き起こす可能性があります。ある時点で、ロールオーバーやアニメーションGIFを含む、画像のアニメーション効果を壊すために使用されていました:groups.google.com/forum
Ilya Streltsyn 2013

いつでも実行できます... javascript:void('Do foo')voidは未定義を返すため、クリックすると何が行われるかをユーザーに示します。どこにでも、好きなようにDo fooできますDelete record X
Tracker1 2014

53

href属性で通常のURLを使用し、onclickでJavaScript関数を呼び出す必要があると述べている他の提案に同意します。欠点は、彼らreturn falseが電話の後に自動的に追加することです。

このアプローチの問題は、関数が機能しない場合、または問題がある場合、リンクがクリックできなくなることです。Onclickイベントは常にを返すfalseため、通常のURLは呼び出されません。

非常に簡単な解決策があります。true正しく機能する場合は、関数に戻ります。次に、戻り値を使用して、クリックをキャンセルする必要があるかどうかを判断します。

JavaScript

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

HTML

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

doSomething()関数の結果は無効になっていることに注意してください。機能する場合は、が返さtrueれるため、否定(false)され、path/to/some/URLは呼び出されません。関数が戻る場合false(例えば、ブラウザーが関数内で使用されているものをサポートしていないか、何かがうまくいかない場合)、それは否定されtruepath/to/some/URLが呼び出されます。


50

#はより優れjavascript:anythingていますが、以下はさらに優れています。

HTML:

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

JavaScript:

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

(ユーザーがJavaScriptを有効にしていない場合、そして仕様と予算を使用している場合は)常に適切な低下に努める必要があります。また、JavaScript属性とプロトコルを直接HTMLで使用することは、不適切なフォームと見なされます。


1
@Muhd:Returnはclickリンク上でアクティブになるはずです
Ry-

50

特にコントロールがデータの変更を生成することになっている場合は、<button>代わりに要素を使用することをお勧めします。(POSTのようなもの。)

要素を目立たないように注入する、プログレッシブエンハンスメントの一種であるとさらに良いです。(このコメントを参照してください。)


2
私もこれが最良の解決策だと思います。アクションを実行するための要素がある場合、それがリンクである理由はありません。
mateuscb 2011年

あなたが尋ねると、hrefは "#something"のようになります。リストされている他の回答のいくつかは役立つ可能性があります。推奨されるボタンの使用法は、機能するか、リンク以外の要素を使用する可能性があります。
kontur 2011

1
これのもう1つの利点は、Bootstrap .btnによってボタンとリンクがまったく同じに見えることです。
Ciro Santilli冠状病毒审查六四事件法轮功

ユーザーの観点から、buttonURLに#を導入したり、ahrefをjavascript :;として表示したりしません。
Coll

39

JavaScriptを使用してリンクを書き出していない限り(ブラウザーで有効になっていることがわかるように)、JavaScriptを無効にして閲覧しているユーザーに適切なリンクを提供し、onclickでリンクのデフォルトのアクションを防止するのが理想的です。イベントハンドラ。このように、JavaScriptが有効になっているものは関数を実行し、JavaScriptが無効になっているものはリンクをクリックするだけで何も起こらずに適切なページ(または同じページ内の場所)にジャンプします。


36

#JavaScriptでは疑似スキームであるため、ハッシュ()は間違いなく優れています。

  1. 汚染の歴史
  2. エンジンの新しいコピーをインスタンス化します
  3. グローバルスコープで実行され、イベントシステムを尊重しません。

もちろん、デフォルトのアクションを防止するonclickハンドラーを備えた「#」は[はるかに]優れています。さらに、JavaScriptの実行のみを目的とするリンクは、問題が発生したときにユーザーをページの適切なアンカー(#が先頭に送信される)に送信しない限り、実際には「リンク」ではありません。スタイルシートを使用してリンクのルックアンドフィールをシミュレートするだけで、hrefをまったく忘れることができます。

さらに、Cowgodの提案、特にこれに関して:...href="javascript_required.html" onclick="...これは良いアプローチですが、「JavaScriptが無効になっている」シナリオと「onclickが失敗する」シナリオを区別していません。


1
@BerkerYüceer、なぜCWなの?
無料コンサルティング

30

私は通常行く

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

javascript:void(0)よりも短く、同じことを行います。


27

私は使うだろう:

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

理由:

  1. これにより、hrefシンプルな検索エンジンで必要になります。それ以外のもの(文字列など)を使用すると、404 not foundエラーが発生する可能性があります。
  2. リンクの上にマウスを置いても、それがスクリプトであることは表示されません。
  3. を使用するreturn false;と、ページが上部にジャンプしたり、backボタンが壊れたりすることはありません。

「1」に同意しません。スクリプトが許可されていないときにスクリプトリンクを配置すると、エラーが発生します。そのようなリンクはjsコードで追加されるべきです。そうすれば、スクリプトが許可されていない間、人々はこれらのリンクを回避でき、エラーはまったく表示されません。
BerkerYüceer

25

これを使用するとjavascript:void(0)、右クリックでコンテンツメニューが開かなくなる可能性があるため、私は使用を選択します。しかしjavascript:;、より短く、同じことを行います。


24

したがって、<a />タグを使用してJavaScriptの処理を行っているときに、次のように配置href="#"た場合は、イベントの最後にreturn falseを追加できます(インラインイベントバインディングの場合)

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

または、次のようにJavaScriptでhref属性を変更できます。

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

または

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

しかし、意味的には、これを達成するための上記の方法はすべて間違っています(ただし、正常に機能します)。ページをナビゲートするための要素が作成されておらず、それに関連付けられたJavaScriptの要素がある場合、それは<a>タグであってはなりません。

<button />すべての要素にイベントを追加することが許可されているため、代わりにa を使用して、必要に応じてbやspanなどの要素やその他の要素を必要に応じて実行できます。


したがって、を使用する利点が1つあります<a href="#">。すると、デフォルトでその要素にカーソルポインタが表示されますa href="#"。そのため、このようなCSSを使用して、cursor:pointer;この問題も解決できると思います。

そして最後に、あなたがJavaScriptコード自体からのイベントを結合している場合、あなたはそこに行うことができますevent.preventDefault()使用している場合は、これを達成するために<a>、タグを、しかし、あなたが使用していない場合は<a>、このためにタグを、あなたが優位性をそこに着く、あなたは「ドンこれを行う必要があります。

だから、もしあなたが見るなら、この種のもののためにタグを使わない方が良いです。


23

JavaScriptの実行のみを目的としてリンクを使用しないでください。

href = "#"を使用すると、ページが一番上にスクロールします。void(0)を使用すると、ブラウザ内でナビゲーションの問題が発生します。

代わりに、リンク以外の要素を使用します。

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

そしてそれをCSSでスタイルします:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}

13
スパンではなくボタンを使用してください。ボタンは当然そうマウス/トラックパッド/等することなくアクセスすることができ、フォーカス順に落ちる
カンタン

4
トンクエンティンのコメントを追加:現在書かれているように、キーボードのユーザーはspanフォーカスできない要素であるため、要素に到達しません。そのため、ボタンが必要です。
通徳2017

1
tabindex="0"スパンに追加することで、フォーカス可能にすることができます。とは言っても、ボタンを使用すると、目的の機能を無料で利用できるため、より優れています。スパンを使用してアクセスできるようにするには、クリックハンドラーをアタッチするだけでなく、スペースバーまたはEnterキーの押下を検索して、通常のクリックハンドラーを起動するキーボードイベントハンドラーをアタッチする必要があります。また、2番目のCSSセレクターを変更し.funcActuator:hover, .funcActuator:focusて、要素にフォーカスがあることを明確にすることもできます。
役に立たないコード

22

jQueryを使用する方が良いでしょう。

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

との両方を省略href="#"href="javascript:void(0)"ます。

アンカータグのマークアップは次のようになります

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

十分簡単です!


5
これが私が言おうとしていたことです。リンクに意味のある代替URLがある場合は、それを使用します。それ以外の場合は、hrefを省略するか、<a>より意味的に適切なものを使用します。誰もがhrefを含めて提唱している唯一の理由がホバーに指を置くことである場合、単純な「{カーソル:ポインター;}」がトリックを実行します。
Matt Kantor、

12
それはひどいアクセシビリティを与えます。SOで試してみてください。マウスを使用しないと投稿にフラグを付けることができません。「リンク」と「編集」リンクにはタブでアクセスできますが、「フラグ」にはアクセスできません。
ニコラス

6
このオプションに同意します。アンカーにJavaScript以外の目的がない場合は、hrefがあってはなりません。@Fatih:jQueryを使用すると、JavaScriptが無効になっている場合、リンクにはポインターがありません。
スコットリッピー

3
この方法を使用する場合は、jQueryを使用してクリックもバインドしてみませんか?jQueryの優れた点の1つは、JavaScriptをマークアップから分離できることです。
Muhd、2011

4
この回答が11票であるとは信じられません。それはひどいです。JavaScript(およびjQuery)を介してスタイルを追加し、HTMLでonclickアクションを定義するのはなぜですか?ひどい。
MMM 2014年

20

あなたが使用することが起こる場合はAngularJSを、次のように使用することができます。

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

何もしません。

加えて

  • (#)のように、ページの上部に移動しません
    • したがって、falseJavaScriptで明示的に返す必要はありません。
  • 簡潔です

6
しかし、これによりページがリロードされ、ページを変更するために常にJavaScriptを使用しているため、これは受け入れられません。
Henry Hu

@HenryHu再読み込みされなかった理由は、AngularJSが原因であることがわかりました。私の更新された答えを見てください。
whirlwin

19

hrefおそらくない場合は、アンカータグを使用する理由はありません。

ほぼすべての要素にイベント(クリック、ホバーなど)をアタッチできるので、単にa spanまたはdiv

また、JavaScriptが無効になっているユーザーの場合:代替がない場合(たとえば、代替href)、<a>ユーザーは、<span>タグやタグが何であれ、少なくともその要素を表示して操作することはできません。


19

通常、JavaScriptを無効にしたクライアントがまだいくつかの機能を備えていることを確認するために、常にフォールバックリンクが必要です。この概念は控えめなJavaScriptと呼ばれます。

例...次の検索リンクがあるとします。

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

いつでも次のことができます。

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

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

このようにして、JavaScriptが無効になってsearch.phpいるユーザーは、JavaScriptを使用しているビューアが拡張機能を表示している間、誘導されます。


17

個人的に組み合わせて使用​​しています。例えば:

HTML

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

jQueryを少し使って

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

または

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

しかし、ユーザーが空のアンカーをクリックしたときにページが最上部にジャンプするのを防ぐためだけにそれを使用しています。onClickなどのonイベントを直接HTMLで使用することはほとんどありません。

私の提案は、アンカーの代わりに属性を<span>持つ要素を使用することclassです。例えば:

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

次に.link、本体と</body>タグの直前にラップされたスクリプトまたは外部JavaScriptドキュメントを使用して、関数をに割り当てます。

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

*注意:動的に作成された要素の場合、以下を使用します:

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

また、動的に作成された要素で作成された動的に作成された要素の場合は、次を使用します。

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

次に、小さなCSSを使用して、span要素をアンカーのようにスタイル設定できます。

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

ここだjsFiddleの前述の上記の例。


16

達成したいことに応じて、onclickを忘れて、hrefを使用することができます。

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

falseを返す必要性を回避します。#前述のとおり、ユーザーがページの上部に移動するため、このオプションは好きではありません。JavaScriptが有効になっていない場合にユーザーを送信する別の場所がある場合(私が作業する場所ではめったにありませんが、非常に良いアイデアです)、Steveの提案する方法はうまく機能します。

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

最後に、javascript:void(0)誰にも行きたくない場合や、JavaScript関数を呼び出したくない場合に使用できます。マウスオーバーイベントを発生させたい画像がある場合にうまく機能しますが、ユーザーがクリックするものは何もありません。


3
これの唯一の欠点(メモリから、私は間違っているかもしれません)は、内部にhrefがない場合、IEがAをAであると見なさないことです。(したがって、CSSルールは機能しません)
Benjol 2008

16

私がいくつかの偽のリンクを持っているとき、私はそれらに「リンクなし」のクラスを与えることを好む。

次に、jQueryで次のコードを追加します。

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

そしてHTMLの場合、リンクは単純です

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

アンカーに使用しない限り、ハッシュタグを使用したくありません。上記の操作は、2つ以上の偽リンクがある場合にのみ行います。それ以外の場合は、javascript:void(0)を使用します。

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

通常、私はリンクをまったく使用せずに、何かをスパンで囲み、ポップアップやコンテンツ表示などのJavaScriptコードをアクティブにする方法として使用します。


16

私はあなたが誤った二分法を提示していると思います。これらは2つのオプションだけではありません。

アンカータグを使用しているのに、本当にアンカーがないのではないかと提案したD4V360氏に同意します。あなたが持っているのは、少し異なる動作をするはずのドキュメントの特別なセクションです。<span>タグは、はるかに適切です。


あなたが交換した場合にもaしてspan、あなたはそれがキーボードを介して、フォーカス可能にするために覚えておく必要があります。
AndFisher 2017年

16

私は開発者ツールを使用してgoogle chromeで両方を試したところ、id="#"0.32秒かかりました。一方でjavascript:void(0)この方法は、唯一の0.18秒かかりました。したがって、Google Chromeでは、javascript:void(0)より良く、より速く動作します。


実際、彼らは同じことをしません。#ページの先頭にジャンプします。
Jochen Schultz

13

基本的には、この実用的な記事からプログレッシブエンハンスメントを使用して言い換えています。短い答えは、あなたが使用しないということですjavascript:void(0);か、#あなたのユーザ・インタフェースは既にJavaScriptは、有効になっていると推察している場合を除き、その場合には、あなたが使用する必要がありますjavascript:void(0);。また、スパンをリンクとして使用しないでください。これは、最初は意味的にfalseであるためです。

/ Home / Action / ParametersなどのアプリケーションでSEO対応の URLルートを使用することもお勧めします。最初にJavaScriptなしで機能するページへのリンクがあれば、後でエクスペリエンスを向上させることができます。作業中のページへの実際のリンクを使用し、onlickイベントを追加してプレゼンテーションを強化します。

こちらがサンプルです。Home / ChangePictureは、ユーザーインターフェイスと標準のHTML送信ボタンを備えたページ上のフォームへのリンクですが、jQueryUIボタンを備えたモーダルダイアログに挿入すると見栄えがよくなります。どちらの方法でも、ブラウザーに応じて機能し、モバイルの最初の開発を満たします。

<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に関しては、私はこの方法を好みます。使いやすいURLをいくつでも使用すると、ページの価値が確実に向上します。
チェタバハナ2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.