「javascript:void(0)」とはどういう意味ですか?


1379
<a href="javascript:void(0)" id="loginlink">login</a>

私はそのようなhrefsを何度も見ましたが、それが何を意味するのか正確にはわかりません。


12
javascript:は、多くのURIスキームの1つです:en.wikipedia.org/wiki/URI_schemeなどdata:
Ciro Santilli冠状病毒审查六四事件法轮功

3
href="javascript:"同じ目的で使用できます。以下のための答えで述べたように、この質問void(0)一部はもともとブラウザの初期バージョンのために意図されたjavascript:URIの扱いが異なっていました。しかし、今では速記が機能しないバージョンを見つけることさえできませんでした。少なくともIE7はこれを正しく処理します。
ユーザー

1
href = "javascript://"も見たことがありますが、これで良いですか?
ライトセーバー2016

href = "javascript://"が機能しないvoid(0)は完全に機能します。
Sandip 2017年

回答:


1041

voidオペレータは、与えられた式と、その後リターンを評価しますundefined

voidオペレータはしばしば得るために単に使用されるundefined「通常用い、プリミティブ値をvoid(0)」(に相当します「void 0」)。このような場合は、undefined 代わりにグローバル変数を使用できます(デフォルト以外の値に割り当てられていない場合)。

説明は次のとおりです:void演算子

hrefリンクを使用してこれを実行する理由は、通常、javascript:URLはブラウザをそのJavaScriptの評価結果のプレーンテキストバージョンにリダイレクトするためです。ただし、結果がの場合、undefinedブラウザは同じページにとどまります。void(0)は、に評価される短くて単純なスクリプトですundefined


9
hrefに「未定義のプリミティブ値」が指定されている場合、それはどういう意味ですか?
omg

7
「通常、javascript:urlは、ブラウザーをそのjavascriptの評価結果のプレーンテキストバージョンにリダイレクトします。」ここで例を挙げられますか?
omg

87
フェニックスが話していることの例は、<a href="javascript: dosomething();">今すぐやってみましょう!</a>。dosomethingがfalseを返す場合、リンクをクリックすると、ブラウザがページを終了し、「false」が表示されます。ただし... <a href="javascript: dosomething(); void(0)">今すぐ実行してください!</a>は問題を回避します。JavaScriptを貼り付けてください:1 + 1; あなたのブラウザのアドレスバーに。ブラウザに「2」が表示されるはずです
ブルトン語

9
なぜならvoidは単項演算子だからです。Voidは値ではなく、関数でもありません。右側を操作するには値が必要です。そうでない場合、エラーがスローされます。
ブルトン語

14
エラーコンソールを見てみますか?明確に構文エラーをスローします。これは無効なJavaScriptです。単項演算子/関数/値の混乱は対処するにはコストがかかりすぎるため、Douglas crockfordは無効から離れることを推奨しています。
ブルトン語

436

技術的な答えに加えて、javascript:void作者が間違っていることを意味します。

使用する正当な理由はありません javascript:疑似URL(*)。実際には、「ブックマークリンク」や「新しいタブでリンクを開く」などの操作をしようとすると、混乱やエラーが発生します。これは、多くの場合、新しいタブのミドルクリックに慣れてきました。リンクのように見えます。新しいタブで読みたいのですが、実際のリンクではないことがわかります。中ボタンをクリックすると、空白ページやJSエラーなどの望ましくない結果が表示されます。

<a href="#">間違いなくそれほど悪いかもしれない一般的な代替手段です。しかし、あなたはに覚えておく必要がありますreturn falseあなたからのonclick続き、ページの一番上までスクロールされているリンクを防止するためのイベントハンドラ。

場合によっては、リンクを指すのに実際に役立つ場所があるかもしれません。たとえば、クリックして以前に非表示<div id="foo">にしたコントロールを開くことができるコントロールがある場合、それに<a href="#foo">リンクするために使用することには意味があります。または、同じことをJavaScript以外の方法で行う場合(たとえば、fooを最初に見えるように設定する 'thispage.php?show = foo')、それにリンクできます。

それ以外の場合、リンクが特定のスクリプトのみを指す場合、それは実際にはリンクではなく、そのようにマークアップされるべきではありません。通常のアプローチは、追加することですonclick<span><div>または<a>なしでhref、それはあなたがそれをクリックすることができます明確にする何らかの方法でとスタイルに。これはStackOverflowが書いている時点での内容です。今ではhref="#"]を使用しています。

