SSRS 2008 R2 – SSRS 2012 – ReportViewer:Safari / Chrome中的报告,但在Firefox / Internet Explorer 8中正常工作…为什么?
我在SSRS 2008 R2
有一些简单的报告,但在Safari或Chrome中完全不显示。 根据微软的图书在线,这些浏览器受到有限的支持。 但是,数据“加载”时钟完成后,我什么也看不到。 页面顶部的参数栏和面包屑导航部分都在那里。 另外,我可以在Safari和Chrome上保存/导出为任何格式。 它不会显示报告部分本身,只是空白。
我应该使用证书和安全连接(目前没有设置HTTPS,只有HTTP)? 有没有需要调整的服务器端configuration? 有没有人使用以前的SSRS版本(2005)成功显示Safari / Chrome的任何报告?
我正在使用Safari 5.0.4
和Chrome 10.0.648.151
。 我知道这两个浏览器的相似之处在于它们都基于WebKit 。
报告在Internet Explorer 8(当然)和Firefox 4.0上成功呈现。
如果有人能够对此有所了解,我将不胜感激。
终极解决scheme(也在SSRS 2012工作!)
将以下脚本附加到(在SSRS服务器上)“ C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js ”:
function pageLoad() { var element = document.getElementById("ctl31_ctl10"); if (element) { element.style.overflow = "visible"; } }
其实我不知道如果div的名字总是ctl31_ctl10
:在我的情况是(而不是SQL Server 2012的azzlakfindctl32_ctl09
)。
如果这种解决scheme不起作用,请查看浏览器中的HTML代码,看看脚本是否正确地更改了溢出:auto属性溢出:可见 。
ReportViewer控件的解决scheme
将此样式行插入到.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 ,并将报告变成不可见的报告。
<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;"> ...</div>
手动更改(使用Chrome的debugging窗口)最终的HTML 溢出:自动 溢出:可见我可以在Chrome上看到报告。
我爱蒂姆的解决scheme ; 这很容易和工作。
但仍然有一个问题:任何时候用户更改参数(我的报告使用参数!)AJAX刷新div, 溢出:自动标记被重写,没有脚本改变它。 这个技术细节解释了什么是问题。
发生这种情况是因为在使用AJAX面板构build的页面中,只有AJAX面板会更改其状态,而不刷新整个页面。 因此,在标签上应用的OnLoad事件只会触发一次:第一次加载页面。 之后,更改任何AJAX面板将不会再触发这些事件。
Mr.Einarq在这里向我build议了解决scheme。
另一种select是将你的函数重命名为pageLoad。
任何带有这个名字的函数都会被ASP.NET Ajax自动调用,如果它存在于页面上的话,也是每次部分更新之后。 如果你这样做,你也可以从body标签中删除onload属性
所以我写了解决scheme中显示的改进脚本。
基于CSS的解决scheme
我能够将以下内容添加到Reporting Services的样式表中,并在Chrome中为我解决了这个问题。
免责声明:这不是彻底的跨浏览器兼容性testing。
/ ************** 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
这是一个已知的问题 。 问题在于div标签的风格是“overflow:auto”,Safari和Chrome使用的WebKit显然不能很好的实现(见Emanuele Greco的回答 )。 我不知道如何利用Emanuele的build议来使用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 https://stackoverflow.com/questions/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的解决scheme ,我还没有尝试,但我不认为它适用于SSRS 2008,因为我找不到“DocMapAndReportFrame”类。
基于CSS的全系统解决scheme
这不需要任何JavaScript或Ajax框架或任何其他包装。 它在Internet Explorer,Firefox,Safari和Chrome上进行了testing。
这可以在报表服务器的样式表级别修复。
首先,导航到安装报告服务的目录,在我的情况下( SQL Server 2012 SP1):
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer
在该目录中,您将find一个名为reportserver.config的文件。
请参阅为HTML查看器和报表pipe理器自定义样式表 。
在那个文件中插入一个像(从上面的文档)一样的XML行:
<Configuration> ... <HTMLViewerStyleSheet>SafariChromeFix</HTMLViewerStyleSheet> ... </Configuration>
除此之外。
在上面的链接中他们没有告诉你的是这个条目完全覆盖了默认的样式表。 我第一次尝试通过添加一个div样式表来获得报表的工作,一切都被打破了。 一旦我发现这个对reporserver.config文件的编辑没有增加,但实际上replace了默认的样式表,我复制了默认的样式表,一切开始工作。
接下来,进入样式目录( 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)上呈现。
请注意:
这不仅是可能的,而且很可能reportserver.config将被报告服务的更新覆盖,所以您可能需要随时添加<HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>
标记。
这也给了我们一个地方来打破默认的样式表,并从已经工作的东西开始做很多其他的自定义更改。 由于它不是默认的样式表,所以在升级和修补程序期间,新的自定义CSS文件不会被覆盖。
在我的情况下,违规的DIV是“ctl31_ctl09”,所以如果上面的解决scheme不适合你尝试改变var element = document.getElementById("ctl31_ctl10");
var element = document.getElementById("ctl31_ctl09");
我的解决scheme是添加下面的<script>
到:
Reporting Services \ ReportManager \ Pages \ Report.aspx
该脚本针对可见报表内容的父项1并设置style. overflow : visible
style. overflow : visible
每当报表加载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_ctl09
, ctl31_ctl10
, ctl32_ctl09
等
2请参阅Sys.Application. add_load()
Sys.Application. add_load()
为了避免必须对元素ID进行硬编码,我编辑了RS服务器上的ReportingServices.js文件@ [Drive]:\ Program Files \ Microsoft SQL Server \ [Reporting Services Instance] \ Reporting Services \ ReportManager \ js \ ReportingServices.js包括一些代码来获取jQuery,将其加载到页面中,然后find溢出设置为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完成了testing,效果很好。
Reporting Services的SQL Server 2014版本增加了对Google Chrome浏览器的支持,但目前还不支持iOS。 在这里看到细节。
对于我来说,名称是“ ctl32_ctl09 ”(来自SQL Server 2012 SP1,MSRS11的SSRS)。
我不得不与F12进入Chrome,注意到我有ctl32 _ctl09,而不是我的div中的ctl31_ctl09。
这是用于SQL Server 2012的 Windows Server 2008 R2 64位。 附加脚本,然后重新启动SSRS并清除浏览器caching。
/ /修正,让Chrome浏览器显示SSRS报告
function pageLoad() { var element = document.getElementById("**ctl32**_ctl09"); if (element) { element.style.overflow = "visible"; } }
不幸的是,主要答案打破了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"; } }
Chrome 22.0.1229.79中仍然存在此问题。
YMMV ,但我发现删除ReportViewer标签的高度解决了这个问题。
我在SSAS报告中遇到了这个问题,但不是SSRS报告。 我不明白为什么,直到我检查了页面的差异(一位顾问做了SSAS报告)。 他正在设置ReportViewer Height = 60%,SSRS报告没有指定高度。
一旦我删除了高度,我的报告显示。
对于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 } }
所有build议的上述版本都没有工作。
overflow:visible
一个问题是overflow:visible
修复是浮动标题在所有的浏览器中被打破。 以下脚本将使Internet Explorer保持独立,并将修补程序仅应用于非Internet Explorer浏览器。 有了这个,所有function都保留给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; }
我尝试了这些方法,但对我而言,我们的系统pipe理员对这些改变持怀疑态度。
ReportViewer
将高度设置为100%,而是使用了固定的高度,并在我的Internet Explorer和Chrome应用程序中工作。
我从来没有运气在Chrome中显示报告。 大多数微软的文档都没有列出,所以我认为Chrome在parsingASP中的东西时一定很麻烦。
请参阅Reporting Services和Power View的浏览器支持 。
我正在运行Chrome 11,并体验与您相同的行为。
我在浏览Chrome浏览器时遇到了同样的问题。 我通过向Google Chrome添加扩展程序“SSRS报告修复”来解决这个问题。 https://chrome.google.com/webstore/detail/ssrs-report-fix/fjbdfjiheheafbioiejbdpalmojkeobk