1

我正在遍历一个容器并寻找可能存在的元素。如果其中一个元素存在,我想将该元素的 jQuery 对象分配给一个变量。我有一个解决方案,但我不确定这是否是一个好方法。

HTML

<form>
<div>
    <label>First name</label>
    <input type="text"/>
</div>

<div>
    <label>last name</label>
    <input type="text"/>
</div>

<div>
    <label>location</label>
    <select>
        <option>USA</option>
    </select>
</div>
</form>

JS

$(document).ready(function(){
var testNum = $('form').find('label').length;
for(var i=0; i<testNum; i++) {
    var currentTest = $('form').find('label').eq(i).parent().find('input').length ? $('form').find('label').eq(i) : false || $('form').find('label').eq(i).parent().find('select').length ? $('form').find('label').eq(i) : false;
    $('html').append(currentTest.text() + '<br/>');
}
});

编辑:更新的小提琴和问题

http://jsfiddle.net/PMtZB/1/

4

2 回答 2

2

您循环的方式效率低下。您应该使用该.each()方法,如下所示:

$('form').find('label').each(function() {
    var $label = $(this); // $label is a jQuery object that refers to the label element.


    ...
});

你这样做的方式是重复调用.find()同一个选择器。

编辑问题后的更新:

先说两点:

  1. 如果你用文字而不是代码来说明你想要的元素,那将会很有帮助。我假设您想要所有<label>后跟 an<input>或 a 的元素<select>
  2. 你应该使用括号。我查了一下,逻辑或运算符的优先级高于条件运算符,条件运算符具有从右到左的关联性。我认为您需要添加括号,以便您的语句如下所示(c1 ? a1 : a2) || (c2 ? b1 : b2):没有括号,你有c1 ? a1 : ((a2 || c2) ? b1 : b2).

您可以尝试添加 KD 建议并连接 jQuery 包装集:

$(document).ready(function() {

    var $matchingLabels = $();

    $('form').find('label').each(function() {
        var $label = $(this);
        if ($label.next().is('input, select')) {
            $matchingLabels.add($label);
        }
    });

    // At this point $matchingLabels holds the labels you want.
});

您也可以尝试使用“prev + next”选择器:

$(document).ready(function() {

    var $matchingLabels = $('form').find('label + input, label + select').prev();

});

当然,如果你不能假设<input>and<select>元素总是紧跟在<label>元素后面,你将不得不使用第一个选项并修改 if 语句。

于 2013-03-01T17:45:46.333 回答
1
$(document).ready(function(){
    var testNum = $('form').find('label').length;

    $('form').find('label').each(function(){
        if($(this).next().is("input") || $(this).next().is("select"))
        {
           $('html').append($(this).text() + '<br/>');
        }
    });

});

将此代码粘贴到您的小提琴中并测试..

于 2013-03-01T17:39:20.127 回答