Javascript Django jquery ajax
我目前面临的情况可能很复杂,我会花时间尽可能清楚地解释我的问题 我使用django v1.8 我有一个显示结果列表的视图,以及专用于该视图的模板,我添加了ajax方法来快速过滤当前结果。 一切正常,但只有当页面手动刷新时,ajax才被清除,我知道这是正常的,我想做的是更改浏览器的URL my file.js:Javascript Django jquery ajax,javascript,jquery,python,ajax,django,Javascript,Jquery,Python,Ajax,Django,我目前面临的情况可能很复杂,我会花时间尽可能清楚地解释我的问题 我使用django v1.8 我有一个显示结果列表的视图,以及专用于该视图的模板,我添加了ajax方法来快速过滤当前结果。 一切正常,但只有当页面手动刷新时,ajax才被清除,我知道这是正常的,我想做的是更改浏览器的URL my file.js: $(function(){ $('#filter').change(function() { $.ajax({
$(function(){
$('#filter').change(function() {
$.ajax({
type: "POST",
url: "/find/object/filter/",
data: {
'preference': $('#preference').val(),
'city': $('#hsearch').val(),
'spec': $('#mplspecialite').val(),
'mplace': $('#mplace').val(),
'filter': $('#filter').val(),
'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
},
success: searchResult,
dataType: 'html'
});
});
});
function searchResult(data, textStatus, jqXHR)
{
$('#dynamic-results').html(data);
}
Ajax view.py:
def ajax_something_search(request):
args = {}
if request.method != "POST":
raise Http404(request.method, _("Not allow method !"))
# code
# code
# code
val_url = urllib.parse.urlencode(args)
url = reverse(
'manage-core:core-search') + '?' + val_url
return HttpResponseRedirect(url)
我的搜索view.py
(我在这个视图中重定向我的所有ajax参数):
调用ajax时如何更新浏览器url?可以通过使用
history.replaceState
编辑历史记录条目,以编程方式更改浏览器url。它实际上与history.pushState
相同,只是pushState
添加了一个浏览器历史记录条目,而replaceState
修改了当前条目。我将继续执行pushState
作为一个警告,如果不是绝对需要的话,你会让自己变得更加复杂。这是因为如果有人在历史中向后导航,您必须实现修改页面的行为
历史记录
位于DOM窗口
对象下
history.pushState(someState, "some title", "page.html");
someState
是与该浏览器历史记录条目关联的对象。
e、 g.{城市:“伦敦”,伦敦:51.5072,拉脱维亚:0.1275}
第一个参数(someState
)随后在历史记录更改时触发popstate
事件时提供。另一个警告是,重新加载浏览器时,您不应依赖popstate
事件,因为它可能会或可能不会触发,具体取决于浏览器。从history.state
获取状态对象,而不依赖于正在触发的事件
中间的参数可以是空字符串,也可以是您选择的字符串,浏览器暂时忽略它
最后一个参数是要推送到浏览器历史记录中的URL,它可以是绝对的,也可以是相对的。浏览器不会加载它
更具体地说:
您可以在AJAX请求的成功回调中使用pushState
,它将请求中发送的数据推送到历史记录条目中。当用户导航回页面或重新加载页面时,可以将这些数据拉回并用于再次发送AJAX请求
如果您预计您将要做更多的工作,那么您可能需要查看浏览器中的路由库
祝你好运
你可以阅读更多关于
编辑:回复评论
<!-- language: lang-js -->
$(function(){
$('#filter').change(function() {
var relQuery = null;
// The stuff you send in your request
var reqData = {
'preference': $('#preference').val(),
'city': $('#hsearch').val(),
'spec': $('#mplspecialite').val(),
'mplace': $('#mplace').val(),
'filter': $('#filter').val(),
'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
};
// Make the query string that you need.
// Probably looks like some variant of this.
// Look at jQuery.param docs.
relQuery = "?" + $.param( reqData );
// The request
$.ajax({
type: "POST",
url: "/find/object/filter/",
data: reqData,
success: searchResult,
dataType: 'html'
});
// Change the current history entry to have that
// URL query string.
history.replaceState( {}, '', relQuery);
});
});
function searchResult(data, textStatus, jqXHR) {
$('#dynamic-results').html(data);
}
$(函数(){
$('#过滤器')。更改(函数(){
var relQuery=null;
//你在请求中发送的内容
var reqData={
“首选项”:$(“#首选项”).val(),
“城市”:$(“#hsearch”).val(),
'spec':$('mplspecialite').val(),
“mplace”:$(“#mplace”).val(),
'过滤器':$('#过滤器').val(),
'csrfmiddlewaretoken':$(“输入[name=csrfmiddlewaretoken]”)。val()
};
//生成所需的查询字符串。
//可能看起来像是这个的变体。
//查看jQuery.param文档。
relQuery=“?”+$.param(reqData);
//请求
$.ajax({
类型:“POST”,
url:“/find/object/filter/”,
数据:reqData,
成功:搜索结果,
数据类型:“html”
});
//将当前历史记录条目更改为
//URL查询字符串。
replaceState({},,,relQuery);
});
});
函数搜索结果(数据、文本状态、jqXHR){
$(“#动态结果”).html(数据);
}
Minn,谢谢!但是你看!当用户选择带有html选择标记的过滤器时,ajax过滤器上下文结果页面都能正常工作!但当他用F5或其他工具刷新页面时,ajax过滤器就会消失,这就是我的问题!我想用给定的firebug控制台日志更新url浏览器(firebug向我显示要替换的正确url),如果此url更改用户可以刷新页面!如何做到这一点?创建一个表示过滤器状态的对象,并使用该状态推送一个新的历史记录条目。在页面加载时,您应该检查与该条目关联的历史状态。如果存在,使用该对象的内容重新应用过滤器。哼!也许我理解你!看(上次请我解决我的问题)!当用户进行搜索时,其url将显示在浏览器上()确定!现在,当用户检查此页面中的SelectHTML标记时,所有工作都正常!firebug向我显示我要替换到的url(GET:这是在ajax事件调用后我要在浏览器中获取的url!好的,我想我现在明白你想要什么了。更简单地说,在ajax请求的成功回调中,使用history.replaceState({},“,queryParam)
wherequeryParam
是你的相对URL字符串,看起来像这样的?filter\u name=value&filter\u name=value
。好的!看看我发布的问题中的my file.js!我如何使用它?queryParam在哪里,我可以在哪里获取历史?你能用我的file.js修改它吗?请我的朋友!
<!-- language: lang-js -->
$(function(){
$('#filter').change(function() {
var relQuery = null;
// The stuff you send in your request
var reqData = {
'preference': $('#preference').val(),
'city': $('#hsearch').val(),
'spec': $('#mplspecialite').val(),
'mplace': $('#mplace').val(),
'filter': $('#filter').val(),
'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
};
// Make the query string that you need.
// Probably looks like some variant of this.
// Look at jQuery.param docs.
relQuery = "?" + $.param( reqData );
// The request
$.ajax({
type: "POST",
url: "/find/object/filter/",
data: reqData,
success: searchResult,
dataType: 'html'
});
// Change the current history entry to have that
// URL query string.
history.replaceState( {}, '', relQuery);
});
});
function searchResult(data, textStatus, jqXHR) {
$('#dynamic-results').html(data);
}