これの欠点は、span / div / bare-aにタブで移動したり、スペースでアクティブにしたりできないため、キーボードコントロールを失うことです。これが実際にデメリットであるかどうかは、要素がどのようなアクションを実行することを意図しているかによって異なります。少し努力しtabIndexて、要素にを追加し、スペースキーの押下をリッスンして、キーボードの操作性を模倣することができます。ただし、実際のブラウザの動作を100%再現することは決してできません。それは、ブラウザによってキーボードへの応答が異なるためです(非ビジュアルブラウザは言うまでもありません)。

リンクではないが、マウスまたはキーボードで通常どおりアクティブ化できる要素が本当に必要な場合は、必要なのは<button type="button">(または<input type="button">単純なテキストコンテンツの場合はそれと同じように)です。必要に応じて、CSSを使用してスタイルを変更し、ボタンではなくリンクのようにすることができます。しかし、ボタンのように動作するため、それを実際にマークアップする必要があります。

(*:いずれにしても、サイトのオーサリングで使用します。明らかにブックマークレットに役立ちます。javascript:疑似URLは概念的な奇妙さです。場所を指し示すのではなく、現在の場所内のアクティブなコードを呼び出すロケーターです。これらは大規模なセキュリティを引き起こしています。ブラウザとウェブアプリの両方に問題があり、Netscapeによって発明されるべきではありませんでした。)


7
@bobinceによる優れた投稿に加えて、私は2〜3か月前にhref、癖や副作用を含むsのクロスブラウザーキーボードのナビゲーション性についていくつかの調査を行いました。一部の人はそれが便利だと思うかもしれません:jakub-g.github.com/accessibility/onclick
jakub.g

2
@ThinkBonobo:SOは2009年以降のある時点で変更されました!更新しました。
ボビンス2014年

59
これは意見であり、質問には答えません。void(0)多くの場合に必要です。「#」は、多くの問題をもたらすハックです(私が書いているアプリでは機能しないため、このページに移動しました)。
felwithe 2015年

12
@feltwitheに同意します。なぜ他人に「それを特定の方法でやる」ことを強いるのですか?私はモットーは「それは常にこの方法を行うべきである」方法を確認するために、まだ午前プログラミングの15年間でいない自分の意思の混乱にリードの人々
スティーブン・デ・サラス

4
UXの観点からは、fragment-idを使用することはお勧めできませんpreventDefault。使用しない限り、ドキュメントがページの先頭にジャンプするためです。アンカーをフォームのボタンとして使用する場合は、行わないでください。
Josh Habdas 2017年

124

それは何もしないことを意味します。これは、リンクをどこにも「ナビゲート」しないようにする試みです。しかし、それは正しい方法ではありません。

次のようreturn falseに、実際にはonclickイベントに参加するだけです。

<a href="#" onclick="return false;">hello</a>

通常、リンクが「JavaScript-y」を実行している場合に使用されます。AJAXフォームの投稿や、画像の交換などです。その場合は、呼び出されている関数をreturnにするだけfalseです。

ただし、ウェブサイトを完全にすばらしいものにするために、閲覧者がJavaScriptを実行しないことを選択した場合は、通常、同じアクションを実行するリンクを含めます。

<a href="backup_page_displaying_image.aspx"
   onclick="return coolImageDisplayFunction();">hello</a>

33
no no-falseを返すとデフォルトの動作が停止するため、#は表示されません
Magnar

22
javascript:urlプロトコルは事実上の標準であり、実際の標準ではありません。したがって、href = "#" onclick = "return false;" は標準に準拠していますが、href = "javascript:void(0)"は準拠していません。何をすべきかを指定する公式の標準がないためです。
ブルトン語

10
その上、Douglas Crockfordはvoidが嫌いなので、jslintはそれについて不満を言うでしょう。基本的に、voidは演算子であり、値ではないため、地獄と混同し、このような多くの質問を引き起こします。完全に回避する方が良いでしょう。はは。
ブルトン語

4
Brandon:brentonの応答を参照してください。私がお勧めする方法は最もサポートされており、投稿の2番目の部分で述べたように、「適切な」サイトでは「#」を使用することはありません。 javascript。
正午シルク

19
完全に素晴らしい例を含めるための+1 。JavaScriptで行っていることに対して静的なHTMLフォールバックがない場合でも、いつでものようなことができます<a href="enableJavaScriptToSeeMyCompletelyAwesomeSite.html" onclick="completelyAwesome();return false;">
Grant Wagner、

73

「#」とjavascript:voidの動作には大きな違いがあります

「#」はページのトップにスクロールし、「javascript:void(0);」は ではない。

動的ページをコーディングする場合、これは非常に重要です。ユーザーがページのリンクをクリックしたからといって、トップに戻ることを望まない。


26
@Salvin:ページ上部へスクロール動作はfalse、イベントハンドラに戻ることによって抑制できます。onclick="doSomething();return false;"または、doSomething()戻るfalse場合はを使用できますonclick="return doSomething();"
グラントワグナー

41
5年後または、 - @GrantWagner e.preventDefault()
トリシス2014

1
"#"はfalseを返しても上部にスクロールしないので、この回答を編集または削除することができます。
Navin、2015年

4
@Navinあなたは正しいですが、それは今では時代遅れの習慣です。トリシスによるコメントは現在正しい方法と考えられています。
Tim Seguine、2015年

66

これは、JavaScript関数をHTMLリンクに追加する非常に一般的な方法です。
たとえば[Print]、多くのWebページに表示されるリンクは次のように記述されています。

<a href="javascript:void(0)" onclick="callPrintFunction()">Print</a>

なぜ私たちが必要なのでしょhrefながらonclick一人で仕事を得ることができますか?ユーザーががないときに「印刷」というテキストにhrefカーソルを合わせると、カーソルがポインター(👆)ではなくキャレット(ꕯ)に変わるためです。唯一の持つhrefaのタグは、ハイパーリンクとしてそれを検証します。

の代わりにhref="javascript:void(0);"、を使用しhref="#"ます。この代替手段では、ユーザーのブラウザーでJavaScriptをオンにする必要がないため、互換性が高くなります。


7
JavaScriptがオフになっている場合も、どちらも役に立ちません。
Jasen

12
hrefポインティングハンドカーソルを取得する必要はありません。必要なのは、少しのCSSだけです。
John Montgomery

1
JavaScript関数をonclickではなくhrefに配置しないのはなぜですか?
シッダールタガンジー

2
私は@Sidに同意します-JavaScript関数をトリガーするためにそれを使用している場合<a href="javascript:callPrintFunction()">はよりクリーンです(実際にどこにも行かない場合buttonは、aアンカーではなくおそらくアンカーであるはずです)。
DaveMongoose、

href="#"厄介な驚きにつながる可能性があります-中止されたxhrリクエストのように、そのリンクへのクリックで呼び出されることがあります。最近、ユーザーがたまたまサイトのルートではないアドレスにいる場合、要求されたoidcログインを中止するWebサイトのデバッグに苦労しました。#xhrリクエストが完了する前に、hrefによりアドレスがリロードされました。
JustAMartin

44

aタグには常にhrefが必要です。「未定義」を返すJavaScript関数を呼び出しても問題ありません。したがって、「#」にリンクします。

hrefのないInternet Explorer 6のアンカータグには、a:hoverスタイルが適用されません。

はい、それはひどい人類に対する軽微な犯罪ですが、Internet Explorer 6も同様です。

これがお役に立てば幸いです。

Internet Explorer 6は実際には人道に対する重大な犯罪です。


25

必要な文字数が少ないという理由だけで、未定義をチェックするときにvoid 0が表示されることがあります。

例えば:

something === undefined

something === void 0

このため、一部の縮小化メソッドはundefinedをvoid 0に置き換えます。


10
注目すべき例の1つは、TypeScript(ライブサンプル)です。これは、デフォルトのパラメーター値をコンパイルしてチェックしvoid 0ます。多くのメソッドがデフォルトのparam値を使用している場合、3文字の違いはすぐに加算されます。
John Weisz 2017年

1
「このため、一部の縮小化メソッドはundefinedをvoid 0に置き換えます。」やっと理解できた!完全な回答をありがとう@squall。
Ahmed Mahmoud

22

の使用はjavascript:void(0)、HTMLの作成者がボタン要素の代わりにアンカー要素を誤用していることを意味します。

