以下是我的代码..
HTML代码
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="body">
<div class="dropdown_div">
<select id="q_type" class="dropdown" onchange="getSubject(this.value)">
<option>Question1</option>
<option>Question2</option>
</select>
</div>
<div class="dropdown_div">
<select id="q_subject" class="dropdown">
<option>Subject1</option>
</select>
</div>
</div>
JS代码
function getSubject(val){
$("option", $("#q_subject")).remove();
var option = "<option>Subject</option>";
$("#q_subject").append(option);
$.ajax({
url: "api.path",
type: 'POST',
dataType: 'json',
data: {id: id},
async: true,
cache: false,
success: function(response) {
alert("Hi");
$("option", $("#q_subject")).remove();
var option = "<option>Subject1</option>";
option += "<option value=1234>Subject2</option>";
$("#q_subject").append(option);
}
});
}
如何在我的代码中使用pushState,让用户点击后退按钮返回最后一页,然后仍然可以看到ajax数据?
答案 0 :(得分:5)
首先,您应该将从ajax请求收到的数据保存到浏览器local storage
。之后,为了在触发浏览器“后退”按钮时显示ajax结果,您应该将您在ajax.success()
方法中调用的语句绑定到窗口onpopstate
事件。要省略代码重复,最好使用声明的函数而不是匿名函数。
function success(response) {
alert("Hi");
$("option", $("#q_subject")).remove();
var option = "<option>Subject1</option>";
option += "<option value=1234>Subject2</option>";
$("#q_subject").append(option);
}
将数据保存到localstorage
并调用success
功能:
$.ajax({
url: "api.path",
type: 'POST',
dataType: 'json',
data: {id: id},
async: true,
cache: false,
success: function(response) {
localStorage.setItem("response", response);
success(response);
}
});
当“后退”按钮被触发时调用success()
:
window.onpopstate = function (e) {
var res = localStorage.getItem('response');
success(res);
}
答案 1 :(得分:2)
我建议您使用在浏览器窗口关闭时过期的sessionStorage:)
$.ajax({
url: "api.path",
type: 'POST',
dataType: 'json',
data: {id: id},
async: true,
cache: false,
success: function(response) {
sessionStorage.setItem("DataSaved", response);
success(response);
}
});
然后
window.onpopstate = function (e) {
var res = sessionStorage.getItem('DataSaved');
success(res);
}
答案 2 :(得分:1)
您可以使用本地存储或会话存储来解决此问题。您还需要有一个onload函数回调,以检查是否存在您存储在本地/会话存储中的任何先前值,如果是,则在选择框中显示该数据。
答案 3 :(得分:0)
我通过在$ .get()函数
之前包含以下代码解决了这个问题 $.ajaxSetup({cache: false});
有效!试试吧:))
答案 4 :(得分:0)
在使用Ajax从JavaScript生成的图表中导航MVC-5应用程序时,我注意到了Back()问题。图中的所有单击均由Ajax处理。
以上解决方案不会替换整个主体,在修复的情况下,Back()将仅恢复编辑字段。就我而言,我不需要。我需要从AJAX替换整个页面,并且还启用“后退”按钮以返回到原始图上下文。
我尝试了上述解决方案来替换正文,但我必须注意,它将仅在触发后触发window.pop事件
history.pushState({}, '')
但是当事件触发并使用Ajax填充正文时,我的Javascript无法正确地重新初始化图表页面。
我决定使用另一种模式来规避window.pop事件并避免回发。下面的代码不会返回到Ajax代码上下文,而只是替换当前页面,将来自服务器(= Controller)的Ajax返回信息作为重定向链接进行处理,例如
var url = "/ProcessDiagram/MenuClick?command=" + idmenuparent+"_"+citem; // my Ajax
$.get(url,
function (data) {
window.location = data; // Server returns a link, go for it !
return true; // Just return true after going to the link
});
..这将保留Back()上下文,因为浏览器将处理所有事情。
控制器端组成重定向链接,例如
public ActionResult MenuClick(string command)
{
List<string> sl = command.Split(new char[] {'_'}).ToList();
var prId = int.Parse(sl[0].Substring(3));
if (sl[1] == "PU")
return Content("/ProductionUnitTypes/Details/" + UnitContextId(prId) );
if (sl[1] == "IR")
return Content("/ItemRoles/Details/" + RoleContextId(prId) );
// etcetera
}