HTMLページで次のようなリンクを何度も目にしました。
<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>
return false
そこの効果は何ですか?
また、ボタンには通常は表示されません。
これはどこに指定されていますか?w3.orgの一部の仕様では?
HTMLページで次のようなリンクを何度も目にしました。
<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>
return false
そこの効果は何ですか?
また、ボタンには通常は表示されません。
これはどこに指定されていますか?w3.orgの一部の仕様では?
回答:
イベントハンドラの戻り値は、デフォルトのブラウザ動作も実行するかどうかを決定します。リンクをクリックした場合、これはリンクをたどりますが、違いはフォーム送信ハンドラーで最も顕著で、ユーザーが情報の入力を誤った場合にフォーム送信をキャンセルできます。
これにはW3C仕様があるとは思わない。このような古代のJavaScriptインターフェースにはすべて「DOM 0」というニックネームが付けられており、ほとんどが未指定です。Netscape 2の古いドキュメントを読んでいると幸運かもしれません。
この効果を実現する最新の方法はを呼び出すことevent.preventDefault()
であり、これはDOM 2 Events仕様で指定されています。
return false
方法で機能しましたがevent.preventDefault
、Chrome が必要でした。
return false
現在この方法で動作します。img要素のonclickイベントのリンクの追跡を停止します。
次の例で違いを確認できます。
<a href="http://www.google.co.uk/" onclick="return (confirm('Follow this link?'))">Google</a>
「OK」をクリックするとtrueが返され、リンク先に移動します。[キャンセル]をクリックするとfalseが返され、リンクをたどりません。JavaScriptが無効になっている場合、リンクは通常どおりにたどられます。
<button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
すべてのブラウザでデフォルトの動作とイベントのバブリングをキャンセルする、より堅牢なルーチンを次に示します。
// 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);
}
else
ます。恐ろしいコーディングスタイル。曖昧にならないように、中括弧を追加します。
falseを返すと、実際には次の3つの非常に別々の処理が行われます。
詳細については、jquery-events-stop-misusing-return-falseを参照してください。
例えば :
このリンクをクリックしているときにfalseを返すと、ブラウザのデフォルトの動作がキャンセルされます。
<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>
e.preventDefault()
)を防止するだけで、伝播を停止しません。参照:jsfiddle.net/18yq1783
JavaScriptイベントからfalseに戻すと、通常は「デフォルト」の動作がキャンセルされます-リンクの場合、リンクをたどらないようにブラウザに指示します。
falseを返すと、JavaScriptが実行された後にハイパーリンクがたどられなくなります。これは、控えめに低下する控えめなJavaScriptに役立ちます。たとえば、JavaScriptを使用してフルサイズの画像のポップアップを開くサムネイル画像を作成できます。JavaScriptがオフになっている場合、または画像が中クリックされた場合(新しいタブで開かれている場合)は、onClickイベントを無視し、通常どおりフルサイズの画像として画像を開きます。
falseが指定されていない場合、画像はポップアップを起動し、通常どおり画像を開きます。一部の人々はreturn falseを使用する代わりにjavascriptをhref属性として使用しますが、これはjavascriptが無効になっている場合、リンクが何もしないことを意味します。
falseが返されるのは、デフォルトのアクションを実行しないことです。これは<a href>
、リンクをたどる場合です。onclickにfalseを返すと、hrefは無視されます。
falseを返すと、ナビゲーションが妨げられます。それ以外の場合、場所はsomeFuncの戻り値になります
のonmousedown
代わりに誰も言及しなかったことに驚いていonclick
ます。の
onclick='return false'
ブラウザのデフォルトの動作をキャッチしないため、テキストの選択が(ときどき望ましくない)発生するmousedown
が、
onmousedown='return false'
します。
つまり、ボタンをクリックすると、テキストが誤って選択されてボタンの外観が変わってしまい、望ましくない場合があります。これが、ここで防止しようとしているデフォルトの動作です。ただし、mousedown
イベントはの前click
に登録されるため、click
ハンドラー内でその動作を防止するだけで、mousedown
イベントから発生する不要な選択に影響を与えることはありません。したがって、テキストはまだ選択されています。ただし、mousedown
イベントのデフォルトを防止することで問題が解決します。
event.preventDefault()とfalseを返すも参照してください。
私の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を返す」のがうまくいきます。