2014-04-11 66 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的人,因爲那些你很可能在這個時候告訴你。如果我在這裏放了一些代碼,那麼你可以告訴我是不正確的,那太棒了;我更希望的是能夠解釋彈出式報表框架應該如何工作的人。希望我可以做到這一點,而不必替換我已經獲得的太多代碼,因爲它很脆弱,而且不是,我們可以說,是用重構來編寫的。

回答