2013-03-01 26 views
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/

+2

http://codereview.stackexchange.com/ – j08691 2013-03-01 17:36:43

回答

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/>'); 
     } 
    }); 

}); 

將此代碼粘貼到您的小提琴和測試..

+0

這將輸出與我的代碼相同的東西,並且更乾淨,但並不真正在尋找。我需要檢查一個元素是否存在,如果存在,我需要將currentTest設置爲該元素的選擇器。我的示例代碼沒有這樣做,因爲我試圖簡化問題,並沒有意識到我做得太過分了。我會編輯我的問題。 – Dan 2013-03-01 18:04:31

2

你是循環的方式是低效的。您應該使用.each()方法,像這樣:

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


    ... 
}); 

你正在做它的方式,你一邊喊.find()爲相同的選擇。

UPDATE問題後編輯:第一

兩件事情:

  1. ,如果你說你想在的話,不僅僅是代碼哪些元素這將是有益的。我會假設你想要所有的<label>元素,其後跟<input><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. 
}); 

您也可以嘗試使用 「上一頁+下一步」 選擇:

$(document).ready(function() { 

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

}); 

中當然,如果您不能假定<input><select>元素總是緊跟在<label>元素之後,那麼您必須使用第一個選項並修改if語句。

相關問題