Javascript 无匹配值时SELECT上的jquery set val()行为的解决方法

Javascript 无匹配值时SELECT上的jquery set val()行为的解决方法,javascript,jquery,select,Javascript,Jquery,Select,如果我有此选择框: <select id="s" name="s"> <option value="0">-</option> <option value="1">A</option> <option value="2" selected>B</option> <option value="3">C</option> </select> - A. B C 如果我尝试运行$

如果我有此选择框:

<select id="s" name="s">
<option value="0">-</option>
<option value="1">A</option>
<option value="2" selected>B</option>
<option value="3">C</option>
</select>

-
A.
B
C
如果我尝试运行
$(“#s”).val(“4”)
,选择将更改为“0”。(请参见此处的行为:)如何使我尝试将选择框设置为选择框中不存在的值时,不会发生任何更改?

您可以尝试以下方法:

var toSel = 3; // Say your value is this
if($("#s option[value=" + toSel +"]").length > 0) //Check if an option exist with that value
{
    $("#s").val(toSel); //Select the value
}
或者只是使用


您可以将其应用到插件中:

jQuery.fn.selectVal = function (val) {
    return this.each(function () {
        if (this.nodeName === "SELECT") {
            var idx = this.selectedIndex;

            $(this).val(val);

            var newOpt = this.options[this.selectedIndex];

            if (newOpt.value !== ("" + val))
                this.selectedIndex = idx;
        }
    })
};

$("#s").selectVal(4);

在调用jquery的val之前,您可能希望使用自定义筛选器

$.fn.valScreen = function(value){
 if( this.is("select") && this.find("option[value="+value+"]").length != 0 )
  this.val(value);//call vanilla val
 return this;//return jQuery object for chaining
};
然后您可以使用它:

$("#s").valScreen("4");

如果我的选项恰好有一个在jquery选择器中无效的值?像一个“[”?是否有一些函数可以转义jquery选择器中所有无效的特殊字符?@adam0101是的,我们可以应用正则表达式和一个实用函数。。我将设置一个fiddle。@adam0101无需使用正则表达式查看我的答案更新和演示。只需将值括在引号中即可。@PSL正在使用您的示例,这使我清楚了我的d关于
attr
vs
prop
+1,s[0].selectedIndex是否为空?我不理解最后一个line@adam0101:如果设置为第一个选项,它将是
0
。因为
0
是错误的,所以它将使用
idx
@adam0101:我更新了插件,以便在您想要将其设置为
0
时它可以工作。而FWIW,这是一个非常轻量级的操作我同意。另外,您只需执行一个循环来设置值,而不是使用第二个循环来检查值是否存在。
$.fn.valScreen = function(value){
 if( this.is("select") && this.find("option[value="+value+"]").length != 0 )
  this.val(value);//call vanilla val
 return this;//return jQuery object for chaining
};
$("#s").valScreen("4");