クリックイベントリスナーに「return false」を追加するとどのような影響がありますか?


359

HTMLページで次のようなリンクを何度も目にしました。

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

return falseそこの効果は何ですか?

また、ボタンには通常は表示されません。

これはどこに指定されていますか?w3.orgの一部の仕様では?


5
そして、レオネルの例の実際的な問題は、現在のページが何らかの方法で下にスクロールされると、falseを返さずに先頭にジャンプすることです。
2008

IntelliJは「return false」について文句を言います。「外部関数定義」メッセージを含む
ses

回答:


310

イベントハンドラの戻り値は、デフォルトのブラウザ動作も実行するかどうかを決定します。リンクをクリックした場合、これはリンクをたどりますが、違いはフォーム送信ハンドラーで最も顕著で、ユーザーが情報の入力を誤った場合にフォーム送信をキャンセルできます。

これにはW3C仕様があるとは思わない。このような古代のJavaScriptインターフェースにはすべて「DOM 0」というニックネームが付けられており、ほとんどが未指定です。Netscape 2の古いドキュメントを読んでいると幸運かもしれません。

この効果を実現する最新の方法はを呼び出すことevent.preventDefault()であり、これはDOM 2 Events仕様で指定されています


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;IEでも動作します

3
Chromeを除くすべてのブラウザがこのreturn false方法で機能しましたがevent.preventDefault、Chrome が必要でした。
DOOManiac 2013年

3
Chromeはreturn false現在この方法で動作します。img要素のonclickイベントのリンクの追跡を停止します。
Bao

プレーンなJSフォームでは、(少なくともChromeでは)falseを返す送信ハンドラが機能しないため、e.preventDefault()を使用します。上記の@ 2astalavistaのコメントによると、e.preventDefaultはIEで失敗するため、彼のメソッドを使用します:event.preventDefault?event.preventDefault():event.returnValue = false;
luigi7up 2014年

162

次の例で違いを確認できます。

<a href="http://www.google.co.uk/" onclick="return (confirm('Follow this link?'))">Google</a>

「OK」をクリックするとtrueが返され、リンク先に移動します。[キャンセル]をクリックするとfalseが返され、リンクをたどりません。JavaScriptが無効になっている場合、リンクは通常どおりにたどられます。


7
まさに私が探していたもので、送信ボタンにも最適です!<button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
ArendE 2013年

27

すべてのブラウザでデフォルトの動作とイベントのバブリングをキャンセルする、より堅牢なルーチンを次に示します。

// Prevents event bubble up or any usage after this is called.
eventCancel = function (e)
{
    if (!e)
        if (window.event) e = window.event;
    else return;
    if (e.cancelBubble != null) e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    if (e.preventDefault) e.preventDefault();
    if (window.event) e.returnValue = false;
    if (e.cancel != null) e.cancel = true;
}

イベントハンドラーでこれを使用する方法の例:

// Handles the click event for each tab
Tabstrip.tabstripLinkElement_click = function (evt, context) 
{
    // Find the tabStrip element (we know it's the parent element of this link)
    var tabstripElement = this.parentNode;
    Tabstrip.showTabByLink(tabstripElement, this);
    return eventCancel(evt);
}

シムはいいですが、実用的な利点は何return false;ですか?kameshの答えはこれを少し扱っ​​ていますが、shimがどちらかを行う可能性があるので、それらの個別の結果tabstripLinkElement_clickがブラウザ間で変更操作をどのように行うのでしょうか?運用上の違いがない場合、なぜ(実際には)面倒なのですか(理論的には、これが正しいことであるとしても)。ありがとう、そしてゾンビ回答の質問をしてくれたAIA。
ruffin

7
最初のコードブロックには末尾がありelseます。恐ろしいコーディングスタイル。曖昧にならないように、中括弧を追加します。
mbomb007 2017

23

WHAT 「リターン偽」 REALLYしているのですか?

falseを返すと、実際には次の3つの非常に別々の処理が行われます。

  1. event.preventDefault();
  2. event.stopPropagation();
  3. コールバックの実行を停止し、呼び出されるとすぐに戻ります。

詳細については、jquery-events-stop-misusing-return-falseを参照してください。

例えば ​​:

このリンクをクリックしているときにfalseを返すと、ブラウザのデフォルトの動作キャンセルされます

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

7
onclick = "return false"は、jQueryクリックイベントハンドラーからfalseを返すことと同じではありません。ブラウザは、デフォルトハンドラ(などe.preventDefault())を防止するだけで、伝播を停止しません。参照:jsfiddle.net/18yq1783
Jamie Treworgy 14

1
Fwiw、ブログへのリンクが壊れています。アーカイブはこちらです
ruffin

16

JavaScriptイベントからfalseに戻すと、通常は「デフォルト」の動作がキャンセルされます-リンクの場合、リンクをたどらないようにブラウザに指示します。


5
"通常"?そう常にではないですか?
マリアイネスパルニサリ2015

