2017-01-19 4 views
0

免責事項: 誰かがこれらの質問をしたと確信していますが、同様の質問を見つけるための正確なGoogleキーワードを考えることはできませんでした。だから私と一緒に耐えてください。壊れやすいJqueryコードにつながるクラス名へのイベントのバインド

質問: 私は常に必要に苦しんでいますが理由は次のパターンのjQueryのコードの全体のバルクを再書き込みします

<div class = 'foo'></div> 

<script> 
    $('.foo').on('click', function(){ 
     // Do something 
    }); 
</script> 

このコードの問題は、それがあまりにも壊れやすいということです。クラスの名前を変更してDOMの構造を変更すると、JSハンドラーをDOMエレメットにバインドすることに関連するJSの全体が編集対象になります。

リスクのような種類のjQueryのコードがにくくするか、または理想的にはすべてのそれを排除するためのベストプラクティスは何ですか?

+1

IMOはグローバルセレクタをできるだけ避けることです。 'const $ parent = $( '。親クラス'); const $ child = $ parent.find( '。child-class') ' –

+0

@john_omalleyは、私が理解できない重要なことを言っているようです。少し明確にすることはできますか? –

+0

'$'関数を使用してDOM内の要素を選択すると、DOM全体を検索しています。コードをどのように構造化したかによって、時にはそれが唯一のオプションです。しかし、jqueryは.find()を使って親要素でスコープを制限することができます。これはデカップリングにとって重要です。上記で言及した正確な関心事(つまり、答えではなくコメント)は扱われませんが、コードのエラーを起こしにくくするのに役立ちます。 –

答えて

4

構造体またはコンポーネントを定義しているクラスではなく、発生しているイベントに基づいて、バインドするクラスを追加する方が簡単です。例えば

<button class="foo js-add-user">Add User</button> 

<script> 
    $('.js-add-user').on('click', function() { 
    //.. 
    }); 
</script> 

あなたが.fooを変更したい場合、あなたはハンドラを台無しにする必要はありません方法。

+0

あなたのasnwerを受け入れるような感じです。しかし、あなたはMarceloMitaのasnwerについてコメントできますか?これはおそらく少し話題ですが、 'onclick'を使った場合と比較して、別々にバインドされた(jsファイル内で)イベントハンドラを使用する利点は何ですか? –

+0

その答えはほとんど主観的ですが、HTMLからあなたのJavaScriptを抽象化して懸念事項を分離することは、より読みやすく、思考し、デバッグするのに適しています。あなたのイベントベースのクラスを 'js-'で名前空間を付けることで、何が聞こえているのかを簡単に知ることができます。 – chazsolo

+1

この件に関するより良い回答は、[こちらの質問を読む](http://stackoverflow.com/questions/5871640/why-is-using-onclick-in-html-a-bad-practice) – chazsolo

1

あなたの要素をキャッシュし、ちょうど変数を参照することができます:あなたは、クラス名を変更する必要がある場合

var foo = $('.foo'); 
foo.on('click', function(){ 
    // Do something 
}); 

はその後、あなただけの一箇所でそれを変更する必要があります。これには、使用するたびに要素のDOMを再クエリする必要がないという利点もあります。

+0

ニース。もう1つの質問。まず、動的要素の場合はどうでしょうか? –

+1

動的要素の場合、変数を使用してクラス名を格納し、それをクエリ文字列に含めることができます。 'var fooClassname = '.foo'; var foo = $( '。' + fooClassname) '; – SimpleJ

+1

このアプローチでは、DOM構造のロジックを変更すると、変数の文字列 'fooClassname'が意味的に意味を失うことになるという欠点があります。 @chazsoloのアプローチにはこの欠点がありません。同意する? –

0

この方法でそれを行うには良い方法かどうかは知りませんが、私は通常のonclickいくつかの関数を呼び出すには、以下の構造を使用します。

<div onclick='myFunction();'></div> 

<script> 
    function myFunction() { 
    alert('Hey!'); 
    } 
</script> 
+0

MarceloMita、私は確信していませんが、AFAIK、onclickは動的要素に対しては機能しません –

+0

動的要素が何を意味するのか分かりません。しかし、私はこれらのdivのいずれかをクリックすると最初のものに等しいdivをdinamically加えるテストを行いました。うまくいきました。それは常に私がクリックしたどんなdivでも新しいdivを追加します。 [jsfiddle snipet](https://jsfiddle.net/tf5moyha/10/) – MarceloMita

+0

[この例では](https://jsfiddle.net/tf5moyha/21/)では、あなたは要素をargとして渡すことができます要素を変更するための関数 – MarceloMita

0

あなたのカスタムパラメータでエイリアス関数を作成することができ、後でそれらを保存することができます。また..あまりにもIDに設定する、またはクリックイベントを削除するには、このようなものを機能を追加することができます。

function setClickOnClass(className, func){ 
    var className = className; 
    $(className).click(function(){ 
     func(); 
     //... 
    }); 
} 

その後、あなただけの1本の電話をかけると、あなたはその時点でクラスを編集します。複数の場所や瞬間からやりたい場合は、「クラス」を作成することができます。

function ClickOnClass(className, func){ 
    var className = className; 

    this.setClick = function(optionalClassName){ 
     var classN = (optionalClassName) ? optionalClassName : className; 
     $(classN).click(function(){ 
      func(); 
      //... 
     }); 
    }; 

    return this; 
} 

//initialization 
var clickHandler = new ClickOnClass('.foo', func); 

//later in code 
clickHandler.setClick(); 
関連する問題