JavaScriptコードを<a>に配置するさまざまな方法の違いは何ですか?


87

JavaScriptコードを<a>タグに入れる次の方法を見てきました。

function DoSomething() { ... return false; }
  1. <a href="javascript:;" onClick="return DoSomething();">link</a>
  2. <a href="javascript:DoSomething();">link</a>
  3. <a href="javascript:void(0);" onClick="return DoSomething();">link</a>
  4. <a href="#" onClick="return DoSomething();">link</a>

ユーザーがJavaScriptを有効にしていない場合に備えて、JavaScriptコードだけでなく有効なURLを配置しようとする考えを理解しています。しかし、この議論の目的のために、私はJavaScriptが有効になっていると仮定する必要があります(JavaScriptがないとログインできません)。

私は個人的にオプション2が好きです。これにより、何が実行されるかを確認できます。特に、関数に渡されるパラメーターがある場所をデバッグするときに役立ちます。私はそれをかなり使用しましたが、ブラウザの問題は見つかりませんでした。

私は人々が4を推薦することを読みました、なぜならそれはユーザーにたどる本当のリンクを与えるからです、しかし実際には、#は「本当」ではありません。それは絶対にどこにも行きません。

ユーザーがJavaScriptを有効にしていることがわかっているときに、サポートされていない、または本当に悪いものはありますか?

関連する質問:JavaScriptリンクのHref:「#」または「javascript:void(0)」?


小さな構文の問題:選択肢2は次のようになります-<ahref = "
javascript:DoSomething();

受け入れられた回答を@eyelidlessnessの回答に変更してください。セマンティクスに関心があるので、これが最善のアプローチだと思います。
のMichałPerłakowski

回答:


69

MattKruseのJavascriptのベストプラクティスの記事をとても楽しんでいます。その中で、彼は、hrefJavaScriptコードを実行するためにセクションを使用することは悪い考えであると述べています。ユーザーがJavaScriptを有効にする必要があると述べたとしても、hrefログイン後に誰かがJavaScriptをオフにした場合に、すべてのJavaScriptリンクがセクションを指すことができる単純なHTMLページを作成できない理由はありません。このフォールバックメカニズムを引き続き許可することを強くお勧めします。このようなものは「ベストプラクティス」に準拠し、目標を達成します。

<a href="javascript_required.html" onclick="doSomething(); return false;">go</a>

4
href値はステータスバーにユーザーに表示されますか?(下部のバー)もう少しユーザーフレンドリーなリンクを使用することを検討します。「js.html?doSomething」ページは引き続き静的htmlにすることができます。このようにして、ユーザーはリンク間の違いを明確に確認できます。
遺伝子

7
この値は、title属性でオーバーライドできます。例:<a href="javascript_required.html" title="Does Something" onclick="doSomething().return false;"> go </a>
目立つコンパイラ

javascript_required.htmlページへのリクエストをログに記録し、エラーの原因となった関数をログに記録することをお勧めします。
Timo Huovinen 2012年

2
SEOへの影響について考えたことはありますか?
DanielBlazquez 2012

Matt Kruseのjavascripttoolbox.comは、オフラインで販売されているようです。
showdev

10

addEventListener/を使用できるのに、なぜこれを行うのattachEventですか?何も存在しない場合href換算は、使用しない<a>、使用<button>に応じたスタイルに。


9
多くの場合、リンクの代わりにボタンを使用することは実行可能なオプションではありません。
nickf 2008年

2
見た目が醜いから。リンクの横にアイコンを追加できます。それらはブラウザ間で同じようにフォーマットするのは難しいです。そして一般的に、人々はボタンではなくリンクに移動しています-スタックオーバーフローのほとんどを見てください。
ダリル・ヘイン

2
醜いですか?それはあなたがそれがどのように見えるかを望むもののように見えます。実際、ボタンはインラインであるがブラウザ間で適切にパディングできるという点で、リンクよりもスタイルの柔軟性が高いと思います。CSSに関しては、リンクを使用して実行できることはすべてボタンを使用して実行できます。
まぶたのない2008年

2
スパンはキーボードに焦点を合わせることができません。
bobince 2008年

3
そして、ボタンは(gasp)意味的に正しいです。スパンは意味的に無意味です。ボタンは、まさに作者が意味的に使用しようとしているものです。
まぶたのない2008年

5

別の方法を忘れました:

5: <a href="#" id="myLink">Link</a>

JavaScriptコードの場合:

document.getElementById('myLink').onclick = function() {
    // Do stuff.
};

どのオプションが最高のサポートを持っているか、またはどのオプションが意味的に最高であるかについてコメントすることはできませんが、コンテンツをJavaScriptコードから分離するため、このスタイルの方がはるかに好きです。すべてのJavaScriptコードをまとめて保持するため、保守がはるかに簡単になり(特に、これを多くのリンクに適用する場合)、外部ファイルに入れてファイルサイズを縮小し、クライアントブラウザーでキャッシュすることもできます。


