2009-06-29 5 views
3

これを繰り返しているのがわかります。jQueryでIDをフィルタリングして一致を捕らえる

$jq("button").filter(function(){ 
    return this.id.match(/^user_(\d+)_edit$/); 
}).click(function(){ 
    var matches = this.id.match(/^user_(\d+)_edit$/); 
    var user_id = matches[1]; 

    alert('click on user edit button with ID ' + user_id); 
}); 

だから私はいくつかのボタンをクリックイベントを適用すると、クリックイベントハンドラで、私は、ユーザーIDが必要です。 2回目の試合を避ける方法はありますか?

$jq("button").filter(function(){ 
    return this.id.match(/^user_(\d+)_edit$/); 
}).click(function(){ 
    var user_id = some_magic_variable; 

    alert('click on user edit button with ID ' + user_id); 
}); 

ありがとうございます。

答えて

10

初めての試合は避けてください。

$jq("button[id^=user][id$=edit]").click(function() { 

}); 

はそのstarts withユーザーとends with編集IDを持つすべてのボタンを選択します。

正直、あなたのユースケースを見て、単にユーザーに「EDIT_USER」のクラスを編集してからちょうど行うことを意味しているすべてのボタンを与えることWAY方が良いだろうが:

$jq('button.edit_user').click(function() { 

}); 

ことがありますもっとクリーンで速く、同様の目的を果たすすべての要素を取得するjQueryの方法です。

は限りユーザーIDの取得などのカスタムこのサイト(Custom attributes - Yay or nay?)の属性と私は個人的に私の要素でdata-userid='5'を行い、その後、単にIDを取得するためにvar id = $(this).attr('data-userid');を行う上でいくつかの活発な議論がなされています。ニースと簡単。 XHTMLとしては検証されません。

+1

+1正規表現マッチングよりもかわいく、有用な提案です。 – karim79

+0

私は 'edit_user'クラスの使用に同意しますが、各ボタンへのuser_idリンクが必要です。私はこれを行うことができます

+1

+1あなたをパオロにしてください...あなたは、2日か3日のあなたのものでした。洞察力の提供をやめてください! – Sampson

3

フィルタを実行するときに要素を(jQueryのdataメソッドを使用して)格納し、その値をクリックハンドラで取得できます。

$jq("button").filter(function(){ 
    var $this = $jq(this); 
    var matches = $this.attr('id').match(/^user_(\d+)_edit$/); 

    if (matches) { 
     $this.data('idNumber', matches[1]); 
    } 

    return matches; 
}).click(function(){ 
    var user_id = $(this).data('idNumber'); 

    alert('click on user edit button with ID ' + user_id); 
}); 
0

個人的に、私は前処理DOMでしょう:

$(function() { 

$("button").each(function() { 
     var matches = $(this).attr("id").match(/^user_(\d+)_edit$/); 

     if (matches) { 
     $(this).data("user_edit_id",matches[1]); 
     } 
    } 
}); 

その後、あなたは、単に行うことができます

$("button").filter(function(){ 
    return $(this).data("user_edit_id"); 
}).click(function(){ 
    var user_id = $(this).data("user_edit_id"); 

    alert('click on user edit button with ID ' + user_id); 
}); 

それはあなたが望むものに完璧なソリューションではないが、それは一つの方法です...

+0

このソリューションの大きなファンではありません。すべてのボタンを不必要に掃除しています。最低でも、一致するものがあれば、それぞれにクラスを追加し、クリックと一緒にチェーンし、フィルタ機能を完全に避けることができます。それで、$( 'button')。each(...)filter( '。user_edit')。 –

+0

真実ですが、私は現在の問題のコンテキスト内でソリューションを提案していました(マークアップを変更することなく) –

関連する問題