2012-10-21 7 views
9

これは簡単な回避策です。 イベント属性を持つすべてのhtml要素を選択したいとします。例:onclick、onkeypressなど.Jqueryを使用して各属性ごとに別々に選択せずにこれを行う最も簡単な方法はありますか?Jqueryを使用してイベント属性を持つ要素を選択する方法は?

ありがとうございました

+0

驚くべきことに、今までの回答にはあなたの興味深い質問に答えられていません。 – gdoron

答えて

4

私はあなたの質問への短い答えはノーであると信じています。

異なるHTMLタグはさまざまなイベントをサポートしているため、jQueryコードのどこかにハードコードされている必要があります。また、jQueryコードを読んで、onkeypressイベントへの参照を見つけることができません。

だから、私はあなたがHas Attribute Selector[attribute]にだけ頼ることができると思う:

$('[onclick], [onkeypress], [etc]'); 
0

すべての要素を解析して確認できます。それほど効率的ではありませんが、うまくいくはずです。

チェックget all elements with onclick in them?

var allElements = document.getElementsByTagName('*'); 
for (var i = 0; i<allElements.length; i++) { 
    if (allElements[i].className !== 'theClassNameYoureLookingFor') { 
     continue; 
    } 
    if (typeof allElements[i].onclick === 'function') { 
     // do something with the element here 
     console.log(allElements[i]); 
    } 
} 
1

値が特定されていない場合、あなたはthis approachを試すことができます。

$([attr1],[attr2],...,[attrN])セレクターに基づいて、 "ねえ、あなたの人々"、版画以下のデモ:その建設に基づいて

<div class="container"> 
    <div>no id</div> 
    <div id="a">hey</div> 
    <span name="b">you</span> 
    <p id="c">guys</p> 
</div>​ 

$('[id],[name]').each(function(){ 
    console.log($(this).text()); 
});​ 

、単純なラッパーを書くことができます。そのようなプラグインの

$.fn.hasAttrib = function() { 
    var attributes = []; 
    $.each(arguments, function(index, value){ 
     attributes.push('[' + value + ']'); 
    }); 
    return $(this).find(attributes.join()); 
}; 

使い方以下のステートメントでも「おいしい人」

$('.container').hasAttrib('id','name').each(function(){ 
    console.log($(this).text()); 
}); 
+0

これはどのようにして質問に答えますか? – gdoron

+0

gdoronが正しいです。彼は、すべてのイベントをリストするのではなく、種類の:hasEventセレクタがあるかどうかを知りたいとします。 –

1

あなたはそうのように、にで始まる属性を持つ要素を見つけるために、カスタムフィルタ機能を作ることができる:

$.fn.filterOn = function() { 
    this.each(function(ind,el) { 
     var attrs = el.attributes; 
     for (var i = 0; i < attrs.length; i++) { 
      if (attrs[i].nodeName.indexOf('on') === 0) return true;  
     } 
     return false; 
    }); 
}; 

など、それを使用します。

//elems will contain all input fields with an attribute starting with 'on' 
elems = $(':input').filterOn(); 

そして、これが得られますがページ内ので始まるすべての要素が*セレクタを使用した場合のパフォーマンスに注意してください):

$("*").filterOn().each(function() { 
    console.log('Element '+this.tagName + ' has an on... attribute'); 
}); 
+0

これは、標準のHTML属性でのみ作業する場合にのみ安全です。 –

+0

@ルーカファジオリはい、私はOPの問題に取り組む別の可能性を追加しようとしています。イベントが標準のhtml属性を介して接続されていることを彼の事例で理解しました。OPは自分のhtmlテンプレートをよく知っていて、私の解決策が彼の特定の場合に役立つかどうかを知るだろう。私はちょうどプレートに異なる解決方法を追加している:-) – Nelson

+0

そしてそれは弱いチェックです。それは正しい構文(標準的なHTML属性のみのコンテキストで)を持っていますが、異なるHTMLタグはそのようなイベントのサブセットのみをサポートします。また、map [tag :: [attributes]]に対してチェックを追加する必要があります。しかし、私はそれが過度にCPUを使い始めると信じています。 –

関連する問題