如何使用jQuery选择'user:name'或'city:id'等特殊属性?
<div user:name="Ropstah"></div>
<span city:id="4"></div>
的Javascript
//this works:
alert($('div').attr("user:name")); // alerts 'Ropstah'
//this doesn't work:
alert($('div[user:name]').attr("user:name")); //error
alert($('div[user\\:name]').attr("user:name")); //error even with special character escaping...
答案 0 :(得分:4)
您有两种选择:
:
并使用“非标准”属性(老实说,这不是什么大问题)最初,您可能必须这样做:
$('div').filter(function() {
return $(this).attr('user:name') !== undefined;
}).whateverElse();
速度方面,这应该与jQuery的[]
选择器非常接近,因为它无论如何都是在库内做的。当然,每次要查找具有属性的元素时都要输入更多内容,因此您可以为它编写一个插件,因为jQuery非常棒并允许您执行此类操作:
$.fn.hasattr = function(attr) {
return this.filter(function() {
return $(this).attr(attr) !== undefined;
});
};
这会让你做得更简单:
$('div').hasattr('user:name').whateverElse();
或者如果你想检查属性是否等于某个东西,插件可能是:
$.fn.cmpattr = function(attr, value) {
return this.filter(function() {
return $(this).attr(attr) == value;
});
};
然后你可以这样做:
$('div').cmpattr('user:name', 'Ropstah').whateverElse();
答案 1 :(得分:3)
修复它:
jQuery.expr.match.ATTR = /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+|\w+:\w+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/;
// ^^^^^^^^
编辑:这不是官方修正,但它看起来效果很好。
我有一些由jQuery及其内部工作引起的令人头疼的问题...有时,我认为,可以自己陷入困境并自行修复。 :)
答案 2 :(得分:2)
如果你可以使用非标准属性(它不会以任何方式影响你的标记渲染......它真的很无害),你可以这样做:
<div nonstandard="harmless" />
$("div[nonstandard='harmless']")
我已经使用过这种方法几次了。实事求是没有坏处。