jQuery - select DOM 在 each() 循环中具有 "hidden" 属性的元素
jQuery - select DOM elements that have "hidden" attribute in an each() loop
我需要 select 添加了 'hidden' 属性的所有 <select>
元素。这是标记:
<optgroup label="Label 1">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
我只展示了一个 <optgroup>
,但标记中有很多。
到目前为止我想出了这个代码:
jQuery('optgroup').each(function() {
var options = jQuery(this).find('option');
jQuery.each(options, function(index, value) {
if ($(value).data('hidden') !== undefined) {
console.log('Found it!');
}
});
});
不幸的是,里面的条件代码永远不会为真。我在这里错过了什么?
使用 attribute exists selector - 下面的选择器将遍历所有具有 hidden
属性并且是 optgroup
元素[=16= 的后代的 option
元素]
jQuery('optgroup option[hidden]').each(function () {
console.log('Found it!', this);
});
保持结构
jQuery('optgroup').each(function () {
jQuery(this).find('option').each(function () {
if (jQuery(this).is('[hidden]')) {
console.log('Found it!');
}
});
});
你的问题是当你真正使用一个实际的(无效的)属性时你正在检查一个数据属性
我认为你根本不需要循环来做你想做的事。您可以简单地使用 .filter() 函数来获取满足特定条件的所有 optgroups。
var optgroupsWithAllHiddenOptions = jQuery('optgroup').filter(function(){
return jQuery(this).find('option[hidden]').length == jQuery(this).find('option').length;
});
或者只是
jQuery('optgroup').filter(function(){
return jQuery(this).find('option[hidden]').length == jQuery(this).find('option').length;
}).hide();
jQuery('optgroup').filter(function() {
return $(this).find('option[hidden]').length == $(this).find('option').length;
}).hide();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select>
<optgroup label="Label 1">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
<optgroup label="Label 2">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987" hidden>Option 4</option>
</optgroup>
<optgroup label="Label 3">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
<optgroup label="Label 4">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987" hidden>Option 4</option>
</optgroup>
</select>
我需要 select 添加了 'hidden' 属性的所有 <select>
元素。这是标记:
<optgroup label="Label 1">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
我只展示了一个 <optgroup>
,但标记中有很多。
到目前为止我想出了这个代码:
jQuery('optgroup').each(function() {
var options = jQuery(this).find('option');
jQuery.each(options, function(index, value) {
if ($(value).data('hidden') !== undefined) {
console.log('Found it!');
}
});
});
不幸的是,里面的条件代码永远不会为真。我在这里错过了什么?
使用 attribute exists selector - 下面的选择器将遍历所有具有 hidden
属性并且是 optgroup
元素[=16= 的后代的 option
元素]
jQuery('optgroup option[hidden]').each(function () {
console.log('Found it!', this);
});
保持结构
jQuery('optgroup').each(function () {
jQuery(this).find('option').each(function () {
if (jQuery(this).is('[hidden]')) {
console.log('Found it!');
}
});
});
你的问题是当你真正使用一个实际的(无效的)属性时你正在检查一个数据属性
我认为你根本不需要循环来做你想做的事。您可以简单地使用 .filter() 函数来获取满足特定条件的所有 optgroups。
var optgroupsWithAllHiddenOptions = jQuery('optgroup').filter(function(){
return jQuery(this).find('option[hidden]').length == jQuery(this).find('option').length;
});
或者只是
jQuery('optgroup').filter(function(){
return jQuery(this).find('option[hidden]').length == jQuery(this).find('option').length;
}).hide();
jQuery('optgroup').filter(function() {
return $(this).find('option[hidden]').length == $(this).find('option').length;
}).hide();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select>
<optgroup label="Label 1">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
<optgroup label="Label 2">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987" hidden>Option 4</option>
</optgroup>
<optgroup label="Label 3">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987">Option 4</option>
</optgroup>
<optgroup label="Label 4">
<option value="978" hidden>Option 1</option>
<option value="987" hidden>Option 2</option>
<option value="987" hidden>Option 3</option>
<option value="987" hidden>Option 4</option>
</optgroup>
</select>