アンカータグは、ページが更新されないようにhrefを "#"または "javascript:void(0)"に設定して疑似ボタンを作成するonclickイベントで悪用されることがよくあります。これらの値は、リンクのコピー/ドラッグ、新しいタブ/ウィンドウでリンクを開く、ブックマークする、JavaScriptがまだダウンロードされている、エラーが発生している、または無効になっている場合に、予期しない動作を引き起こします。これはまた、誤ったセマンティクスを支援技術(スクリーンリーダーなど)に伝えます。このような場合は、<button>代わりにを使用することをお勧めします。一般に、適切なURLを使用するナビゲーションにはアンカーのみを使用する必要があります。

出典:MDNの<a>ページ


4
古い質問でセマンティックhtmlを呼び出すための+1 ...リンクは場所に移動し、ボタンは機能します。ボタンのように見せたくない場合は、スタイルをクリアするだけです。
kevlarr 2017年

これに対する大きな例外は、JavaScriptを実行する必要がある画像マップです。ボタンではないため、多角形の境界を持つリンクなので、これが「唯一の」方法です。

17

voidundefinedブラウザが新しいページをロードできないように値を返すために使用される演算子です。

Webブラウザーは、nullを返すJavaScript関数でない限り、URLとして使用されているものをすべて取得してロードします。たとえば、次のようなリンクをクリックしたとします。

<a href="javascript: alert('Hello World')">Click Me</a>

その後、新しいページを読み込まずに警告メッセージが表示されます。これは、 alertます。これは、がnull値を返す関数だです。つまり、ブラウザが新しいページを読み込もうとすると、nullと表示され、何も読み込まれません。

void演算子について注意すべき重要な点は、値を必要とし、それ自体では使用できないことです。次のように使用する必要があります。

<a href="javascript: void(0)">I am a useless link</a>

1
私は人々がvoidではなくjavascript:nullを使用するのを見てきました...しかし、それは問題です。Chrome nullは機能し、Firefoxではページnullをロードしようとします。更新してくれてうれしい。興味深いバグ。
Gavin Pickin

私はjavascript:nullのようなコードベースで他のいくつかの使用法を見つけましたが、未定義のjavascript:null()を使用しているため、機能します。
Gavin Pickin

1
つまり、基本的にはjqueryのprevendDefaultのようなもので、falseを返しますか?
Robert Rocha

16

この概念を理解するには、まずJavaScriptのvoid演算子を理解する必要があります。

void演算子の構文は次のとおりです。 void «expr»これはexprを評価し、未定義を返します。

関数としてvoidを実装すると、次のようになります。

function myVoid(expr) {
    return undefined;
}

このvoid演算子には、式の結果を破棄するという重要な使用法があります。

状況によっては、式の結果ではなく、未定義を返すことが重要です。その後、その結果を破棄するためにvoidを使用できます。そのような状況の1つにjavascript:URLが含まれます。URLはリンクでは回避する必要がありますが、ブックマークレットでは役立ちます。これらのURLの1つにアクセスすると、多くのブラウザは、現在のドキュメントをURLの「コンテンツ」を評価した結果に置き換えますが、結果が未定義でない場合のみです。したがって、現在表示されているコンテンツを変更せずに新しいウィンドウを開く場合は、次の操作を実行できます。

javascript:void window.open("http://example.com/")

2
「void」の引数の目的を明確にしていただきありがとうございます。他の答えでははっきりしていませんでした。「voidは引数を取る」だけです。
dbeachy1 2017

