SSRS 2008 R2-SSRS 2012-ReportViewer:Safari / Chrome中的报告,但在Firefox / Internet Explorer 8中运行良好……为什么?


83

我在中有一些简单的报告SSRS 2008 R2,但它们根本不会在Safari或Chrome中显示。根据Microsoft的联机丛书,这些浏览器仅受有限的支持。但是,数据“加载”时钟完成后,我什么也看不到。页面顶部的参数栏和面包屑导航部分都在那里。另外,我可以在Safari和Chrome上将其保存/导出为任何格式。它只是不会显示报告部分本身,而只是空白。

我是否应该使用证书和安全连接(当前未使用HTTPS设置,仅使用HTTP设置)?是否需要调整任何服务器端配置?有没有人成功使用以前的SSRS版本(2005)在Safari / Chrome上显示任何报告?

我正在使用Safari 5.0.4Chrome 10.0.648.151。我知道这两种浏览器的相似之处在于它们都基于WebKit

该报告可以在Internet Explorer 8(当然)和Firefox 4.0上成功呈现。

如果有人可以对此有所阐明,我将非常感激。



2
格雷格H看着我的解决方案,让我知道它是否解决了问题
Emanuele Greco

Answers:


94

终极解决方案(也可在SSRS 2012中使用!)

将以下脚本追加到“ C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js ”(在SSRS服务器上):

function pageLoad() {
    var element = document.getElementById("ctl31_ctl10");
    if (element)
    {
        element.style.overflow = "visible";
    }
}

实际上,我不知道div的名称是否始终是ctl31_ctl10:就我而言(不是找到SQL Server 2012 azzlak ctl32_ctl09)。

如果此解决方案不起作用,请从浏览器查看HTML,以查看脚本是否正常运行,将overflow:auto属性更改为overflow:visible


ReportViewer控件的解决方案

将此样式行插入.aspx页面(或链接.css文件,如果可用)中:

#reportViewer_ctl09 {
  overflow:visible !important;
}

原因

Chrome和Safari呈现溢流:自动运行的方式与Internet Explorer不同。

SSRS HTML是QuirksMode HTML,并取决于IE 5.5错误。非IE浏览器没有IE quirksmode,因此可以正确呈现HTML

由SSRS 2008 R2报表生成的HTML页面包含div,具有overflow:auto样式,它将报表转换为不可见的报表。

<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">
...</div>

手动更改(使用Google Chrome的调试窗口)最终的HTML溢出:汽车溢出:可见我可以看到在Chrome报告。

我喜欢蒂姆的解决方案;这很容易且有效。

但是仍然存在一个问题:用户每次更改参数时(我的报告使用参数!),AJAX刷新div,将重写overflow:auto标签,并且没有脚本对其进行更改。 该技术说明详细说明了问题所在。

发生这种情况的原因是,在使用AJAX面板构建的页面中,只有AJAX面板会更改其状态,而不刷新整个页面。因此,您在代码上应用的OnLoad事件仅被触发一次:页面首次加载。之后,更改任何AJAX面板将不再触发这些事件。

einarq先生在这里向我建议解决方案。

另一个选择是将函数重命名为pageLoad。

如果页面上存在此名称的任何函数,ASP.NET Ajax也会自动调用该函数,并且也在每次部分更新之后。如果执行此操作,还可以从body标记中删除onload属性

因此,我编写了解决方案中显示的改进脚本。


好该死,我也可以确认对我也适用(SQL 2008 R2)。
Vincent Vancalbergh 2012年

3
在SSRS 2012中也可以使用。在我的情况下,div的ID为“ ctl31_ctl09”。谢谢!
克里斯

Emanuele提供的解决方案适用于我,但是我在使用aspx页面上的ReportViewer控件查看报表时遇到问题。所以我在aspx页面上添加了一些代码。我在这里
Samir K

我无法触发“ pageLoad”事件,尽管我将其剪切并粘贴到了SSRS报告服务器上指示的JS文件的底部。关于为何可能无法解决的任何建议?
Ben Finkel,2012年

@BenFinkel“每次UpdatePanel刷新后都会调用pageLoad()”(encosia.com/document-ready-and-pageload-are-not-the-same),因此问题可能有所不同。尝试浏览器的调试窗口以查看是否您修改的文本已链接,并且是否存在Javascript错误。
Emanuele Greco 2012年

43

基于CSS的解决方案

我能够将以下内容添加到Reporting Services的样式表中,并在Chrome中为我修复了该问题。

免责声明:尚未针对跨浏览器兼容性进行全面测试。

/ ************** CHROME BUG FIX ********************* /
div#ctl31_ctl09,
div#ctl31_ctl10
{
    溢出:可见!重要;
}
/ ************************************************* /

将其添加到ReportingServices.css文件的开头。

对我来说,该文件位于:

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\Styles\ReportingServices.css


3
+1在所有经过测试的浏览器(Chrome,Safari,IE9,IE10)上都像魅力一样。在MAC OS X Chrome上,相同...
YvesR 2013年

如果您无权访问服务器来为所有用户修改css,则可以在此答案中将CSS与Stylebot等浏览器扩展一起使用
Mike

