下一个 select 匹配过滤器的选项
Next select option that matches filter
我在尝试让下拉菜单循环到下一个具有 data-completed=false 的选项时遇到问题
<select id="selectionChamp">
<optgroup label="1">
<option data-completed=true selected>Text 1</option>
</optgroup>
<optgroup label="2">
<option data-completed=true>Text 2</option>
</optgroup>
<optgroup label="3">
<option data-completed=true>Text 3</option>
</optgroup>
<optgroup label="45">
<option data-completed=false>Text 4</option>
<option data-completed=false>Text 5</option>
</optgroup>
</select>
<input type="button" id="fieldNext" value="Next">
Javascript:
$("#fieldNext").click(function() {
var $selected = $("option:selected");
var filter = "[data-completed!=true]";
$selected.attr("data-completed", true).prop("selected", false);
var $next = $selected.next("option"+ filter);
if ($next.length === 0) {
$next = $selected.parent("optgroup").next("optgroup:has(option"+ filter+")").find("option"+ filter+":first");
}
$next.prop("selected", true);
});
参见:http://jsfiddle.net/w9kcd/105/
我在 filter = "";
时可以使用,但在 filter = "[data-completed!=true]";
时不行
应该从 1 开始到 4 然后到 5,跳过 2 和 3。
next
方法只是 select 元素的下一个直接兄弟。如果您将过滤器传递给它,它将 select 下一个直接兄弟,仅当它匹配指定的 selector 时。直到找到匹配的元素,它才会执行。替代方法是 nextAll
执行此操作,但下一个目标元素不是起始元素的兄弟元素。您可以从 selected 元素的父元素开始,然后使用 :has
selector 查找具有预期子元素但 better/more 的 optgroup
s有效的选项是:
var $options = $("#selectionChamp option");
$("#fieldNext").click(function() {
var $selected = $("option:selected").attr("data-completed", 'true');
// get the index of the current selected element
var i = $options.index($selected);
// find the first next matching element
// you can also pass a string to the filter method: `[data-completed!="true"]`
var $next = $options.slice(i /* + 1 */).filter(function() {
return this.getAttribute('data-completed') !== "true";
}).eq(0).prop("selected", true);
});
Here 您可以在 jsfiddle.net 上找到演示。
我在尝试让下拉菜单循环到下一个具有 data-completed=false 的选项时遇到问题
<select id="selectionChamp">
<optgroup label="1">
<option data-completed=true selected>Text 1</option>
</optgroup>
<optgroup label="2">
<option data-completed=true>Text 2</option>
</optgroup>
<optgroup label="3">
<option data-completed=true>Text 3</option>
</optgroup>
<optgroup label="45">
<option data-completed=false>Text 4</option>
<option data-completed=false>Text 5</option>
</optgroup>
</select>
<input type="button" id="fieldNext" value="Next">
Javascript:
$("#fieldNext").click(function() {
var $selected = $("option:selected");
var filter = "[data-completed!=true]";
$selected.attr("data-completed", true).prop("selected", false);
var $next = $selected.next("option"+ filter);
if ($next.length === 0) {
$next = $selected.parent("optgroup").next("optgroup:has(option"+ filter+")").find("option"+ filter+":first");
}
$next.prop("selected", true);
});
参见:http://jsfiddle.net/w9kcd/105/
我在 filter = "";
时可以使用,但在 filter = "[data-completed!=true]";
应该从 1 开始到 4 然后到 5,跳过 2 和 3。
next
方法只是 select 元素的下一个直接兄弟。如果您将过滤器传递给它,它将 select 下一个直接兄弟,仅当它匹配指定的 selector 时。直到找到匹配的元素,它才会执行。替代方法是 nextAll
执行此操作,但下一个目标元素不是起始元素的兄弟元素。您可以从 selected 元素的父元素开始,然后使用 :has
selector 查找具有预期子元素但 better/more 的 optgroup
s有效的选项是:
var $options = $("#selectionChamp option");
$("#fieldNext").click(function() {
var $selected = $("option:selected").attr("data-completed", 'true');
// get the index of the current selected element
var i = $options.index($selected);
// find the first next matching element
// you can also pass a string to the filter method: `[data-completed!="true"]`
var $next = $options.slice(i /* + 1 */).filter(function() {
return this.getAttribute('data-completed') !== "true";
}).eq(0).prop("selected", true);
});
Here 您可以在 jsfiddle.net 上找到演示。