javascript函数参数的值如何在页面请求中存活?

时间:2012-05-04 13:41:32

标签: javascript asp.net ajax scope

我正在查看我继承的网站中的一个错误,我的调查提出了一个有趣的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对象状态是不变的吗?

2 个答案:

答案 0 :(得分:4)

这不是与JavaScript范围相关的;没有诸如页面之间的范围负载。

您会发现浏览器(或用户与服务器之间的某些设备)正在将AJAX请求缓存到'/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV

您可以使用the cache: false jQuery.ajax option(有效地向URL添加随机字符串以阻止其被缓存)或通过发出正确的Cache-Control标题(no-cache)来解决此问题。

答案 1 :(得分: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);
        }
    }
}