2012-05-04 18 views
1

我正在尋找我繼承的網站中的錯誤,並且我的調查提出了一個有趣的JavaScript範圍問題。下面的代碼已被簡化,只顯示相關的細節。javascript函數參數的值如何在頁面請求中存活?

下面的通用服務有一個問題,它有時在註銷後沒有返回任何數據(當然只在生產環境中)。當發生這種情況時,我們看到ApplyToolbarBindings的「data」參數不是null或者是一個空對象 - 它實際上是從前一個頁面請求的狀態提供的。該對象的狀態通過asp.net回發存活,換句話說,最終效果是工具欄即使在註銷後也顯示「已知」用戶。

function ApplyToolbarBindings(data) { 
    if (!data.IsKnown) { 
     jQuery("#ToolBar").attr("data-bind", 'template: { name: "AnonymousUserToolbarTemplate" }'); 
    } else { 
     jQuery("#ToolBar").attr("data-bind", 'template: { name: "KnownUserToolbarTemplate" }'); 
    } 
    ko.applyBindings(data, document.getElementById('ToolBar')); 
} 
function GetToolBarData(callbackFunction) { 
    jQuery.ajax({ 
     url: '/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV, 
     success: callbackFunction, 
     dataType: 'json', 
     type: 'GET' 
    }); 
} 
function loadToolbar() { 
    GetToolBarUserData(ApplyToolbarBindings); 
} 
jQuery(function() { loadToolbar(); }); 

什麼是當該功能已在全球定義的參數傳遞給函數的生命週期?這種行爲是因爲沒有數據返回時,ajax對象的狀態是不變的?

+0

唯一的辦法是通過獲取請求發送任何值到目標頁面。 – KBN

回答

4

這不是JavaScript範圍相關的;有沒有這樣的事情作爲範圍之間的頁面加載。

您會發現瀏覽器(或用戶和服務器之間的某個設備)將AJAX請求緩存到'/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV

可以解決這個問題,通過使用the cache: falsejQuery.ajax option(這有效地增加了一個隨機字符串的URL阻止它被緩存),或通過發出正確Cache-Control頭(no-cache)。

+0

一位同事給了我幾乎相同的答案,馬特。謝謝。我們確實啓用了ajax緩存。 – Stuart

0

在大多數服務器上,您擁有會話,應用程序和請求範圍。這意味着,js作用域在請求範圍之下,因爲它在請求被設置後存在很短的時間,並且你得到了你的迴應。

如果你想要一個範圍值,你可以使用模板系統和bean。 (速度,JSF或其他)。如果沒有...

您可以使用cookies!

/** 
* deletes a cookie 
**/ 
function deleteCookie(c_name) { 
    now = new Date(); 
    document.cookie=c_name+"=; expires="+now.toGMTString(); 
} 

/** 
* sets a cookie 
**/ 
function setCookie(c_name,value,exdays) { 
    var exdate=new Date(); 
    exdate.setDate(exdate.getDate() + exdays); 
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString()); 
    document.cookie=c_name + "=" + c_value; 
} 

/** 
* Returns the cookie Value with unescaped content 
**/ 
function getCookie(c_name) { 
    var i,x,y,ARRcookies=document.cookie.split(";"); 
    for (i=0;i<ARRcookies.length;i++) { 
     x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); 
     y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); 
     x=x.replace(/^\s+|\s+$/g,""); 
     if (x==c_name) { 
      return unescape(y); 
     } 
    } 
} 
相關問題