2012-12-10 79 views
1

我嵌入報告到iframe(該報告是獲取與.NET ReportingServices)SSRS - 報告的JavaScript加載事件

我想推出一個JavaScript函數,一旦報告被加載。

我試圖

window.addEventListener("load", ...) 

但由於報告結果加載使用JavaScript,有效地加載報告之前被觸發window.load。

是否有一些JavaScript函數可以讓我處理報表加載?像

the_report.loaded(function() { 
    alert(document.height); 
}); 

順便說一下,目標是獲得最終呈現文檔的高度。

+0

如果你還沒有找到它:這裏的[對客戶端的ReportViewer編程參考MSDN(http://msdn.microsoft.com/en-us/library/ dd756405(VS.100)的.aspx)。 – Jeroen

回答

2

Javascript的支持最多是最少的。令人遺憾的是,這些控制措施在多數方面仍然與時俱進。你可以找到什麼是暴露,這裏記載:幸運的是

http://msdn.microsoft.com/en-us/library/dd756405(VS.100).aspx

你有一個get_isLoading()函數可以調用:

http://msdn.microsoft.com/en-us/library/dd756413(v=vs.100).aspx

嘗試是這樣的:

(function() { 

    var onLoad = function() { 
     // Do something... 
    }; 
    var viewerReference = $find("ReportViewer1"); 

    setTimeout(function() { 
     var loading = viewerReference.get_isLoading(); 

     if (!loading) onLoad(); 
    },100); 

})(); 
+0

好吧,我看到它確實相當有限。 'viewerReference'對我來說非常有用。我也會用一個標誌只觸發一次「事件」:)我會嘗試並告訴你。非常感謝你。 –

+0

這是什麼$ find? –

+1

@JussiPalo SSRS提供的一項特殊功能,可根據ID查找報告查看器控件。 – Lloyd

3

這正是我最終的結果(iframe方)

/* This will run only when all ReportingService JS is loaded */ 
Sys.Application.add_load(function() { 
    /* Let's consider the report is already loaded */ 
    loaded = true; 
    /* The function to call when the report is loaded */ 
    var onLoad = function() { 
     alert(document.body.scrollHeight); 
     /* Set the report loaded */ 
     loaded = true; 
    }; 
    /* The report instance */ 
    var viewerReference = $find("ReportViewer1"); 

    /* The function that will be looped over to check if the report is loaded */ 
    check_load = function() { 
     var loading = viewerReference.get_isLoading(); 
     if (loading) { 
      /* It's loading so we set the flag to false */ 
      loaded = false; 
     } else { 
      if (!loaded) { 
       /* Trigger the function if it is not considere loaded yet */ 
       onLoad(); 
      } 
     } 
     /* Recall ourselves every 100 miliseconds */ 
     setTimeout(check_load, 100); 
    } 

    /* Run the looping function the first time */ 
    check_load(); 
}) 
0

皮埃爾的解決方案的建設,我結束了這一點。 (簡化,只有調用,直到它加載一次,因爲它似乎在每次加載後運行)

注意:我的報告配置是SizeToReportContent =「true」AsyncRendering =「false」,所以這可能是爲什麼我的一部分可以簡化它。

Sys.Application.add_load(function() { 
 
    var viewerReference = $find("ReportViewer1"); 
 
    check_load = function() { 
 
     if (viewerReference.get_isLoading()) { 
 
      setTimeout(check_load, 100); 
 
     } else { 
 
      window.parent.ReportFrameLoaded(); 
 
     } 
 
    } 
 
    check_load(); 
 
});