+1不错的解决方案!这比使用Java脚本修复便宜(在性能方面更便宜),并且不需要在每次AJAX面板更新时都进行更新。
KyleMit 2014年

1
哇!这是我的问题,我刚刚开始研究SSRS R2报告部署,它显示在IE中,而不显示在chrome中。有什么解释吗?无论如何,谢谢瑞安!
弗朗西斯·索尔

1
该矿在SSRS 2012中被标记为ctl32_ctl109。在查找完该矿井并将CSS与我的值一起使用后,它可以完美工作。
Matt H

18

这是一个已知问题。问题在于div标签的样式为“ overflow:auto”,显然不能与Safari和Chrome使用的WebKit很好地实现(请参阅Emanuele Greco的答案)。我不知道如何利用Emanuele的建议来使用RS:ReportViewerHost元素,但是我使用JavaScript解决了它。

问题

在此处输入图片说明

由于在id为“ ctl31_ctl10”的div元素的style属性中指定了“ overflow:auto”,因此我们无法在样式表文件中覆盖它,因此我使用JavaScript。我将以下代码附加到“ C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js”

function FixSafari()
{    
    var element = document.getElementById("ctl31_ctl10");
    if (element) 
    {
        element.style.overflow = "visible";  //default overflow value
    }
}

// Code from /programming/9434/how-do-i-add-an-additional-window-onload-event-in-javascript
if (window.addEventListener) // W3C standard
{
    window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
    window.attachEvent('onload', FixSafari);
}

注意

我似乎没有尝试过SSRS 2005解决方案,但我认为它不适用于SSRS 2008,因为找不到“ DocMapAndReportFrame”类。


7

基于CSS的系统范围内的解决方案

这不需要任何JavaScript或Ajax框架或任何其他包装。它已经在Internet Explorer,Firefox,Safari和Chrome上进行了测试。

可以在报表服务器的样式表级别上修复此问题。

首先,导航到安装了报表服务的目录,在我的案例中(SQL Server 2012 SP1)为:

C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

在该目录中,您将找到一个名为reportserver.config的文件。

请参阅为HTML Viewer和Report Manager自定义样式表

在该文件中插入单个XML行,例如(来自上述文档):

<Configuration>
...
          <HTMLViewerStyleSheet>SafariChromeFix</HTMLViewerStyleSheet>
...
</Configuration>

保存下来。

他们不做什么在上面的链接中告诉您的是,该条目将完全覆盖默认样式表。我第一次尝试通过添加div样式表来使报表呈现正常工作,其他所有内容均已损坏。一旦我发现对reporserver.config文件的编辑并没有增加,但实际上替换了默认样式表,我复制了默认样式表,一切开始正常工作。

接下来,进入“样式”目录(C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles)。

复制一个名为SP_Full.css的文件,并将其命名为SafariChromeFix.css。此时,SafariChromeFix.css应该与SP_Full.css相同。

编辑SafariChromeFix.css并将以下行添加到顶部:

div {
    overflow: visible !important;
}

保存。

保存后,此Reporting Services实例上的所有现有报告将在所有浏览器(包括Chrome和Safari)上呈现。

请注意:

这不仅是可能的,而且极有可能该报告服务器的更新将被报告服务的更新所覆盖,因此您可能需要<HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>随时间在其中添加标记。

这也为我们提供了一个进入默认样式表的地方,并从已经起作用的内容开始进行了许多其他自定义更改。并且由于它不是默认样式表,因此新的自定义CSS文件在升级和修补程序期间不会被覆盖。


“保存后,此Reporting Services实例上的所有现有报告将在所有浏览器(包括Chrome和Safari)上呈现。” -是的,但是它们看起来仍然很恐怖。
Stefan Steiger,2015年

4

在我的情况下,令人讨厌的DIV是“ ctl31_ctl09”,因此,如果上述解决方案对您不起作用,请尝试将其更改var element = document.getElementById("ctl31_ctl10");var element = document.getElementById("ctl31_ctl09");


4

我的解决方案是将以下内容添加<script>到:

Reporting Services \ ReportManager \ Pages \ Report.aspx

该脚本针对可见报告内容的父级1进行设置,并在每次报告加载2时进行设置-包括通过多页报告进行分页。style.overflow:visible

if (window.addEventListener && document.querySelector) window.addEventListener("load", function () {

    // drop out if Sys.Application.add_load is undefined
    if (!window.Sys || !Sys.Application || !Sys.Application.add_load) return;

    // register a function for when report data is loaded
    Sys.Application.add_load(function () {

        // get the report content control
        var n = document.querySelector("[id^=VisibleReportContent]");

        if (n) {

            // get the report content control's parent
            n = n.parentNode;

            if (n) {

                // revert overflow:hidden to "visible"
                n.style.overflow = "visible";

            }
        }

    });
});

1。这意味着我们没有对目标生成的ID,其有一种倾向,改变,即:ctl31_ctl09ctl31_ctl10ctl32_ctl09,等等
2Sys.Application.add_load()


1
在SSRS 2008 R2中,这对我来说非常理想。对于我们的Mac用户(没有简单的方法来使用IE),这是一个救星。–
Lawson



