1990年代には、次のようにJavascriptコードを<a>
href属性に直接配置する方法がありました。
<a href="javascript:alert('Hello world!')">Press me!</a>
そして突然、私はそれを見るために立ち止まりました。それらはすべて次のようなものに置き換えられました。
<a href="#" onclick="alert('Hello world!')">Press me!</a>
Javascriptコードをトリガーすることが唯一の目的であり、実際のhref
ターゲットがないリンクの場合、onclick
プロパティの代わりにhref
プロパティを使用することが推奨されるのはなぜですか。
実行コンテキストが異なります。これを確認するには、代わりに次のリンクを試してください。
<a href="javascript:alert(this.tagName)">Press me!</a> <!-- result: undefined -->
<a href="#" onclick="alert(this.tagName)">Press me!</a> <!-- result: A -->
javascript:
は、要素のメソッドとしてではなく、グローバルコンテキストで実行されます。これは、通常、必要なものです。ほとんどの場合、操作した要素を使用して、または要素に関連して何かを実行しているので、そのコンテキストで実行することをお勧めします。
また、インラインスクリプトはまったく使用しませんが、はるかにクリーンです。これらをよりクリーンな方法で処理するためのフレームワークを確認してください。 jQueryの例:
$('a').click(function() { alert(this.tagName); });
実際には、どちらの方法も廃止されたと見なされます。代わりに、開発者は、ロジックとコードを本物のマークアップから分離するために、外部JSファイル内のすべてのJavaScriptを分離することをお勧めします。
これは、保守とデバッグが容易なコードを作成し、Web標準とアクセシビリティを促進するためです。次のように考えてください。例を見ると、ページにそのようなリンクが何百もあり、外部JS参照を使用して他の関数のalert
動作を変更する必要がある場合、必要なのは大量のコードを何度もコピーして貼り付けたり、検索と置換を行ったりするのではなく、1つのJSファイル内の単一のイベントバインディングを変更します。
いくつかの理由:
悪いコード慣行:
HREFタグは、別の場所へのハイパーリンク参照があることを示します。実際にユーザーをどこにも連れて行かないjavascript関数に同じタグを使用することは、プログラミングの悪い習慣です。
SEOの問題:
WebクローラーはHREFタグを使用して、Webサイト全体をクロールし、接続されているすべての部分をリンクしていると思います。 javascriptを挿入することで、この機能を壊します。
アクセシビリティを破る:
一部のスクリーンリーダーはJavaScriptを実行できず、ハイパーリンクを期待している間はJavaScriptの処理方法を知らない可能性があると思います。ユーザーは、リンクにカーソルを合わせるとブラウザのステータスバーにリンクが表示され、「javascript:」のような文字列が表示されて混乱する可能性があります。
あなたはまだ1990年代です:
主流のアドバイスは、JavaScriptを別のファイルに入れ、1990年代に行われたようにページのHTMLと混同しないことです。
HTH。
新しいタブでたくさんのリンクを開きます-javascript:void()を見るためだけです。だからあなたは私とあなた自身を悩ませます(Googleは同じことを見るからです)。
別の理由(他の人も言及しています)は、異なる言語を異なるドキュメントに分割する必要があることです。どうして?上手、
短い答え:インラインCSSが悪いという理由で、インラインJavascriptは悪いです。
javascript:
プロトコルを使用すると、アクセシビリティに影響し、ページのSEOフレンドリー性にも悪影響を及ぼします。
HTMLは何か何かのハイプターテキストを表すことに注意してください...ハイパーテキストは、リンクと参照を含むテキストを示します。これは、アンカー要素<a>
が使用される目的です。
javascript:
'プロトコル'を使用すると、アンカー要素を誤用していることになります。 <a>
要素を誤用しているため、GoogleボットやJawsスクリーンリーダーなどは、JSについてはあまり気にしないが、ハイパーテキストMLについては十分に気にするため、ページを「理解」するのに問題があります。 、アンカーhrefs
に特に注意してください。
また、JavaScriptが有効になっていないユーザーがページにアクセスしたときのページのユーザビリティにも影響します。あなたはそれらのユーザーに期待されるリンクの機能と振る舞いを破っています。リンクのように見えますが、javascript
プロトコルを使用しているため、リンクのようには機能しません。
「でも、最近JavaScriptを無効にしている人は何人いますか?」と思うかもしれません。しかし、私はその考えを「ブラウザ設定のチェックボックスのために、何人の潜在的な顧客を拒否しても構わないと思っているか」という言葉に沿って表現したいと思います。
つまり、href
がHTML属性であり、そのため、サイトの動作ではなく、サイトの情報に属します。 JavaScriptは動作を定義しますが、データや情報に干渉することは絶対に避けてください。このアイデアの縮図は、外部JavaScriptファイルです。 onclick
を属性として使用するのではなく、JavaScriptファイルのイベントハンドラーとして使用します。
最悪の問題は、おそらくそれが期待される機能を壊すことです。
たとえば、他の人が指摘しているように、新しいウィンドウで開く/タブ=リンク切れ=イライラ/混乱しているユーザー。
私は常に代わりにonclick
を使用しようとしますが、andページのURLハッシュに何かを追加して、トリガーする目的の関数を示しますandでチェックを追加しますハッシュをチェックして関数をトリガーするためのpageload。
このようにして、クリック、新しいタブ/ウィンドウ、さらにはブックマーク/送信されたリンクに対して同じ動作が得られ、JSがオフの場合でも問題が発生することはありません。
言い換えれば、このようなもの(非常に単純化された):
リンクの場合:
onclick = "doStuff()"
href = "#dostuff"
ページの場合:
onLoad = if(hash="dostuff") doStuff();
また、非推奨とセマンティクスについて話している限り、おそらくそれを指摘する価値があります '</a>
'は'クリック可能 'を意味するのではなく、'アンカー 'を意味し、別のページへのリンクを意味します。したがって、そのタグを使用してアプリケーション内の別の「ビュー」に切り替えることは理にかなっていますが、計算は実行しません。 href属性にURLがないという事実は、アンカータグを使用してはならないことを示しているはずです。
または、クリックイベントアクションをほぼすべてのhtml要素に割り当てることができます-おそらく<h1>
、<img>
、または<p>
より適切でしょうか?とにかく、他の人が言及しているように、javascriptが要素に到達してonclickを割り当てるための「フック」(document.getElementById)として使用できる別の属性(おそらく「id」)を追加します。そうすれば、コンテンツ(HTML)プレゼンテーション(CSS)とインタラクティブ機能(JavaScript)を分離しておくことができます。そして、世界は終わりません。
私は通常、「EnableJavascript.htm」というランディングページを持っており、「この機能を使用するには、Javascriptを有効にする必要があります」という大きなメッセージが表示されます。そして、このようにアンカータグを設定します...
<a href="EnableJavascript.htm" onclick="funcName(); return false;">
このように、アンカーには正当な宛先があり、可能な場合はいつでもJavascript機能によって上書きされます。これは正常に低下します。しかし、今日では、Javascriptをミックスに振りかけることを決定する前に、通常、complete機能を備えたWebサイトを構築しています(これにより、このようなアンカーは不要になります)。
マークアップでonclick属性を直接使用することはまったく別のトピックですが、jQueryのようなライブラリを使用した目立たないアプローチをお勧めします。
ユーザーがステータスバーに表示する内容と関係があると思います。通常、JavaScriptが有効になっていない場合に備えて、アプリケーションはフェイルオーバー用に構築する必要がありますが、常にそうであるとは限りません。
スパムが発生しているため、人々はよりスマートになり、電子メールが「フィッシュ」に見えると、リンクが実際にどこに到達するかを確認するためにステータスバーを見る人が増えています。
'returnfalse;'を追加することを忘れないでください。リンクの最後に移動して、ページがユーザーの一番上にジャンプしないようにします(それが探している動作でない限り)。