2012-08-30 49 views
18

有没有用javascript(特别是jQuery)根据部分属性查找元素的方法名称根据部分属性查找HTML

我不找任何在这些链接引用该发现部分属性值选择的:

,但更多的东西沿着

线
<div data-api-src="some value"></div> 
<div data-api-myattr="foobar"></div> 

$("[^data-api]").doSomething() 

到f指定具有以“data-api”开头的属性的任何元素。

+2

这个问题可能会有所帮助:[jquery的数据选择器(http://stackoverflow.com/questions/2891452/jquery-data-selector) – jrummell

+1

将它始终是一个“DATA- “属性? – Ian

+0

@ianpgall更可能,是的。它们会类似于某个点(比如data-api),那么属性名称的其余部分可能有意义。 –

回答

6

不知道它是什么,你要寻找的,只是花了几分钟写这篇:

$.fn.filterData = function(set) { 
    var elems=$([]); 
    this.each(function(i,e) { 
     $.each($(e).data(), function(j,f) { 
      if (j.substring(0, set.length) == set) { 
       elems = elems.add($(e)); 
      } 
     }); 
    }); 
    return elems; 
} 

的情况下使用,如:

$('div').filterData('api').css('color', 'red'); 

而且将匹配与任何元素数据属性如data-api-*,您可以扩展和修改它以包含更多选项等,但现在它只搜索数据属性,只匹配'开头',但至少使用起来很简单?

FIDDLE

8

这使用.filter()限制考生那些具有data-api-*属性。可能不是最有效的方法,但如果您可以先用相关选择器缩小搜索范围,则可用。

$("div").filter(function() { 
    var attrs = this.attributes; 
    for (var i = 0; i < attrs.length; i++) { 
     if (attrs[i].nodeName.indexOf('data-api-') === 0) return true;  
    }; 
    return false; 
}).css('color', 'red'); 

演示:http://jsfiddle.net/r3yPZ/2/


这也可以写为一个选择器。这是我的新手尝试:

$.expr[':'].hasAttrWithPrefix = function(obj, idx, meta, stack) { 
    for (var i = 0; i < obj.attributes.length; i++) { 
     if (obj.attributes[i].nodeName.indexOf(meta[3]) === 0) return true; 
    }; 
    return false; 
}; 

用法:

$('div:hasAttrWithPrefix(data-api-)').css('color', 'red'); 

演示:http://jsfiddle.net/SuSpe/3/

这个选择应该预先1.8版本的jQuery的工作。为1。8及以上,some changes may be required。下面是在一个标准的1.8版本的尝试:

$.expr[':'].hasAttrWithPrefix = $.expr.createPseudo(function(prefix) { 
    return function(obj) { 
     for (var i = 0; i < obj.attributes.length; i++) { 
      if (obj.attributes[i].nodeName.indexOf(prefix) === 0) return true; 
     }; 
     return false; 
    }; 
}); 

演示:http://jsfiddle.net/SuSpe/2/


对于一个更通用的解决方案,下面是需要一个正则表达式模式与匹配模式的属性选择元素选择:

$.expr[':'].hasAttr = $.expr.createPseudo(function(regex) { 
    var re = new RegExp(regex); 
    return function(obj) { 
     var attrs = obj.attributes 
     for (var i = 0; i < attrs.length; i++) { 
      if (re.test(attrs[i].nodeName)) return true; 
     }; 
     return false; 
    }; 
}); 

对于你的榜样,这样的事情应该工作:

$('div:hasAttr(^data-api-.+$)').css('color', 'red'); 

演示:http://jsfiddle.net/Jg5qH/1/

+0

这是一个很好的解决方案。我喜欢能够将它用作选择器。谢谢。 – marlar