9

希望有一个简单的解决方法。我想选择所有具有事件属性的 html 元素。例如:onclick、onkeypress 等。有没有一种最简单的方法可以使用 Jquery 来执行此操作,而无需单独选择每个属性?

谢谢

4

4 回答 4

4

我相信您的问题的简短回答是否定的。

不同的 HTML 标记支持不同的事件,因此它们应该在 jQuery 代码中的某个位置进行硬编码。例如,通过阅读 jQuery 代码,我找不到对 onkeypress 事件的任何引用。

所以,我认为你可以只依赖Has Attribute Selector [attribute]

$('[onclick], [onkeypress], [etc]');
于 2012-10-21T15:54:46.733 回答
1

如果值不具体,可以试试这种方法

下面的演示基于选择器打印"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());
});
于 2012-10-21T15:55:19.683 回答
1

您可以创建一个自定义过滤器函数来查找具有以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');
});
于 2012-10-21T16:25:34.887 回答
0

您可以解析所有元素并检查。效率不高,但应该可以。

检查获取所有带有 onclick 的元素?

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] );
    }
}
于 2012-10-21T15:54:38.193 回答