使用.each()jquery进行多个selectbox值测试

时间:2016-09-03 13:35:48

标签: javascript jquery

从以下代码可以清楚地看到,我试图遍历所有选择框,但不包括某些ID。

问题

不使用非选择器,它循环遍历所有选择框&应该做什么。但是当与.not()选择器一起使用时,它会跳过多个类型的选择框。我在这里使用了一些错误的语法或遗漏了什么。

$('.selectpicker:not("#Fresher, #Simple, #Advanced") :selected').each(function(i, sel){
    if (!$(sel).val()){
        $(this).closest("div:has(label)").find(".bootstrap-select").removeClass('formvalid').addClass('formerror'); 
        $(this).closest("div:has(label)").find("span.validation").removeClass('valid').addClass('error');
    }else{
        $(this).closest("div:has(label)").find(".bootstrap-select").removeClass('formerror').addClass('formvalid');
        $(this).closest("div:has(label)").find("span.validation").removeClass('error').addClass('valid');           
    }
}); 

HTML

<select id="Fresher" name="Fresher" multiple class='selectpicker show-menu-arrow' data-width='100%' data-size='10' title='Select Saved Search'>
 <option class="bs-title-option" value="">Select Saved Search</option>
 <option value="61">QUALITY</option>
 <option value="62">TEST</option>
 <option value="64">NEW SEARCH</option>
 <option value="66">NEW SEARCH</option>
</select>

<select id="f_Min_salary" name='Min_salary' class="selectpicker show-menu-arrow" data-width="100%" data-size="10" title='Select Min Salary'>
 <option class="bs-title-option" value="">Select Min Salary</option>
 <option value="101"><1 lakh</option>
 <option value="102">1 lakh</option>
 <option value="103">1.5 lakh</option>
 <option value="104">2 lakh</option>
</select>

更新

道歉:我忘了在第一个选择框中添加属性MULTIPLE。如上所述,没有多个属性它可以正常工作。对于多个选择框,它会跳过验证。

UPDATE-2

或者有没有更简单的方法将当前的selectbox id与id&amp;数组匹配。如果找到,那么只需忽略任何规则中的特定选择框。

4 个答案:

答案 0 :(得分:1)

删除选择器和:selected伪选择器之间的空格。空间在jQuery中非常重要。

编辑:

运行此JSFiddle,看起来你的jQuery选择器工作得很好。这可能是你的类切换不能按预期工作的代码。

EDIT2:

您的选择器也适用于multiple选择器选项:JSFiddle

EDIT3:

我想我终于明白了问题所在 - 因为你在select元素中有多个选择,你必须首先选择<select>元素,然后然后检查是否存在至少有一个有效的选择。

$('.selectpicker:not("#Fresher, #Simple, #Advanced")').each(function (idx, selectEl) {
    var $selectEl = $(this);

    var isValid = false;
    $selectEl.find(":selected").each(function (idx2, optionEl) {
        var $optionEl = $(this);

        if ($optionEl.val()) {
            isValid = true;

            // This will break the loop on first valid element
            return false;
        }
    });

    console.log("isValid: ", isValid);
    // rest of your code
});

当然,您的验证逻辑可能不同(例如,您希望所有选项有效),但我认为您应该能够自行修改它。

答案 1 :(得分:0)

您的复选框是否包含.selectpicker类或者是.selectpicker的子项? 因为您要选择每一个:在.selectpicker之后选择以下。

答案 2 :(得分:0)

$(&#39; .selectpicker:not(&#34; #Fresher,#Simple,#Advanced&#34;):selected&#39;)。each(function(i,sel){

});

这可以解决您的问题。

答案 3 :(得分:0)

发布的建议/答案没有按照问题要求工作,因此我必须使用UPDATE-2 alertnative找到一些其他方法,根据需要使用[ bingo ]。希望这也可以帮助其他人!!

应排除ID元素

var codes = ["Fresher", "Simple", "Advanced"];

修改了jquery

$('.selectpicker').each(function(i, sel){           
    var idname = $(sel).closest('.selectpicker').attr('id');
    if($.inArray(idname, codes) == -1)
    {
        if (!$(idname).val()){
            $(this).closest("div:has(label)").find(".bootstrap-select").removeClass('formvalid').addClass('formerror'); 
            $(this).closest("div:has(label)").find("span.validation").removeClass('valid').addClass('error');
        }else{
            $(this).closest("div:has(label)").find(".bootstrap-select").removeClass('formerror').addClass('formvalid');
            $(this).closest("div:has(label)").find("span.validation").removeClass('error').addClass('valid');           
        }
    }
});

现在使用上面的代码,我们可以在多个页面上更灵活地忽略某些ID。

感谢大家的帮助。特别是 @mdziekon