javascript函数参数的值如何在页面请求中保持不变?
我正在调查我继承的一个站点中的一个bug,我的调查提出了一个有趣的javascript范围问题。下面的代码已简化为仅显示相关详细信息 下面的通用服务存在一个问题,即它有时在注销后不返回任何数据(当然,仅在生产环境中)。当这种情况发生时,我们看到ApplyToolbarBindings的“data”参数不是null或空对象——它实际上是由上一个页面请求中的状态生成的。该对象的状态通过asp.net回发得以保留,换句话说,其净效果是,即使在用户注销后,工具栏仍显示“已知”用户javascript函数参数的值如何在页面请求中保持不变?,javascript,asp.net,ajax,scope,Javascript,Asp.net,Ajax,Scope,我正在调查我继承的一个站点中的一个bug,我的调查提出了一个有趣的javascript范围问题。下面的代码已简化为仅显示相关详细信息 下面的通用服务存在一个问题,即它有时在注销后不返回任何数据(当然,仅在生产环境中)。当这种情况发生时,我们看到ApplyToolbarBindings的“data”参数不是null或空对象——它实际上是由上一个页面请求中的状态生成的。该对象的状态通过asp.net回发得以保留,换句话说,其净效果是,即使在用户注销后,工具栏仍显示“已知”用户 function Ap
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对象状态不变吗?这与JavaScript作用域无关;页面加载之间不存在范围这样的事情 您会发现浏览器(或用户和服务器之间的某个设备)正在将AJAX请求缓存到
'/Services/Toolbar/ToolBarService.ashx?v='+toolbarV
您可以通过使用(有效地向URL添加一个随机字符串以停止缓存)或通过发出正确的
缓存控制
头(无缓存
)来解决此问题。这与JavaScript作用域无关;页面加载之间不存在范围这样的事情
您会发现浏览器(或用户和服务器之间的某个设备)正在将AJAX请求缓存到'/Services/Toolbar/ToolBarService.ashx?v='+toolbarV
您可以通过使用(有效地将随机字符串添加到URL以停止缓存)或通过发出正确的
缓存控制
头(无缓存
)来解决此问题。在大多数服务器上,您都有会话、应用程序和请求范围。这意味着,js作用域在请求作用域之下的某个位置,因为它在设置请求并获得响应后存在很短时间
如果您想要一个作用域值,可以使用模板系统和bean。(速度、JSF或其他)。如果不是
你可以用饼干
/**
* 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);
}
}
}
/**
*删除cookie
**/
函数deleteCookie(c_名称){
现在=新日期();
document.cookie=c_name+“=;expires=“+now.togmString();
}
/**
*设置一个cookie
**/
函数setCookie(c_名称、值、exdays){
var exdate=新日期();
exdate.setDate(exdate.getDate()+exdays);
var c_value=escape(value)+(exdays==null)?“”:“expires=“+exdate.toutString());
document.cookie=c_name+“=”+c_值;
}
/**
*返回包含未切换内容的cookie值
**/
函数getCookie(c_名称){
变量i,x,y,ARRcookies=document.cookie.split(“;”);
对于(i=0;i,在大多数服务器上,您都有会话、应用程序和请求作用域。这意味着,js作用域在请求作用域之下的某个位置,因为它在设置请求并获得响应后存在很短时间
如果你想要一个限定范围的值,你可以使用一个模板系统和bean(velocity,JSF或者其他任何东西)
你可以用饼干
/**
* 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);
}
}
}
/**
*删除cookie
**/
函数deleteCookie(c_名称){
现在=新日期();
document.cookie=c_name+“=;expires=“+now.togmString();
}
/**
*设置一个cookie
**/
函数setCookie(c_名称、值、exdays){
var exdate=新日期();
exdate.setDate(exdate.getDate()+exdays);
var c_value=escape(value)+(exdays==null)?“”:“expires=“+exdate.toutString());
document.cookie=c_name+“=”+c_值;
}
/**
*返回包含未切换内容的cookie值
**/
函数getCookie(c_名称){
变量i,x,y,ARRcookies=document.cookie.split(“;”);
对于(i=0;唯一的方法是通过Get请求将您需要的任何值发送到目标页面。唯一的方法是通过Get请求将您需要的任何值发送到目标页面。一位同事给了我几乎相同的答案,Matt。谢谢。我们启用了ajax缓存。一位同事给了我几乎相同的答案,Matt。谢谢。我们确实有已启用ajax缓存。