【发布时间】:2017-11-07 23:35:30
【问题描述】:
例如,如果我想选择其 alt 为 Home 的每个图像,我可以执行以下操作:
$("img[alt='Home']")
但是如何在单个选择器中选择其width CSS 属性为 750 像素的每个元素?
编辑:如果没有这样的选择器,是否有任何插件,或者有计划在下一个 jQuery 版本中实现它?
【问题讨论】:
例如,如果我想选择其 alt 为 Home 的每个图像,我可以执行以下操作:
$("img[alt='Home']")
但是如何在单个选择器中选择其width CSS 属性为 750 像素的每个元素?
编辑:如果没有这样的选择器,是否有任何插件,或者有计划在下一个 jQuery 版本中实现它?
【问题讨论】:
不一定是个好主意,但您可以为其添加一个新的 Sizzle 选择器:
$.expr[':'].width = function(elem, pos, match) {
return $(elem).width() == parseInt(match[3]);
}
然后你可以像这样使用它:
$('div:width(970)')
不过,这将非常缓慢,因此您需要缩小要比较的元素数量,例如:
$('#navbar>div:width(970)')
只选择那些是导航栏的直接后代的 div,它们的宽度也为 970px。
【讨论】:
$.expr 是 jQuery 中正确的 API 吗?我只使用了jQuery.find.selectors.filters,因为那是 Sizzle 暴露于全局范围的地方。
var $images = $("img").filter(function() {
return $(this).css('width') == '750px';
});
编辑:我知道没有插件,也没有任何计划包含此类特定功能。您可以轻松地自己插件化它,例如(未经测试):
$.fn.filterByWidth = function(width) {
var $images = $("img").filter(function() {
return $(this).css('width') == width;
});
return $images;
};
用法:
$images = $('#div img').filterByWidth('750px');
$images = $('#div img').filterByWidth('50%');
...etc...
【讨论】:
我不知道这是否可行,但是...:
${"[style*=width: 750px]")
但是,您最好使用一个类来控制宽度,然后修改该类的所有实例的宽度...或更改为不同的类:
$(".classname").removeClass("classname").addClass("otherclassname");
【讨论】:
这是一个旧的,但感谢 Jonathan del Strother 的回答,这让我开始思考如何进一步完善这一点:
(function($){
// Add commonly used regex to the jQuery object
var regex = {
digits: /^(-?\d+(?:\.\d+)?)([a-zA-Z]+)?$/
,expr: /^([\w-]+)\s*([:=<>])\s*([\w-\.]+(?:\([^\)]+\))?)$/
};
// Create a custom jQuery function that allows a bit more useful CSS extraction
$.fn.extend({
cssExtract: function(cssAttr) {
var val = {prop:this.css(cssAttr)};
if (typeof val.prop === "string") {
var match = regex.digits.exec(val.prop);
if (match) {
val.int = Number(match[1]);
val.metric = match[2] || "px"
}
}
return val;
}
});
// Create the custom style selector
$.find.selectors[":"].style = function(el, pos, match) {
var search = regex.expr.exec(match[3]);
if (search) {
var style = search[1]
,operator = search[2]
,val = search[3]
,target = $(el).cssExtract(style)
,compare = (function(result){
if (result) {
return {
int: Number(result[1])
,metric: result[2] || "px"
};
}
return null;
})(regex.digits.exec(val));
if (
target.metric
&& compare && compare.metric
&& target.metric === compare.metric
) {
if (operator === "=" || operator === ":") {
return target.int === compare.int;
} else if (operator === "<") {
return target.int < compare.int;
} else if (operator === ">") {
return target.int > compare.int;
}
} else if (target.prop && (operator === "=" || operator === ":")) {
return target.prop === val;
}
}
return false;
};
})(jQuery);
您现在应该可以使用自定义style 选择器轻松查询,如下所示:
$("div:style(height=57)")
在回答这个问题时 - 应该返回 Stack Overflow(此页面)的顶部 div 元素。
这样的事情甚至会起作用:
$("h3:style(color:rgb(106, 115, 124))")
尝试在浏览器的开发人员工具中添加代码。我在 Chrome 中对其进行了测试。没有在别人身上测试过。我也没有花太多精力研究其他现有的库/插件。
【讨论】:
我遇到了类似的问题。最后编写了一个插件来根据计算的样式选择元素。
https://github.com/MikeCostello/query-declaration
jQuery$(":style({ width: 750px})")
【讨论】: