4

レポートをiframeに埋め込んでいます(レポートは.NET ReportingServicesで取得されます)

レポートが読み込まれたら、Javascript関数を起動したいと思います。

私は試した:

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

ただし、レポート結果はJavascriptで読み込まれるwindow.loadため、レポートが効果的に読み込まれる前にトリガーされます。

レポートの読み込みを処理できるようにするJavascript関数が公開されていますか?好き:

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

ちなみに、目的は最終的にレンダリングされたドキュメントの高さを取得することです。

4

3 に答える 3

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();
})
于 2012-12-10T14:28:05.137 に答える
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);

})();
于 2012-12-10T12:27:59.210 に答える
1

ピエールのソリューションを構築して、私はこれに行き着きました。(ロードのたびに実行されるように見えるため、一度ロードされるまでのみ呼び出すように簡略化されています)

注: 私のレポート設定は 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();
});

于 2017-11-03T21:40:25.230 に答える