良い答えが、1つの詳細は、空の実装は次のようになります: function myVoid(expr) { expr(); return undefined; } あなたが追加し忘れてしまった )(式exprを。
Juanma Menendez、

1
@Juanma Menendez:真実ではない。exprmyVoid()呼び出されたときに既に評価されています(その式の結果はパラメーターとして渡されます)
Udo G

@UdoG私は好奇心旺盛です、どうやってその男性を知っていますか?説明してもらえますか
Juanma Menendez、

@JuanmaMenendez:関数パラメーターのは、関数自体を呼び出す前に常に評価されます。申し訳ありませんが、明確なドキュメントはありませんが、自分で試してください。function() { alert("foo"); }は有効なです。void(function() { alert("foo"); })は戻り、警告を表示undefinedしませが、警告を表示myVoid(function() { alert("foo"); })します(ご使用のバージョンでは、Gopal Yadavのものではありません)。
Udo G

14

voidオペレータは、与えられた式を評価した後、undefinedを返し。ページの更新を回避します。


9

タグのjavascript:void(0)デフォルトの動作を防ぐ最も簡単な方法であるため、Web開発者が使用しますavoid(*anything*)戻りundefined、それは偽の値です。そして、falsy値を返すことのようであるreturn falseonclickのイベントaのデフォルトの動作を妨げるタグ。

したがってjavascript:void(0)aタグのデフォルトの動作を防ぐ最も簡単な方法だと思います。


8

リンクを使用可能な表示オブジェクトにするには、リンクにHREFターゲットを指定する必要があります。

ほとんどのブラウザは、高度なJavaScriptを

<A HREF="" 

次のようなタグ:

<A href="JavaScript:var elem = document.getElementById('foo');" 

ほとんどのブラウザのHREFタグは空白を許可しないか、空白を%20に変換するため、JavaScriptはインタプリタにとってまったく役に立たない、SPACEに相当するHEXです。

そのため、A HREFタグを使用してインラインJavaScriptを実行する場合は、複雑すぎない(空白文字を含まない)HREF FIRSTの有効な値を指定し、OnClickのようなイベント属性タグにJavaScriptを提供する必要があります。 、OnMouseOver、OnMouseOutなど

典型的な答えは次のようなことをすることです:

<A HREF="#" onclick="var elem = document.getElementById('foo');">Get the object</a>

これは正常に動作しますが、ポンド記号/ハッシュタグがそのように指示しているため、ページが先頭にジャンプします。

A HREFタグでシャープ記号/ハッシュタグを指定するだけで、実際にはルートアンカーが指定されます。これは常にデフォルトでページの上部にあり、A HREFタグ内でNAME属性を指定することで別の場所を指定できます。

<A NAME='middleofpage'></A>

次に、A HREFタグを変更して「middleofpage」にジャンプし、OnClickイベントでJavaScriptを実行します。

<A HREF="#middleofpage" onclick="var elem = document.getElementById('foo');">Get the object</a>

そのリンクをジャンプさせたくない場合が多いので、次の2つのことを行うことができます。

<A HREF="#thislinkname" name='thislinkname' onclick="var elem = document.getElementById('foo');">Get the object</a>

クリックしてもどこにも表示されなくなりますが、ページが現在のビューポートから自分自身の中心に戻る可能性があります。これはきれいではありません。A HREFを使用してインラインJavaScriptを提供する最良の方法は何ですか?ただし、上記のいずれも行う必要はありませんか?JavaScript:void(0);

<A HREF="JavaScript:void(0);" onclick="var elem = document.getElementById('foo');">Get the object</a>

これはブラウザにNOWHEREに移動するよう指示しますが、代わりに有効なJavaScript:void(0);を実行します。空白が含まれておらず、URLとして解析されないため、HREFタグの最初の関数。代わりに、コンパイラーによって実行されます。VOIDは、0のパラメーターを指定するとUNDEFINEDを返すキーワードです。これは、0を指定せずに発生する戻り値を処理するためにこれ以上のリソースを使用しません(メモリ管理/パフォーマンスが向上します)。

次に発生するのは、OnClickが実行されることです。ページは移動しません。表示に関しては何も起こりません。


このようなアンカーを処理できるさまざまな方法をすべて説明するための+1 。ただし、<a>要素は常にどこかに移動する必要があると私は考えています。ページ上でJavaScriptを実行するだけの場合は、<button>代わりにを使用する必要があります。使用すること<button>はどちらもよりセマンティックであり、アンカーのにハッキングするものについてのこの全体的な議論からあなたを解放しますhref編集:@Ronnie Roystonの以下の答えはすでにこの議論をカバーしているようです。
Rabadash8820

1

JavaScript:URLは別として。これは、voidが短いコードを書くのに役立つ場所です。

var error1 = false,
    error2 = false,
    error3 = false;

function error1() {

  error1 = true;
}

function myFunction() {

  // You can easily return and call a function at once, if you don't care about myFunction's return value
  if (!someCondition1)
    return error1();

  // What if you want to set a value first?
  if (!someCondition2) {
    error2 = true;
    return
  }

  // Shortest way to return and set a value at once
  if (!someCondition3)
    return void(error3 = true);

  // More code goes here
}

反対票を投じた人が少なくとも反対票を投じた理由を少なくとも教えてくれるといいですね。質問のトピックではないことは知っていますが、検索結果からここに来るすべての人々について考えています。
Maciej Krawczyk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.