"javascript:void(0);" vs "return false" vs "preventDefault()"
2023-11-04 06:41:31
質問
あるリンクが何もせず、javascriptのアクションにのみ反応するようにしたい場合、リンクがページの上端にスクロールするのを避ける最善の方法は何でしょうか?
私はそれを行うためのいくつかの方法を知っている、彼らはすべてうまく動作するように見える。
<a href="javascript:void(0)">Hello</a>
または
<a id="hello" href="#">Hello</a>
<script type="text/javascript>
$(document).ready(function() {
$("#toto").click(function(){
//...
return false;
});
});
</script>
そしてさらに:
<a id="hello" href="#">Hello</a>
<script type="text/javascript>
$(document).ready(function() {
$("#toto").click(function(event){
event.preventDefault();
//...
});
});
</script>
好みはありますか? なぜ? どのような条件で?
PS: もちろん、上記の例はjqueryを使用していることを前提にしていますが、mootoolsやprototypeにも同等のものがあります。
どのように解決するのですか?
バインドしています。
-
javascript:
URLは常に避けるべき恐怖である。 - インライン イベント ハンドラ属性も素晴らしいものではありませんが、ちょっとした迅速な開発/テストには適しています。
- スクリプトからバインドし、マークアップをきれいに残すことは、一般的にベストプラクティスと考えられています。jQueryはこれを奨励していますが、どのライブラリやプレーンJSでもできない理由はありません。
レスポンスです。
-
jQueryの場合
return false
は、両方のpreventDefault
とstopPropagation
であるため、イベント通知を受け取る親要素を気にする場合は意味が異なります。 -
jQueryはここでそれを隠していますが
preventDefault
/stopPropagation
は、通常IEでは異なるスペルでなければなりません(returnValue
/cancelBubble
).
しかし
-
リンクでないリンクがあります。これはどこにもリンクしておらず、アクションです。
<a>
はこのための理想的なマークアップではありません。誰かがそれをミドルクリックしたり、ブックマークに追加したり、リンクが持つ他の機能を使おうとすると、うまくいかないでしょう。 -
ページ上の別の要素を開いたり閉じたりする場合など、リンクが本当に何かを指す場合は、リンクが
#thatelementsid
を指すように設定し、控えめなスクリプトを使用してリンク名から要素 ID を取得します。またlocation.hash
をスニッフィングして、その要素を開くことができます。 -
そうでなければ、純粋にアクションであるものについては、そのようにマークアップすることが最善でしょう。
<input type="button">
または<button type="button">
. 必要であれば、ボタンの代わりにリンクのように見えるようにCSSでスタイルを設定することができます。 -
しかし、IE や Firefox では、ボタンのスタイリングを完全に取り除くことができない部分があります。通常それは重要ではありませんが、もし本当に絶対的な視覚的制御が必要な場合は、妥協案として
<span>
を使用することです。を追加することができます。tabindex
プロパティを追加することで、ほとんどのブラウザでキーボードからアクセスできるようになりますが、これは実際には適切に標準化されていません。また、SpaceやEnterなどのキー入力を検知してアクティブにすることもできます。これはちょっと不満ですが、それでもかなり人気があります (SO などはこのようにしています)。 -
もうひとつの可能性は
<input type="image">
. これは、完全な視覚的コントロールを持つボタンのアクセシビリティの利点を持ちますが、純粋な画像ボタンに対してのみです。
関連
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] javascript:void(0)」とは何ですか?
-
[解決済み] JavaScriptで複数の値を返す?
-
[解決済み] JSのDateからDay名
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?