7
JSとのリンクが20または30ある場合、これは非常に面倒になり、多くのJSになってしまう可能性があります。
ダリルハイン

javascriptを変更するためにHTMLをくぐり抜けるのと同じくらい面倒です。...または、複数の要素のイベントを一度に簡単に変更できるjQueryのようなものを使用することもできます... $( '
#menu

1
@JKirchartz答えの背後に理由がある場合、それがどのように説教しているのかわかりません。質問を読んだら、それは本当に「これらの4つのうちどれが最良か」であり、私は彼が考慮していなかった別のオプションがあることを指摘しました。
nickf 2012

ABCとDの間で選択する際、1はE.を選択していない、trololoを気にしないでください
JKirchartz

3
@JKirchartzええ、あなたが本当にStackOverflowの目的を達成しているとは思いません。誰かが「Webアプリを構築するのにCobolとFortranのどちらが良いですか?」と尋ねた場合。その人に、すべての可能性を考慮していないと言ってもかまいません。問題は明らかに、「これら4つのことのうちどれが最良か」ということではありません。
nickf 2012

3
<a href="#" onClick="DoSomething(); return false;">link</a>

私はこれを行います、または:

<a href="#" id = "Link">link</a>
(document.getElementById("Link")).onclick = function() {
    DoSomething();
    return false;
};

状況に応じて。大規模なアプリの場合は、2番目のアプリが最適です。これにより、イベントコードが統合されます。


JSとのリンクが20または30ある場合、これは非常に面倒になり、多くのJSになってしまう可能性があります。
ダリルハイン

また、コードに忍び寄るバグは、デバッグが非常に難しい場合があります。これらのバグは、最初の例で証明されているように、非常に簡単に発生します。:)
nickf 2008年

1

方法2には、FF3とIE7で構文エラーがあります。私はメソッド#1と#3を好みます。なぜなら、#4は入力が少なくなるものの「#」でURIをダーティにするからです...明らかに、他の応答で指摘されているように、最良の解決策はhtmlをイベント処理から分離することです。


何の方法#2?質問は、あなたがそれらを見たときと同じ順序にとどまりません。
Diodeus -ジェームズ・マクファーレン

方法4、必ず確認すればURIを台無しにすることはありませんreturn false。そのため、(リストされているものの中で)方法4がおそらく最良です。
MARÖrlygsson

2
@ Diodeus、Pierは質問内の番号付きリストを参照していたと思います。これは、質問が最初に投稿されてから実際に存在しています。
まぶたがない2012年

1

これの間で私が気づいた1つの違い:

<a class="actor" href="javascript:act1()">Click me</a>

この:

<a class="actor" onclick="act1();">Click me</a>

どちらの場合でも、次のような場合です。

<script>$('.actor').click(act2);</script>

次に、最初の例でact2は、の前に実行さact1れ、2番目の例では、その逆になります。


1

最新のブラウザのみ

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(doc){
    var hasClass = function(el,className) {
        return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1;
    }
    doc.addEventListener('click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault();
          doSomething.call(e.target, e);
      }
    });
})(document);

function doSomething(event){
  console.log(this); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me">Button 1</button>
<input class="click-me" type="button" value="Button 2">

</body>
</html>

クロスブラウザ

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(doc){
    var cb_addEventListener = function(obj, evt, fnc) {
        // W3C model
        if (obj.addEventListener) {
            obj.addEventListener(evt, fnc, false);
            return true;
        } 
        // Microsoft model
        else if (obj.attachEvent) {
            return obj.attachEvent('on' + evt, fnc);
        }
        // Browser don't support W3C or MSFT model, go on with traditional
        else {
            evt = 'on'+evt;
            if(typeof obj[evt] === 'function'){
                // Object already has a function on traditional
                // Let's wrap it with our own function inside another function
                fnc = (function(f1,f2){
                    return function(){
                        f1.apply(this,arguments);
                        f2.apply(this,arguments);
                    }
                })(obj[evt], fnc);
            }
            obj[evt] = fnc;
            return true;
        }
        return false;
    };
    var hasClass = function(el,className) {
        return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1;
    }

    cb_addEventListener(doc, 'click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault ? e.preventDefault() : e.returnValue = false;
          doSomething.call(e.target, e);
      }
    });
})(document);

function doSomething(event){
  console.log(this); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me">Button 1</button>
<input class="click-me" type="button" value="Button 2">

</body>
</html>

ドキュメントの準備が整う前にこれを実行できます。イベントをドキュメントに添付するため、ボタンをクリックしても機能します。

出典:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.