访问jQuery .each()循环之外的变量

时间:2014-11-05 06:23:29

标签: javascript jquery html

我有一点点复杂的html结构。 我解析它来得到这些东西:

Option1: value
Option2: value

就像html:

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

但是,我希望在.each()循环之外得到Opt01和Opt02。我怎么能这样做?

5 个答案:

答案 0 :(得分: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 :(得分:0)

只需在每个循环外声明变量。在函数内声明的变量只能从内部访问。 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);
}

答案 2 :(得分:0)

  

我希望在.each()循环之外得到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();

答案 3 :(得分:-1)

这很简单,
您必须将函数外部的变量声明为全局变量 但是不要只声明,指定一些值
Var opt1 = 0;

答案 4 :(得分:-1)

谢谢你们。到目前为止,我已经在循环和代码之前添加了另一个验证规则。它工作正常:

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/