【发布时间】:2014-04-11 18:02:51
【问题描述】:
我正在尝试维护一个不是我编写的系统(我们不都是吗?)。它是用 C Sharp 和 JavaScript 编写的,带有 Telerik 报告。
它包含在 JavaScript 中的以下代码,当用户单击按钮以在单独的窗口中显示报告时运行:
var oIframe = $("iframe id='idReportFrame' style='display:none' name='idReportFrame' src=''>");
oIframe.load(function() { parent.ViewReports(); });
oIframe.appendTo('body');
try
{
$('#idReportForm').attr('target', 'idReportFrame');
$('#idReportForm').submit();
}
catch (err) { // I did NOT write this
}
然后是加载函数:
function ViewReports()
{
var rptName = $("#ReportNameField").val();
if (rptName == '') { return false; }
var winOption = "fullscreen=no,height=" + $(window).height() + "left=0,directories=yes,titlebar=yes,toolbar=yes,location=yes,status=no,menubar=yes,scrollbars=no,resizable=no, top=0, width=" + $(window).width();
var win = window.open('@Url.Action("ReportView", "MyController")?pReportName=' + rptNameCode, 'Report', winOption);
win.focus();
return false;
}
当我执行此操作时(至少在 Chrome 中),它会弹出窗口并将报告放入其中。但是,c# 代码中的断点表明它被调用了 2 或 3 次。 JavaScript 中的断点和对 Chrome 中 JavaScript 调试环境中的小日志的检查表明,对 win.focus() 的调用在成功之前失败了一两次。它返回一个未定义的值,然后似乎再次执行了上面的第一个例程。
我倾向于认为这是某种时间问题,除了 window.open() 调用应该是同步的,据我所知,我不知道为什么它有时会成功而不是其他人.有一个例程会在加载窗口时执行,也许这会以某种方式破坏 open() 的返回值。
我不是一个 JavaScript 人,你们中的那些人现在可能已经知道了。如果我放在这里的代码有什么地方你可以告诉我不正确,那就太好了;我更希望的是有人可以解释 popup-report-in-frame 应该如何工作。希望我可以做到这一点,而不必替换我拥有的太多代码,因为它很脆弱,并且我们可以说,在编写时没有考虑到重构。
【问题讨论】:
标签: c# javascript window.open