我正在查看我继承的网站中的一个错误,我的调查提出了一个有趣的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 :(得分: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);
}
}
}