首先,我想通过表达我讨厌IE的不可思议的事情来预先提出这个问题。有时候我会在半夜醒来时因IE引起的噩梦,让我从床上跳起来尖叫,有时甚至无情地殴打我周围的人。我的邻居讨厌它。只是听到“IE”让我感到畏缩。但我离题了。
无论如何,我在我的MVC网络应用程序上有一个页面,它通过AJAX(通过不同的视图)启动一个新页面并显示一个图表。但问题是,当我打开新窗口时,仅在IE中,脚本未加载(或者至少它们没有及时加载?)但是我在第一次引用时得到“jQuery未定义” jQuery对象。
然而,在重新加载时,一切都加载得很好。知道什么可能导致脚本无法在IE中加载? Chrome和FF工作正常。
这是我用于新窗口的ajax调用:
$.ajax({
type: "POST",
url: actionURL + qs,
data: $(this).serialize(),
success: function (outputString) {
//$("#reportJSON").html(outputString).fadeIn();
var contentFromFirstPage = document.getElementById('reportArea').innerHTML;
var printContent = outputString;
var windowUrl = 'about:blank';
var uniqueName = new Date();
var windowName = 'Print' + uniqueName.getTime();
var printWindow = window.open(windowUrl, windowName, 'scrollbars=1,menubar=1,height=800,width=600,resizable=1');
printWindow.document.write(printContent);
printWindow.focus();
//printWindow.document.close();
}
}).error(function (response) {
alert("something went wrong here with PrintPreview!!!" + response);
});
这是ajax调用的操作:
public ActionResult PrintPreview(string reportId, string date, string dateFrom, string dateTo)
{
Reports reports = new Reports
{
ReportId = Convert.ToInt64(reportId),
Date = Convert.ToDateTime(date),
DateFrom = Convert.ToDateTime(dateFrom),
DateTo = Convert.ToDateTime(dateTo),
AvailableReports = this.FetchAvailableReports()
};
reports.AvailableReports = this.FetchAvailableReports();
reports.SelectedReport = this.FetchReportLayout(reports.ReportId);
reports.DynamicGridDataSource = this.FetchReportGrid(reports);
reports.DynamicChartDataSource = this.FetchReportChart(reports);
return renderViewToString("PrintPreview", reports);
}
答案 0 :(得分:1)
好的,从讨论开始,我要回答一下!
考虑它,以及它经常与IE引起的痛苦,它只是原始代码中的错误/隐藏差异,并且实际上没有能够重写浏览器行为,实质上是运气不好 - 很多就像IE中许多必需的CSS黑客一样。
然而,从你发布的代码看,我假设ajax调用取当前页面,用它做一些东西并返回一个打印友好格式化的HTML加载?然后将此HTML打印到新窗口中......
现在解决这个问题的唯一方法就是对你的架构稍作修改;新窗口需要打开一个页面,并在该页面上调用ajax来弹出内容。
但是,我会说,恕我直言,Ajax调用的真正用途是你可以保持在同一窗口,页面和内容中而无需刷新。当你打开一个新窗口时,我认为只有一个直接的URL,查询字符串中的报告ID,日期,DateFrom和DateTo会更好吗?
如果是时间问题(报告需要一段时间才能生成),那么我个人只是将内容传递到新窗口,并让新窗口脚本将其注入div
。
然后将其视为跨浏览器解决方案,而不是使用setTimeout
IE浏览器;)