2011-10-18 6 views
1

jquery 1.6.2を使用しています。jqueryのボタンのイベントリスナーの数を減らすにはどうしたらいいですか?

は基本的に私のページのいずれかで、私は次のようになります構造:

<div id="section1"> 
    <fieldset> 
     <ul> 
      <li> 
      <input type="radio" name="1" value="">blah 1</input></li> 
      <li> 
      <input type="radio" name="1" value="" checked="checked"> 
      blah 2</input> 
      </li> 
      <li> 
      <input type="radio" name="1" value="">blah 3</input> 
      </li> 
     </ul> 
     <div> 
      ....snipped... 
      <button type='submit' id='button1'/> 
     </div> 
    </fieldset> 
</div> 

をそして、私は100の、そのような構造を持っているので、私はこれに相当するイベントハンドラを100個持っています:

var name = "1"; 
$('#button1') 
    .parent().parent() 
    .find("input:radio[name='" + name + "']") 
    .filter(':checked') 
    .attr('value'); 

イベントリスナーを使って簡単にする方法はありますか?

+2

このコードは何も役に立たないようです(要素の 'value'を取得して破棄します)。あなたは何をしようとしているのですか? – icktoofay

+2

これはコード内のクリックイベントハンドラではありません。それは価値を見つけて変えることです。実際にあなたのコードで 'bind()'または 'click()'をしていますか? – Phrogz

+1

私はあなたが実際にイベントのクリックハンドラを省略したと思います。何をクリックしていますか? –

答えて

2

通常、jQueryでは、イベントリスナーの数を減らすために、.live()または.delegate()を使用します。

+0

イベントリスナーバインディングコードは表示されていませんが、それ以上具体的に答えるのは難しいです。 –

+0

実際のコード(文字数は少ない)を減らすことはできますが、聞いているシーンの後ろの量を減らすことはできません。 – dsdsdsdsd

1

このようなすべてのボタンに共通するクラスを追加します。

<button class="submitButton" type='submit' id='button1'/> 

次に、あなたが同じ振る舞いを持つすべてのこれらのボタンにバインドされます。このようなワンクリックハンドラを定義することができます

$(".submitButton").click(function() { 
    // put whatever code you want here for all submit buttons 
}); 

どのボタンが押されているのかを知る必要がある場合は、id値を取得してその値を取得できます。

$(".submitButton").click(function() { 
    var num = parseInt(this.id.match(/\d+/)[0], 10); 
    // now you can process the submit knowing the num 
    // is the number at the end of the buttom id 
}); 

それとも、あなたはこのようなボタンの上にデータ項目を入れることができます:

<button class="submitButton" data-num="1" type='submit' id='button1'/> 

そして、あなたはこのようにその番号を取得することができます:あなたのHTMLが無効である

$(".submitButton").click(function() { 
    var num = $(this).data("num"); 
    // now you can process the submit knowing the num 
    // is the number at the end of the buttom id 
}); 
+1

私はこの_still_が100個の異なるハンドラ参照を静かに作成すると思います。大量のコードを入力する必要はありません。質問は少し曖昧ですが、Askerが実際のハンドラインスタンスの数を最小限に抑えたい場合、 '.delegate'がより良いオプションのように見えることに注意する価値があります。 –

+0

@richardneililagan - それでも、すべてのボタンのリスナーを作成します。 id * secton1 *でdivにリスナーを置き、* event.target *または* event.srcElement *を使用してボタンを取得する方がよいでしょう。 – RobG

+0

@RobG - イベントが発生した場所のボタンにリスナーを配置してみませんか?なぜそれを親に置くのですか? – jfriend00

0

、ボタン要素は持っている必要があります終了タグ:

<div id="section1"> 
    <fieldset> 
     <ul> 
      <li> 
      <input type="radio" name="1" value="">blah 1</input></li> 
      <li> 
      <input type="radio" name="1" value="" checked="checked"> 
      blah 2</input> 
      </li> 
      <li> 
      <input type="radio" name="1" value="">blah 3</input> 
      </li> 
     </ul> 
     <div> 
      ....snipped... 
      <button id='button1' type="submit">click me</button> 
     </div> 
    </fieldset> 
</div> 

は、あなただけのボタンに対応した親のdivにクリックリスナーを付けることができますタイプサブミット:

window.onload = function() { 
    var el = document.getElementById('section1'); 
    el.onclick = handleClick; 
} 

function handleClick(evt) { 
    var evt = evt || window.event; 
    var el = evt.target || evt.srcElement; 

    if (el && el.tagName && el.tagName.toLowerCase() == 'button' && 
     el.type == 'submit') { 
    alert('clicked button with id ' + el.id); 
    } 
} 
関連する問題