12

標準のイベントが発生しないと思います。

あなたの例では、ブラウザは#に移動しようとしません。


12

falseを返すと、JavaScriptが実行された後にハイパーリンクがたどられなくなります。これは、控えめに低下する控えめなJavaScriptに役立ちます。たとえば、JavaScriptを使用してフルサイズの画像のポップアップを開くサムネイル画像を作成できます。JavaScriptがオフになっている場合、または画像が中クリックされた場合(新しいタブで開かれている場合)は、onClickイベントを無視し、通常どおりフルサイズの画像として画像を開きます。

falseが指定されていない場合、画像はポップアップを起動し、通常どおり画像を開きます。一部の人々はreturn falseを使用する代わりにjavascriptをhref属性として使用しますが、これはjavascriptが無効になっている場合、リンクが何もしないことを意味します。


7

onclickイベントでreturn falseを使用すると、ブラウザーは残りの実行スタックの処理を停止します。これには、href属性のリンクの追跡が含まれます。

つまり、return falseを追加すると、hrefが機能しなくなります。あなたの例では、これはまさにあなたが望むものです。

ボタンでは、onclickだけで実行できるため、必要ありません。処理して移動するhrefはありません。


6

falseが返されるのは、デフォルトのアクションを実行しないことです。これは<a href>、リンクをたどる場合です。onclickにfalseを返すと、hrefは無視されます。



3

falseを返すと、ナビゲーションが妨げられます。それ以外の場合、場所はsomeFuncの戻り値になります


いいえ、場所はhref属性のコンテンツになります
Chris Marasti-Georg

場所は、href = "javascript:someFunc()"の場合にのみsomeFuncの戻り値になります。これは、イベントハンドラーには当てはまりません。
ジム、

3

これreturn falseにより、ページがナビゲートされたり、ウィンドウが上または下にスクロールされたりするのを防ぎます。

onclick="return false"

3

onmousedown代わりに誰も言及しなかったことに驚いていonclickます。の

onclick='return false'

ブラウザのデフォルトの動作をキャッチしないため、テキストの選択が(ときどき望ましくない)発生するmousedownが、

onmousedown='return false'

します。

つまり、ボタンをクリックすると、テキストが誤って選択されてボタンの外観が変わってしまい、望ましくない場合があります。これが、ここで防止しようとしているデフォルトの動作です。ただし、mousedownイベントはの前clickに登録されるため、clickハンドラー内でその動作を防止するだけで、mousedownイベントから発生する不要な選択に影響を与えることはありません。したがって、テキストはまだ選択されています。ただし、mousedownイベントのデフォルトを防止することで問題が解決します。

event.preventDefault()とfalseを返すも参照してください。


@FrederikKrautwaldその通りです、それは謎めいたものであり、私は「マーキング」ではなく「選択」と言ったはずです。私はそれをより明確に書こうとしました、それがもっと理にかなっているといいのですが。
Dmitri Zaitsev 2016

0

私のHTMLページにこのリンクがあります。

<a href = "" 
onclick = "setBodyHtml ('new content'); return false; "
> click here </a>

関数setBodyHtml()は次のように定義されます:

function setBodyHtml (s)
{ document.body.innerHTML = s;
}

リンクをクリックするとリンクが消え、ブラウザに表示されるテキストが「新しいコンテンツ」に変わります。

しかし、リンクから "false"を削除した場合、リンクをクリックしても(一見)何も起こりません。何故ですか?

これは、falseを返さないと、リンクをクリックしてターゲットページを表示するというデフォルトの動作が発生し、キャンセルされないためです。しかし、ここではハイパーリンクのhrefは ""なので、同じ現在のページにリンクしています。したがって、ページは事実上更新されただけで、一見何も起こりません。

バックグラウンドで、関数setBodyHtml()は引き続き実行されます。引数をbody.innerHTMLに割り当てます。しかし、ページはすぐに更新/再読み込みされるため、変更された本文コンテンツはおそらく数ミリ秒以上表示されないため、表示されません。

この例は、「return false」を使用することが時々有用である理由を示しています。

リンクにSOME hrefを割り当てて、下線付きのテキストとしてリンクとして表示したいのですが。しかし、リンクをクリックしてページをリロードするだけでは効果的ではありません。そのデフォルトのnavigation = behaviorをキャンセルして、関数を呼び出して有効にしたままにしておくと、副次的な影響が発生することを望みます。したがって、「偽を返す」必要があります。

上記の例は、開発中にすぐに試すものです。本番環境では、JavaScriptでクリックハンドラーを割り当て、代わりにpreventDefault()を呼び出す可能性が高くなります。しかし、簡単に試してみるには、上記の「falseを返す」のがうまくいきます。


0

フォームを使用する場合、「return false」を使用して送信を防ぐことができます。

function checkForm() {
    // return true to submit, return false to prevent submitting
}
<form onsubmit="return checkForm()">
    ...
</form>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.