1

我正在调查我继承的网站中的一个错误,我的调查提出了一个有趣的 javascript 范围问题。下面的代码已经过简化,只显示相关细节。

下面的通用服务有一个问题,它有时在注销后不返回任何数据(当然,仅在生产中)。发生这种情况时,我们会看到 ApplyToolbarBindings 的“数据”参数不是 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对象状态没有改变吗?

4

2 回答 2

4

这与 JavaScript 范围无关;没有页面加载范围之类的东西。

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

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

于 2012-05-04T13:49:23.123 回答
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);
        }
    }
}
于 2012-05-04T13:53:50.513 回答