2番目の方法が推奨される方法です。これにはいくつかの理由があります。
まず、プレゼンテーションをロジックから分離します。物事を維持するのが難しくなるので、プレゼンテーション(HTML)をロジックと混同したくないでしょう。JavaScriptロジックがHTMLのどこにフックされているかを簡単に確認できるように、JavaScriptの単一の領域を「バインディング」専用にするのが好きです。ただし、これをHTML自体から除外することが重要です。
次に、コードの重複を防ぎます。インラインメソッドは、多くの場合、次のようなコードになります。
[ <a href="javascript:void(0)" onclick="closeWindow()">X</a> ]
...
<button onclick="closeWindow()">Close Window</button>
問題は、単一の関数またはメソッドを参照する多くの異なる要素になってしまうことです。その関数またはメソッドが何らかの形で変更された場合は、すべての参照を探し回る必要があります。これは、基本的なコード重複防止対策に違反します。このようなことをする方がはるかに良いです
[ <a href="javascript:void(0)" class="closeWin">X</a> ]
...
<button class="closeWin">Close Window</button>
...
<script type="text/javascript">
$(function() {
$(".closeWin").on("click", closeWindow);
});
</script>
第3に、デバッグ目的でブレークポイントを追加できる特定のユーザーアクションに単一のチョークポイントを使用できます。確かに、呼び出されている関数内でこれを行うことはできますが、専用のバインディング領域があると、処理が高速化されるようです。
第四に、それは複数のバインディングを可能にします。たとえば、3つのボタンがあり、最初の2つは1つのアクションを実行し、最後の2つは別のアクションを実行します(したがって、2番目のボタンは両方のアクションを実行します)。次のように、onclickでJavaScriptの複数行をスローし始めることができます。
<button onclick="one();">One</button>
<button onclick="one();two();">Two</button>
<button onclick="two();">Three</button>
これはそれがそうであるのと同じくらい醜いように見えます。次のような厄介な中間方法を使用することもできます。
<button onclick="one();">One</button>
<button onclick="oneAndTwo();">Two</button>
<button onclick="two();">Three</button>
これも非常に醜く、メンテナンスの悪夢になります。または、いくつかの単純なバインディングを行うことができます。
<button class="actionOne">One</button>
<button class="actionOne actionTwo">Two</button>
<button class="actionTwo">Three</button>
...
<script type="text/javascript">
$(function() {
$(".actionOne").on("click", one);
$(".actionTwo").on("click", two);
});
</script>
はるかにクリーンでメンテナンスが簡単です。
さて、どのイベントハンドラーがアタッチされているかを判断する方法についての懸念については、完璧な答えはありませんが、かなり良い答えがあります。GoogleChromeを入手してください(これはSafariでも機能する可能性があります)。Google Chromeで要素を調べると、その要素にアタッチされているイベントハンドラーのリストが表示されます。
JavaScriptに「バインディング」セクションを含めることについての私のアドバイスに従うと、何が何にバインドされているかを絞り込むのは非常に簡単です。しかし、Chromeを使用すると、さらに高速で簡単になります。あなたはあなたが最もよく見える方法であなたのコードを書くことを歓迎します。リモートバインディングがインラインバインディングよりも優先されることはかなり一般的に受け入れられていますが。それを超えてそれらを処理する方法は、あなた自身の経験とプログラミングスタイルに依存します。