0

首先,我想通过表达我对 IE 的厌恶程度来作为这个问题的序言。有时我会在半夜从 IE 引发的噩梦中醒来,让我尖叫着从床上跳起来,有时还会无情地殴打我周围的任何人。我的邻居讨厌它。只是听到“IE”让我畏缩。但我离题了。

无论如何,我的 MVC Web 应用程序上有一个页面,它通过 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);
        }
4

1 回答 1

1

好的,从讨论中我将在一个答案中下注!

想想它,以及它是如何经常伴随着 IE 带来的痛苦,它只是原始代码中的一个错误/实现差异,并且实际上无法重写浏览器行为,你本质上是不走运的——就像许多人一样仅适用于 IE 所需的 CSS hack。

但是,通过查看您发布的代码,我假设 ajax 调用获取当前页面,并对其进行一些处理并返回打印友好格式的 HTML 加载?然后将这个 HTML 打印到新窗口中......

现在,我能想到的唯一解决方法是对您的架构进行轻微更改;新窗口将需要打开一个页面,并在该页面上进行 ajax 调用以填充内容。

但是,我想说,恕我直言,Ajax 调用的真正用途是您可以保持在同一个窗口、页面和内容中而无需刷新。当您打开一个新窗口时,我认为查询字符串中包含报告 ID、日期、DateFrom 和 DateTo 的直接 URL 会更好吗?

如果是时间问题(生成报告需要一段时间),那么我个人只需将内容传递到新窗口中,然后让新窗口脚本将其注入div.

然后将其视为跨浏览器解决方案,而不是使用setTimeoutIE hack ;)

于 2012-06-22T12:35:26.283 回答