2013-03-10 235 views
-1

我在多個地方使用以下JS代碼;jQuery設置全局變量

$(this).attr("name") 

我在不同的地方使用它;

var currentKey = $(this).attr("name"); 
currentKeyVal = retrievedUserDataObj[$(this).attr("name")]; 
currentKeyVal = UserDataObj[$(this).attr("name")]; 

現在我的問題是有可能以某種方式使它作爲全局變量,以便上述代碼不重複?

我不確定它是否因爲$(this)而變成gloabl?

編輯 實際/優化代碼;

function setFormFieldValues() 
{ 
var currentKey,currentKeyVal; 
    if (supports_html5_storage()) 
    { 
    var retrievedUserDataObj = JSON.parse(localStorage.getItem('UserDataObj')); 
    localStorageSupport = true; 
    } 

    $(".formFieldUserData").each(function(){ 
     var $this = $(this); 
     currentKey = $this.attr("name"); 
     currentKeyVal = UserDataObj[currentKey]; //Set with default values initially 

     if (localStorageSupport) 
     { 
      if(retrievedUserDataObj) //called when there are some values in localStorage 
       currentKeyVal = retrievedUserDataObj[currentKey]; 
     } 
     else 
     { 
      if ($this.val() != "") 
       currentKeyVal = $this.val(); 
     } 

     $("#"+currentKey).val(currentKeyVal); //Input text box 
     $("#"+currentKey+"Txt").html(currentKeyVal); // Form label 
    }) 
} 
+0

我想你可以這樣做'window.foo = $(this)'。但js中的'this'真的不同。我認爲你需要提供更多的上下文。 – jagttt 2013-03-10 14:52:35

+0

鑑於'this'的上下文取決於代碼中的位置,將它變爲全局變量有什麼意義?這隻會在不太可能發生的情況下有意義,即this在任何情況下都指向*非常相同的元素。 – Boaz 2013-03-10 14:52:36

回答

0

只用一個函數來做這個處理可能更容易;我不知道爲什麼currentKeyVal被定義了兩次:在註釋中描述

getCurrentKeys(this); 

更新添加優化:

function setFormFieldValues() 
{ 
    var currentKey,currentKeyVal; 
    if (supports_html5_storage()) 
    { 
    var retrievedUserDataObj = JSON.parse(localStorage.getItem('UserDataObj')); 
    localStorageSupport = true; 
    } 

    $(".formFieldUserData").each(function(){ 
     var $this = $(this); 
     currentKey = $this.attr("name"); 
     currentKeyVal = UserDataObj[currentKey]; //Set with default values initially 

     if (localStorageSupport) 
     { 
      if(retrievedUserDataObj) //called when there are some values in localStorage 
       currentKeyVal = retrievedUserDataObj[currentKey]; 
     } 
     else 
     { 
      if ($this.val() != "") 
       currentKeyVal = $this.val(); 
     } 

     $("#"+currentKey).val(currentKeyVal); //Input text box 
     $("#"+currentKey+"Txt").html(currentKeyVal); // Form label 
    }); 
} 

// define outside the function to make them global 
var currentKey, currentKeyVal; 

function getCurrentKeys(element){ 
    currentKey = $(element).attr("name"); 
    currentKeyVal = retrievedUserDataObj[currentKey]; 
    currentKeyVal = UserDataObj[currentKey]; 
} 

如下使用它,您可以使用更多地優化代碼0,但這會讓閱讀變得更加困難。

+0

Thx ...我已經用實際的代碼編輯了原始問題....所以你可以更好地理解爲什麼我已經完成了我編碼的方式... – testndtv 2013-03-10 15:02:59

+0

嗯,我看到你可以做兩個優化:(1)'.each()'函數中的第一行可能是'var $ this = $(this)',並且使用它而不是重複定義這個jQuery對象。 (2)使用'currentKey'而不是'$(this).attr(「name」);'多次像我在上面的代碼示例中所做的那樣。 – Mottie 2013-03-10 15:11:56

+0

你可以請編輯我原來的問題,以便我可以更好地理解優化...同樣你也可以建議任何額外的優化,以及... – testndtv 2013-03-10 15:15:27