2011-11-16 57 views
0

範圍當我改變的第一個複選框,我想改變VAR theSame,但似乎並不在if(theSame == 1); 改變,但它在alert("b"+theSame)變化。如何處理這個?關於在JavaScript

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(document).ready(function(){ 
      var theSame = 1; 
      $("input[name='thesame']").change(function(){ 
       theSame = $(this).is(":checked") ? 1 : 0; 
       alert("a"+theSame); 
      }); 
      if(theSame == 1){ 
       $(".check_list input").change(function(){ 
        alert("b"+theSame); 
       }); 
      } 
     }); 
    </script> 
</head> 
<body> 
<input type="checkbox" name="thesame">same 
<br> 
<div class="check_list"> 
    <input type="checkbox" name="son">ppp 
    <input type="checkbox" name="son">ppp 
    <input type="checkbox" name="son">ppp 
</div> 
</body> 
</html> 

謝謝你,這是我想要實現:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(document).ready(function(){ 
     $("input[name='thesame']").change(function(){ 
     var theSame = this.checked ? 1 : 0; 
     show(theSame) 
     }); 
     function show(i){ 
      if(i == 1){ 
      $(".check_list input").change(function(){ 
      var inputName = $(this).attr("name"); 
      $("input[name=" + inputName + "]").attr("checked",this.checked) 
      }); 
     }else{ 
      $(".check_list input").unbind("change") 
      } 
     } 
}); 
    </script> 
</head> 
<body> 
<input type="checkbox" name="thesame" class="check-all">same 
<br> 
<div class="check_list"> 
    <input type="checkbox" name="son">ppp 
    <input type="checkbox" name="sister">ppp 
    <input type="checkbox" name="dog">ppp 
</div> 
<hr> 
<div class="check_list"> 
    <input type="checkbox" name="son">ppp 
    <input type="checkbox" name="sister">ppp 
    <input type="checkbox" name="dog">ppp 
</div> 
<hr> 
<div class="check_list"> 
    <input type="checkbox" name="son">ppp 
    <input type="checkbox" name="sister">ppp 
    <input type="checkbox" name="dog">ppp 
</div> 

</body> 
</html> 
+0

附註 - 不要使用'$(this).is(「:checked」)'。你可以使用'this.checked',它* *更快*表示*和*更易於閱讀。 [一個很酷的技巧,你可以使用](http://stackoverflow.com/questions/61088/hidden-features-of-javascript/2243631#2243631)這裏是'+ this.checked'而不是'this.checked? 1:0'。 –

+0

你期待什麼發生? 'if(theSame == 1){'將始終運行,因爲您剛剛將'theSame'設置爲1。 –

回答

2

這不是真正的範圍問題,但更多的不同步。讓我們一步步跟蹤代碼:

$(document).ready(function(){ 
    // Define function-scope variable `theSame`, assign it a value of `1` 
    var theSame = 1; 

    // Bind a `change` event handler to an element, this function will run later! 
    $("input[name='thesame']").change(function(){ 
     theSame = +this.checked; 
     alert("a"+theSame); 
    }); 

    // At this point, `theSame` has not changed from its original value! 
    if(theSame == 1){ 
     $(".check_list input").change(function(){ 
      // Here, however, `theSame` may have had its value changed 
      alert("b"+theSame); 
     }); 
    } 
}); 

所以,你可以看到,當if聲明運行時,它總是會有1的值,因爲該值不會改變,直到後來,這個代碼後已是執行。

如果將if聲明的事件處理中,你會看到不同的結果:

$(".check_list input").change(function(){ 
    if(theSame){ 
     alert("b"+theSame); 
    } 
}); 

在這裏,你會看到的只是警告,如果theSame1

+0

感謝您的回答!我嘗試將if移動到事件中,但是當我切換點擊第一個複選框(在我的項目中,這是必須的),然後單擊其他複選框一次,它會提醒雙倍以及更多... – Rupert

+0

@user:聽起來像你複製了事件綁定以及「if」語句放入'change'函數中,所以每次運行它都會再次綁定事件。你可能不想這樣做。 –

+0

是的,我終於做到了 – Rupert