【发布时间】:2016-10-31 13:46:48
【问题描述】:
- ASP.NET MVC 5
- jQuery 1.11.3
为这篇长文道歉,但我真的需要朝正确的方向轻推,因为我看不出这里有什么问题。
以下内容适用于 Chrome、Firefox,但 IE 不适用。
正确的结果如下所示:
但在 IE 11 中,错误结果如下:
在皮肤下,有一些 JavaScript 通过一些 AJAX 回调对 MVC 控制器进行更新:
//Applies the selected filter from the values selected in the drop down
function ApplyFilter() {
var brandSelected = $('#filterBrand').val();
var cruiseLengthSelected = $('#filterCruiseLength').val();
var departureDateSelected = $('#filterDepartureDate').val();
var departureFromSelected = $('#filterDepartFrom').val();
var regionSelected = $('#filterRegion').val();
var shipSelected = $('#filterShip').val();
cruisesTemplate.UiBlock('.entire-page');
cruisesTemplate.UiSetBusy('.entire-page');
$.ajax({
url: '/cruises/currentcruiselistfilterset?' +
'aBrandId=' +
brandSelected +
'&aCruiseLength=' +
cruiseLengthSelected +
'&aDepartureDate=' +
departureDateSelected.replace(' ', '_') +
'&aRegionHierarchyItemId=' +
regionSelected +
'&aDepartureFromHierarchyItemId=' +
departureFromSelected +
'&aShipId=' +
shipSelected
})
.error(function (xhr, status, error) {
cruisesTemplate.UiClearBlock('.entire-page');
cruisesTemplate.UiClearBusy('.entire-page');
})
.success(function (data) {
$.ajax({
dataType: 'html',
type: 'GET',
url: window.location.href
})
.error(function (xhr, status, error) {
cruisesTemplate.UiClearBlock('.entire-page');
cruisesTemplate.UiClearBusy('.entire-page');
})
.success(function (data) {
$('#results').html(data);
//Now refresh the filter bar
$.ajax({
dataType: 'html',
type: 'GET',
url: '/cruises/filterbarrefresh'
})
.error(function (xhr, status, error) {
cruisesTemplate.UiClearBlock('.entire-page');
cruisesTemplate.UiClearBusy('.entire-page');
})
.success(function (data) {
$('#filter-bar').html(data);
cruisesTemplate.UiClearBlock('.entire-page');
cruisesTemplate.UiClearBusy('.entire-page');
});
});
});
}
我唯一能想到的是,这要么是时间问题(不太可能),要么可能是与 url: window.location.href(更有可能)相关的时间问题导致问题。
编辑: 看来明确 url: window.location.href 是问题所在,因为在我看到以下 AJAX 请求的浏览器中起作用:
https://localhost/cruises/filterbarrefresh https://localhost/departing/australia/cruises https://localhost/cruises/currentcruiselistfilterset?abrandid=8&acruiselength=0&adeparturedate=january_2015&aregionhierarchyitemid=1&adeparturefromhierarchyitemid=73&ashipid=0
而在 IE 中,我只看到此 AJAX 请求(因此,当我们执行完整页面请求时,整个站点会在更新区域内更新:
https://localhost/departing/australia/cruises
我还验证了这不是described here 的jQuery.html() 问题。使用虚拟硬编码字符串或 $("#container").empty().append(data);模式仍然会导致相同的 IE 不良行为。
/编辑:
我的基本问题是:
- 如何在不更改现有 JS 逻辑的情况下使其在 IE(以及 Chrome、Firefox 等)中工作?
- 我是否遗漏了一些关于 jQuery、Promises 等方面的基本知识,就如何实现这是不好的做法?
非常感谢所有指针和建议。
【问题讨论】:
-
你为什么使用
window.location.href而不是@Url.Action()?并且以您在第一次通话中的方式生成您的网址是不好的做法。您还应该使用url: @Url.Action("currentcruiselistfilterset", "cruises"),并使用data: { aBrandId: brandSelected, aCruiseLength: cruiseLengthSelected, etc }发送参数 -
@StephenMuecke 理解并同意这种不好的做法,我将在本地审查和更新我的代码。然而,这对 IE 所做的事情与其他浏览器完全不同这一事实没有任何影响。知道为什么 IE 正在做它正在做的事情吗?
-
您是否对在 IE 中的工作方式有所不同感到惊讶 :)。但是无论如何,你有那些链接的 ajax 调用。第一个是调用
currentcruiselistfilterset(),你会得到一些数据(不确定是html还是json),但你从来没有对这些数据做任何事情(它只是被扔掉了)。然后在成功回调中对location.href返回的url(即当前页面的url)进行另一个ajax调用以更新DOM。 -
其实第三次ajax调用的目的是什么。为什么要更新过滤栏?看看这个网站,它所做的只是用它之前的样子来更新它
-
第三次调用是让过滤器栏反映当前选择,因为它与显示的内容不符。
标签: javascript jquery asp.net asp.net-mvc internet-explorer