2011-05-19 125 views
0

我有一個函數,它需要一個參數(key)從cookie中檢索它的值。我在任何需要特定位信息的地方稱此功能。除了一切都以Undefined形式返回。函數不返回變量

//before $(document).ready(); 
var keyval = ""; //VARIABLE FOR PASSING COOKIE VALUE 
var getCookieVal =function(c_name){ 
var cleanCookie = document.cookie.substr(0, document.cookie.indexOf("; __utma="));//REMOVES EXTRA INFORMATION 
var cookieArr = cleanCookie.split(";");//MAKES AN ARRAY OF EACH PAIR 
    $.each(cookieArr, function(index, val){ 
     var valArr = val.split("=");//SPLITS THE KEY VALUE PAIR INTO AN ARRAY 
     var key = valArr[0]; 
     keyval = valArr[1]; 
     if (key == c_name){ 
      alert(keyval);//ALERTS CORRECT ANSWER 
      return keyval; 
     } 
    }); 
    console.log(keyval);//RETURNS UNDEFINED 
} 

//IN ANOTHER FILE I CALL THE FUNCTION: 
$(document).ready(function(){ 
    getCookieVal("username"); 
    alert(keyval);//RETURNS UNDEFINED 
}); 

任何人都知道我做錯了什麼或我如何獲得該值?

+1

您的代碼是不正確縮進這使得它更難閱讀。請糾正這一點。 – 2011-05-19 13:41:15

+0

對不起,新來堆棧溢出。仍然找出代碼區域。儘管我被告知把我的第一支架放在下一行。舊的習慣,我猜。 – 2011-05-19 14:03:00

+0

您可以將您的JavaScript代碼複製到[jsFiddle](http://jsfiddle.net),然後單擊「TidyUp」按鈕以正確格式化代碼。然後只需將結果代碼複製粘貼到您的問題中,選擇它並單擊「代碼示例」圖標。 – 2011-05-19 14:07:24

回答

2

在這裏你去:

var getCookieVal = function(key) { 
    var coo = document.cookie; 
     arr = coo.substr(0, coo.indexOf('; __utma=')).split(';'), 
     value; 
    $.each(arr, function(i, v) { 
     var valArr = v.split('='); 
     if (valArr[0] === key) { 
      value = vallArr[1]; 
      return false; 
     }    
    }); 
    return value; 
}; 

$(document).ready(function() { 
    var keyval = getCookieVal('username'); 
    alert(keyval); 
}); 

所以你return false的,如果分支內(一旦你找到想要的值),以擺脫$.each循環。然後,你只需要return valuegetCookieVal函數。

請注意,有不需要定義一個全局keyval變量在這裏。

+0

就是這樣!昨天我正在爲此工作幾個小時。從來沒有想過要跳出循環。乾杯! – 2011-05-19 14:08:40

1

這條線:從您傳遞給$.each,而不是從你的getCookieVal功能匿名函數

return keyval; 

...回報。

0

你需要return false才能打破你的循環。否則,循環繼續並覆蓋keyval。您正在返回keyval,這不會中斷循環。改爲false,你應該很好。

0

您的代碼可以被減小到這個(假設getCookieVal的呼叫者被信任)

function getCookieVal(name) 
{ 
    var pattern = new RegExp('(?:^|;)' + name + '=([^;]*)', 'i'), 
     matches = pattern.exec(document.cookie); 
    return matches ? matches[1] : null; 
} 

$(document).ready(function() { 
    var keyval = getCookieVal('username'); 
    alert(keyval); 
});