2014-04-11 53 views
1

我正在尝试维护一个我没有写入的系统(而不是我们都是?)。 Telerik报道,它是用C Sharp和JavaScript编写的。JavaScript window.open有时会返回null

它具有包括在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的人,因为那些你很可能在这个时候告诉你。如果我在这里放了一些代码,那么你可以告诉我是不正确的,那太棒了;我更希望的是能够解释弹出式报表框架应该如何工作的人。希望我可以做到这一点,而不必替换我已经获得的太多代码,因为它很脆弱,而且不是,我们可以说,是用重构来编写的。

回答