我正在修改现有代码,因此只能影响存在的元素,而不能正确构建它。我正在遍历所有具有类reqd的spans,如果是这样,我要么是直接上一个同级(示例1),要么是上一个同级类型输入的第一个孩子(示例2),然后将jQuery validate属性附加到它。

例如,使用prev()是#1,这很容易。我必须在示例2和3中使用prevUntil()来更好地隔离以DOM为目标的位置。

我的问题与示例2有关。虽然可以到达class="regfieldlabel,但我无法遍历其子级。示例3与示例2相似,只是中间有一个空的span标签。

//Example code 1
<input type="text" name="str_cvv" value="" maxlength="3" size="4" id="CVV">
<span class="reqd">*</span>

//Example code 2
<span class="regfieldlabel">
      <input type="text" name="nameOnCard" size="30" maxlength="50" id="cardName" value="">
</span>
<span class="reqd">*</span>

//Example code 3
<span class="regfieldlabel">
      <input type="text" name="nameOnCard" size="30" maxlength="50" id="cardName" value="">
</span>
<span class="regfieldlabel"> </span>
<span class="reqd">*</span>

<script>
$(function() {
    $("span").each(function(){
        //Highlight all fields that have a red asterisk at the end for validation
        if ($(this).hasClass('reqd')) {
            $(this).prev().attr('data-rule-required', true).attr('data-msg-required', 'This field is required');
            $(this).prevUntil('.regfieldlabel').find('input').attr('data-rule-required', true).attr('data-msg-required', 'This field is required');

        }
    });
});
</script>

最佳答案

您不想使用prevUntil,在docs中您将看到:


描述:获取每个元素之前的所有同级元素,但不包括
包括与选择器,DOM节点或jQuery匹配的元素
宾语。


结果,$(this).prevUntil('.regfieldlabel')实际上为空。

对于示例2,您仍然只想使用prev

$(this).prev('.regfieldlabel').find('input')




对于一般的解决方案,您将必须检查自己所处的情况,以执行正确的操作:

$("span.reqd").each(function(){

    var $this = $(this);
    var $prev = $this.prev();
    var $input = $([]); // init to empty

    if($prev.is("input")){
        // EXAMPLE 1
        $input = $prev;

    } else if($prev.is(".regfieldlabel")){
        var $innerInput = $prev.find("input");

        if($innerInput.length > 0){
            // EXAMPLE 2
            $input = $innerInput;
        } else {
            $prev = $prev.prev(".regfieldlabel");
            $innerInput = $prev.find("input");

            if($innerInput.length > 0){
                // EXAMPLE 3
                $input = $innerInput;
            } else {
                // unknown case, maybe do something here
            }
        }
    } else {
        // unknown case, maybe do something here
    }

    $input.attr('data-rule-required', true).attr('data-msg-required', 'This field is required');

});


http://jsfiddle.net/DVSeg/2/

关于javascript - 在jQuery中查找先前同级的子级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22644599/

10-11 13:40