希望有一个简单的解决方法。我想选择所有具有事件属性的 html 元素。例如:onclick、onkeypress 等。有没有一种最简单的方法可以使用 Jquery 来执行此操作,而无需单独选择每个属性?
谢谢
我相信您的问题的简短回答是否定的。
不同的 HTML 标记支持不同的事件,因此它们应该在 jQuery 代码中的某个位置进行硬编码。例如,通过阅读 jQuery 代码,我找不到对 onkeypress 事件的任何引用。
所以,我认为你可以只依赖Has Attribute Selector [attribute]
:
$('[onclick], [onkeypress], [etc]');
如果值不具体,可以试试这种方法。
下面的演示基于选择器打印"hey you people"$([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());
});
您可以创建一个自定义过滤器函数来查找具有以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] );
}
}