2013-10-29 58 views
0

更新的jsfiddle:http://jsfiddle.net/leongaban/NmH97/按鈕變量作用域 - 如何更新父範圍中的變量? jQuery的

在我的主要功能是一個按鈕狀態修正功能和幾個點擊功能。

在更新父函數中的布爾值時有點麻煩。我可以通過使用全局變量來解決這個問題,但我知道在這裏我不需要這樣做。

在下面的函數中,當單擊#toggle_company時,我將bool公司(默認設置爲true)傳遞給setupToggleButtons函數。然後切換當前狀態,但原始company布爾值不變,您將如何編寫此目標並更新父函數wireSearchIcons中的變量公司?

var wireSearchIcons = function() { 

    // Boolean Flags 
    var company = true; 
    var phone = true; 

    var orange_on = '#F37B21'; var orange_off = '#f3cdb1'; 
    var green_on = '#3DB54A'; var green_off = '#d8e0c3'; 

    // Other code... 

     $("#toggle_company").unbind('click').bind('click', function() { 
      setupToggleButtons(company, '#toggle_company path', orange_on, orange_off); 
     }); 

     function setupToggleButtons(bool, path, on, off) { 

      var path = $(path); 
      if (bool) { 
       path.css('fill', off); 
       bool = false; 
       return bool; 
      } else { 
       path.css('fill', on); 
       bool = true; 
       return bool; 
      } 

      console.log(bool); 
     } 
} 
+0

您是否嘗試在您的setupToggleButtons()函數中說'company = false'或'company = true'? –

+0

是的,如果我使用公司,它工作正常,如果我使用布爾它只能第一次點擊,不會'重置'在第二次點擊。 –

+0

將代碼發佈到已修改的jsfiddle:http://jsfiddle.net/leongaban/NmH97/ –

回答

1

當您在函數調用中使用變量時,您將發送變量包含的值,而不是變量本身。更改參數對值來自的變量沒有影響。

JavaScript不支持參考發送參數,所以只是從函數返回值,並將其分配回變量:

$("#toggle_company").unbind('click').bind('click', function() { 
     company = setupToggleButtons(company, '#toggle_company path', orange_on, orange_off); 
    }); 

    function setupToggleButtons(bool, path, on, off) { 

     var path = $(path); 
     if (bool) { 
      path.css('fill', off); 
      bool = false; 
     } else { 
      path.css('fill', on); 
      bool = true; 
     } 

     return bool; 
    } 
+0

啊雖然這可以工作,但仍然存在相同的問題。現在設置一個jsFiddle ... –

+0

這是我有:http://jsfiddle.net/leongaban/NmH97/ –

+0

AH!忘記更新我公司的價值bool! '公司= setupToggleButtons(公司,'#toggle_company路徑',orange_on,orange_off);'現在工作,謝謝:) –

0

它沒有意義的寫一個setupToggleButtons功能這麼少。您應該將代碼嵌入到點擊處理程序中,或者在設置功能中創建點擊處理程序。

var wireSearchIcons = function() { 

    // Flags 
    var company = true; 
    var phone = true; 

    var orange_on = '#F37B21'; var orange_off = '#f3cdb1'; 
    var green_on = '#3DB54A'; var green_off = '#d8e0c3'; 

    // Toggle Button States 
    $("#toggle_company").unbind('click').bind('click', function() { 
     company = !company; 
     $('#div_company').css('background', company ? orange_on : orange_off); 
    }); 
    $("#toggle_phone").unbind('click').bind('click', function() { 
     phone = !phone; 
     $('#div_phone').css('background', phone ? green_on : green_off); 
    }); 

} 

wireSearchIcons();