これには簡単な回避策があることを願っています。イベント属性を持つすべてのhtml要素を選択したいと思います。例:onclick、onkeypressなど。各属性で個別に選択せずにJqueryを使用してこれを行う最も簡単な方法はありますか?
ありがとう
あなたの質問に対する簡単な答えはノーだと思います。
さまざまなHTMLタグがさまざまなイベントをサポートするため、jQueryコードのどこかにハードコーディングする必要があります。また、jQueryコードを読んでいると、たとえばonkeypressイベントへの参照が見つかりません。
だから、私はあなたがただ属性セレクターを持っている [attribute]
ことに頼ることができると思います:
$('[onclick], [onkeypress], [etc]');
値が具体的でない場合は、このアプローチを試すことができます。
以下のデモは、セレクターに基づいて「heyyoupeople」を印刷します。$([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());
};
以下のステートメントでこのようなプラグインを使用すると、「heyyoupeople」も出力されます。
$('.container').hasAttrib('id','name').each(function(){
console.log($(this).text());
});
次のように、カスタムフィルター関数を作成して、 onで始まる属性を持つ要素を検索できます。
$.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();
これにより、 onで始まる属性を持つページ内のすべての要素が得られます( *セレクターを使用する場合はパフォーマンスに注意してください)。
$("*").filterOn().each(function() {
console.log('Element '+this.tagName + ' has an on... attribute');
});
すべての要素を解析して確認できます。あまり効率的ではありませんが、機能するはずです。
オンクリックですべての要素を取得するをチェックしますか?
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] );
}
}