2014-11-05 64 views
2

我有一點點複雜的html結構。 我解析它來獲得這些東西:從這個像HTMLjQuery .each()循環之外的訪問變量

Option1: value 
Option2: value 

<div class="option" id="option-691"> 
<span class="required">*</span> 
<b>Option:</b><br> 
<input type="radio" checked="" id="option-value-1250" value="1250" price="1156.0000" name="option[691]"> 
<label for="option-value-1250">2,35 xx - 1156.00 </label> 
<br> 
<input type="radio" onchange="recalculateprice();reloadpr();" id="option-value-1251" value="1251" price="506.0000" price_prefix="" points="0" name="option[691]"> 
<label for="option-value-1251">900 xx - 506.00</label> 
<br> 
</div> 

這也太

<div class="option" id="option-690"> 
<span class="required">*</span> 
<b>Option:</b><br> 
<select name="option[690]"> 
<option price="1156.0000" price_prefix="+" points="0" value="1249">value01 
(+1156.00) 
</option> 
<option price="1156.0000" price_prefix="+" points="0" value="1248">value02 
(+1156.00) 
</option> 
<option price="1156.0000" price_prefix="+" points="0" value="1247">value03 
(+1156.00) 
</option> 
</select> 
</div> 

並使用此我可以從兩種類型的數據(輸入+選擇)。

$('#product_options > div.option').each(function() { 
var Opt01 = ($(this).find('option:selected').parent().parent().find('b').text() + $(this).find('option:selected').text()); 
var Opt02 = ($(this).find('input:checked').parent().find('b').text() + $(this).find('input:checked').next().text()); 

console.log(Opt01); 
console.log(Opt02); 
}); 

但是,我想讓Opt01和Opt02在.each()循環之外。我如何做到這一點?

+0

究竟是什麼你想實現什麼? – undefined 2014-11-05 06:25:53

+0

簡而言之,我只想獲取位於不同元素中的選中值。 – user4217275 2014-11-05 20:49:07

回答

2

在函數中聲明的變量不能在其外部訪問。只需在循環外聲明它們:

var Opt01; 
var Opt02; 

$('#product_options > div.option').each(function() { 
    Opt01 = ($(this).find('option:selected').parent().parent().find('b').text() + $(this).find('option:selected').text()); 
    Opt02 = ($(this).find('input:checked').parent().find('b').text() + $(this).find('input:checked').next().text()); 

    console.log(Opt01); 
    console.log(Opt02); 
}); 
1

只需在每個循環之外聲明該變量即可。函數內聲明的變量只能從內部訪問。 JsFiddle

var Opt01, Opt02; 
function find(){ 
    $('#product_options > div.option').each(function() { 
     var option1 = ($(this).find('option:selected').parent().parent().find('b').text() +    $(this).find('option:selected').text()); 
     var option2 = ($(this).find('input:checked').parent().find('b').text() +  $(this).find('input:checked').next().text()); 
     if(option1){ 
      Opt01 = option1; 
      console.log("inside: "+Opt01); 
     } 
     if(option2){ 
      Opt02 = option2; 
      console.log("inside: "+Opt02); 
     }    
    }); 
    console.log("outside: "+Opt01); 
    console.log("outside: "+Opt02); 
} 
+0

我正在嘗試這個,問題是 - 如果我試圖讓Opt1 + Opt2在循環之外,我只得到第一個選項,第二個變量是空的。 – user4217275 2014-11-05 06:44:05

+0

由於分配給Opt02的最後一個值爲空,因此您將獲得第二個變量爲空。更新了代碼。嘗試這個。 – Gilsha 2014-11-05 08:13:08

+0

謝謝。忘了說我需要在.each()之前做一些額外的驗證。你可以看看http://jsfiddle.net/caLj2xbe/ 正如我所想,如果我把循環放在if語句中,那麼我可以從整個if {{}}中訪問這些變量。 – user4217275 2014-11-05 20:46:57

1

我想OPT01和Opt02的。每個()循環

自變量是當地在這方面以外(通過使用VAR關鍵字),外each回調變量爲undefined。您可以在每個回調之外定義它們,例如var opt1, opt2;,但會發生什麼?在每次迭代中,值都被覆蓋並且最後的值獲勝。如果選擇器返回1個元素,則不應首先使用each

您可以定義一個函數並將值傳遞給它。

$('#product_options > div.option').each(function() { 
    var Opt1 = '...'; 
    var Opt2 = '...'; 
    doSomething(Opt1, Opt2); 
}); 

或者使用map方法,並創建對象的數組:

var options = $('#product_options > div.option').map(function() { 
    var opt01 = '...'; 
    var opt02 = '...'; 
    return { 
     opt1: opt01, 
     opt2: opt02 
    } 
}).get(); 
0

這很簡單,
您必須聲明你的函數作爲全球之外的變量。
但是不要只聲明,指定一些值
Var opt1 = 0;

0

謝謝你們。到目前爲止,我在循環之前添加了另一個驗證規則,代碼看起來像這樣。它工作正常:

if ($('#product_options div.option').length) { 
    $('#product_options > div.option').each(function() { 
//defining 
OptionTitle = $(this).find('option:selected').parent().parent().find('b').text(); 
OptionValue = $(this).find('option:selected').text(); 
InputTitle = $(this).find('input:checked').parent().find('b').text(); 
InputValue = $(this).find('input:checked').next().text(); 
// 
if (OptionTitle != '' && OptionValue != '') { 
    Opt01 = (OptionTitle + OptionValue) 
} 
if (InputTitle != '' && InputValue != '') { 
    Opt02 = (InputTitle + InputValue) 
} 
    }); 
    //get values outside the loop 
console.log('Options detected'); 
if (typeof Opt01 === 'undefined') { 
Opt01 = '' 
} 
if (typeof Opt02 === 'undefined') { 
Opt02 = '' 
} 
    console.log('Opt01 = ' + Opt01); 
    console.log('Opt02 = ' + Opt02); 
} 
else { 
console.log('Options are empty'); 
var Opt01 = ''; 
var Opt02 = ''; 
console.log('Opt01 = ' + Opt01); 
console.log('Opt02 = ' + Opt02); 
} 

此外,小提琴是這裏http://jsfiddle.net/caLj2xbe/