2

我必须进入ChromeF12并注意到我的div中有ctl32 _ctl09,而不是ctl31_ctl09。

这适用于Windows Server 2008 R2 64Bit和SQL Server 2012。追加脚本,然后重新启动SSRS并清除浏览器缓存。

//修复以允许Chrome显示SSRS报告

    function pageLoad() {
    var element = document.getElementById("**ctl32**_ctl09");
    if (element)
    {
        element.style.overflow = "visible";
    }
}

2

不幸的是,主要答案打破了Internet Explorer报表中的浮动(绝对位置)列。因此,我对其进行了少许修改,因为它专门用于WebKit,所以我不喜欢它,但是它可以正常工作:

//SSRS 2012 Chrome fix
function pageLoad() {
    var element = document.getElementById("ctl32_ctl09");
    var isWebKit = !!window.webkitURL;    // Chrome or safari really (WebKit browsers).
    // We don't want to do this fix in Internet Explorer, because it breaks floating columns
    if (element && isWebKit)
    {
        element.style.overflow = "visible";
    }
}


1

为了避免必须对元素ID进行硬编码,我编辑了RS服务器上的ReportingServices.js文件@ [Drive]:\ Program Files \ Microsoft SQL Server \ [Reporting Services Instance] \ Reporting Services \ ReportManager \ js \ ReportingServices.js包括一些获取jQuery的代码,将其加载到页面中,然后查找所有溢出设置为auto的元素。

将以下代码插入ReportingServices.js文件的顶部

var loadjQuery = function (cb) {
    if (typeof (jQuery) == 'undefined') {
        var scr = document.createElement('script');
        scr.setAttribute('type', 'text/javascript');
        scr.setAttribute('src', 'http://code.jquery.com/jquery-latest.js');

        if (scr.readyState) {
            scr.onreadystatechange = function () {
                if (scr.readyState === 'complete' || scr.readyState === 'loaded') {
                    scr.onreadystatechange = null;
                    if (typeof (cb) === 'function') {
                        args = [].slice.call(arguments, 1);
                        cb.apply(this, args);
                    }
                }
            };
        }
        else {
            scr.onload = function () {
                if (typeof (cb) === 'function') {
                    args = [].slice.call(arguments, 1);
                    cb.apply(this, args);
                }
            };
        }

        var head = document.getElementsByTagName('head')[0];
        head.insertBefore(scr, head.firstChild);
    }
}

然后,下一行是JS文件中的原始内容。

之后,添加以下代码

var _rmFixReady = false;
function pageLoad() {
    loadjQuery(function () {
        _rmFixReady = true;
    });
    if (_rmFixReady) {
        var overflowElements = $('div').filter(function () { return $(this).css('overflow') == 'auto'; });
        overflowElements.each(function () {
            $(this).css('overflow', 'visible');
        });
    }
}

我刚刚在RM2012实例上使用Chrome 27和IE 10完成了此测试,效果很好。


1

该问题在Chrome 22.0.1229.79中仍然存在。

YMMV,但是我发现从ReportViewer标记中删除高度可以解决此问题。

我在SSAS报告中遇到了这个问题,但SSRS报告却没有。在检查页面差异之前,我无法弄清楚原因(一位顾问完成了SSA​​S报告)。他将ReportViewer Height设置为60%,而SSRS报告未指定高度。

删除高度后,将显示报告。


1

对于Windows Server 2008 R2 x64上的SSRS 2012 ,有效的脚本是:

function pageLoad()
{
    var element = document.getElementById("ctl31_ctl09");
    if (element)
    {
        element.style.overflow = "visible";
    }

    if (window.addEventListener) // W3C standard
    {
         window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
    }
    else
        if (window.attachEvent) // Microsoft
        {
            window.attachEvent('onload', FixSafari);
        }
}

function FixSafari()
{
    var element = document.getElementById("ctl31_ctl09");
    if (element)
    {
        element.style.overflow = "visible";  // Default overflow value
    }
}

以上建议的所有版本都无法使用。


1

overflow:visible修补程序的一个问题是,浮动标头在所有浏览器中均被破坏。以下脚本将单独保留Internet Explorer,并将修复程序仅应用于非Internet Explorer浏览器。这样,Internet Explorer用户将保留所有功能,其他浏览器仍可以查看报告。

function pageLoad() {
    var eval = getInternetExplorerVersion();
    if (eval == -1)
    {
        var element = document.getElementById("ctl31_ctl09");
        if (element)
        {
            element.style.overflow = "visible";
        }
    }
}

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}

1

我尝试了这些方法,并且对我有用,但是我们的系统管理员对这些更改表示怀疑。

我没有将上的高度设置为100%ReportViewer,而是使用了固定的高度,并且设法在Internet Explorer和Chrome的应用程序中正常工作。


1

我从来没有在Chrome中显示报告的运气。微软的大多数文档甚至都没有列出它,因此我认为Chrome浏览器在解释ASP中的内容时一定会遇到麻烦。

请参阅浏览器对Reporting Services和Power View的支持

我正在运行Chrome 11,并且遇到与您相同的行为。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.