s-s-rS 2008 R2 - s-s-rS 2012 - ReportViewer:在 Safari/Chrome 中报告,但在 Firefox/Internet Explorer 8 中运行良好
Posted
技术标签:
【中文标题】s-s-rS 2008 R2 - s-s-rS 2012 - ReportViewer:在 Safari/Chrome 中报告,但在 Firefox/Internet Explorer 8 中运行良好……为啥?【英文标题】:s-s-rS 2008 R2 - s-s-rS 2012 - ReportViewer: Reports in Safari/Chrome but works fine in Firefox/Internet Explorer 8... why?s-s-rS 2008 R2 - s-s-rS 2012 - ReportViewer:在 Safari/Chrome 中报告,但在 Firefox/Internet Explorer 8 中运行良好……为什么? 【发布时间】:2011-07-22 15:08:15 【问题描述】:我在s-s-rS 2008 R2
中有一些简单的报告,但它们根本不会在 Safari 或 Chrome 中显示。根据 Microsoft 的联机丛书,这些浏览器的支持方式有限。但是,在数据“加载”时钟完成后,我什么也看不到。页面顶部的参数栏和面包屑导航部分都在那里。此外,我可以在 Safari 和 Chrome 上保存/导出为任何格式。它只是不会显示报告部分本身,它只是空白。
我是否应该使用证书和安全连接(目前没有设置 HTTPS,只有 HTTP)?是否有任何需要调整的服务器端配置?有没有人使用以前的 s-s-rS 版本 (2005) 在 Safari/Chrome 上成功显示 ANY 报告?
我正在使用 Safari 5.0.4
和 Chrome 10.0.648.151
。我知道这两个浏览器的相似之处在于它们都基于WebKit。
报告在 Internet Explorer 8(当然)和 Firefox 4.0 上成功呈现。
如果有人能对此有所了解,我将不胜感激。
【问题讨论】:
重复:***.com/questions/5968082/… Greg H 看看我的解决方案,如果它解决了问题,请告诉我 【参考方案1】:终极解决方案(也适用于 s-s-rS 2012!)
将以下脚本附加到“C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js”(在 s-s-rS 服务器上): p>
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 不同的方式呈现 overflow:auto。
s-s-rS HTML 是 QuirksMode HTML 并且依赖于 IE 5.5 错误。非 IE 浏览器没有 IE 怪癖模式,因此呈现 HTML 正确
s-s-rS 2008 R2 报表生成的 HTML 页面包含一个 div,它具有 overflow:auto 样式,它将报表变成一个不可见的报表。
<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">
...</div>
手动更改(使用 Chrome 的调试窗口)最终 HTML overflow:auto in overflow:visible 我可以在 Chrome 上看到报告。
我爱Tim's solution;它既简单又有效。
但是还有一个问题:任何时候用户改变参数(我的报表使用参数!)AJAX刷新div,overflow:auto标签被重写,没有脚本改变它。 This technote detail 解释了问题所在。
这是因为在使用 AJAX 面板构建的页面中,只有 AJAX 面板会更改其状态,而不会刷新整个页面。因此,您在代码上应用的 OnLoad 事件只会触发一次:第一次加载页面时。之后,更改任何 AJAX 面板将不再触发这些事件。
Mr.einarq 向我推荐了解决方案here。
另一种选择是将您的函数重命名为 pageLoad。
如果页面上存在具有此名称的任何函数,ASP.NET Ajax 将自动调用它,每次部分更新后也是如此。如果这样做,您还可以从 body 标记中删除 onload 属性
所以我编写了解决方案中显示的改进脚本。
【讨论】:
好吧,该死的,我可以确认这对我也有效(SQL 2008 R2)。 也在 s-s-rS 2012 中工作。在我的情况下,div 的 id 为“ctl31_ctl09”。谢谢! Emanuele 提供的解决方案对我有用,但是我在使用我的 aspx 页面上的 ReportViewer 控件查看报告时遇到问题。所以我在aspx页面上添加了一些代码。我已经提到了here 我无法触发“pageLoad”事件,尽管我将它剪切并粘贴到了我的 s-s-rS 报告服务器上指示的 JS 文件的底部。关于为什么这可能不会发生的任何建议? @BenFinkel "pageLoad() 在每次 UpdatePanel 刷新后被调用" (encosia.com/document-ready-and-pageload-are-not-the-same) 所以问题可能不同.. 尝试浏览器的调试窗口,看看你修改的文本是否被链接,如果存在 javascript 错误。【参考方案2】:基于 CSS 的解决方案
我能够将以下内容添加到 Reporting Services 的样式表中,并在 Chrome 中为我修复了它。
免责声明:这并未针对跨浏览器兼容性进行全面测试。
/******************铬错误修复**********************/ div#ctl31_ctl09, div#ctl31_ctl10 溢出:可见!重要; /************************************************/将其添加到 ReportingServices.css
文件的开头。
对我来说,该文件位于:
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\Styles\ReportingServices.css
【讨论】:
+1 在所有经过测试的浏览器(Chrome、Safari、IE9、IE10)上都非常有效。在 MAC OS X Chrome 上同样... 如果您无权访问服务器来修改所有用户的 css,您可以在此答案中使用 CSS 和 Stylebot 之类的浏览器扩展。 +1 不错的解决方案!这比使用 Javascript 修复更便宜(性能方面),并且不需要在每次 AJAX 面板更新时更新。 哇!这是我的问题,我刚开始研究 s-s-rS R2 报告部署,它显示在 IE 中,但不在 chrome 中。有没有解释为什么会这样?无论如何,谢谢瑞恩! 我的在 s-s-rS 2012 中被标记为 ctl32_ctl109。在查找并使用你的 CSS 和我的值之后,它工作得很好。【参考方案3】:这是known issue。问题是 div 标签的样式为“overflow: auto”,这显然无法在 Safari 和 Chrome 使用的 WebKit 中很好地实现(参见 Emanuele Greco 的 answer)。我不知道如何利用 Emanuele 的建议来使用 RS:ReportViewerHost 元素,但我使用 JavaScript 解决了它。
问题
解决方案
由于在 id 为“ctl31_ctl10”的 div 元素的样式属性中指定了“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://***.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);
注意
似乎有一个 solution for s-s-rS 2005 我没有尝试过,但我认为它不适用于 s-s-rS 2008,因为我找不到“DocMapAndReportFrame”类。
【讨论】:
【参考方案4】:基于 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 的文件。
见Customize Style Sheets for HTML Viewer and Report Manager。
在该文件中插入一个 XML 行,例如(来自上述文档):
<Configuration>
...
<HTMLViewerStyleSheet>SafariChromeFix</HTMLViewerStyleSheet>
...
</Configuration>
保存。
他们在上面的链接中没有告诉你的是这个条目完全覆盖了默认样式表。我第一次尝试通过添加 div 样式表来渲染报告,但其他一切都被破坏了。一旦我发现对 reporserver.config 文件的编辑没有增加,而是实际上替换了默认样式表,我复制了默认样式表,一切都开始工作了。
接下来,进入 Styles 目录 (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 文件不会在升级和修补期间被覆盖。
【讨论】:
“保存后,此 Reporting Services 实例上的所有现有报表都将呈现在包括 Chrome 和 Safari 在内的所有浏览器上。” - 是的,但它们看起来仍然很可怕。【参考方案5】:在我的情况下,有问题的 DIV 是 "ctl31_ctl09" 所以如果上述解决方案对您不起作用,请尝试将 var element = document.getElementById("ctl31_ctl10");
更改为 var element = document.getElementById("ctl31_ctl09");
【讨论】:
【参考方案6】:我的解决方案是将以下<script>
添加到:
Reporting Services\ReportManager\Pages\Report.aspx
该脚本以可见报告内容的父级1为目标,并在每次报告加载时设置style.@987654321@:@987654322@
2 - 包括通过多页进行分页报告。
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.@987654323@
【讨论】:
这在 s-s-rS 2008 R2 中非常适合我。对于我们的 Mac 用户(他们无法轻松使用 IE)来说,这是一个救命稻草。【参考方案7】:Reporting Services 的 SQL Server 2014 版本增加了对 Google Chrome 浏览器的支持,但尚不支持 ios。详情见here。
【讨论】:
【参考方案8】:对我来说,这个名字是“ctl32_ctl09”(s-s-rS from SQL Server 2012 SP1, MSRS11)。
【讨论】:
可以确认对于 SQL Server 2012 SP1 也是如此【参考方案9】:我不得不用 F12 进入 Chrome,发现我的 div 中有 ctl32_ctl09,而不是 ctl31_ctl09。
这适用于Windows Server 2008 R2 64Bit 和SQL Server 2012。追加脚本,然后重启 s-s-rS 并清除浏览器缓存。
//修复允许Chrome显示s-s-rS报告
function pageLoad()
var element = document.getElementById("**ctl32**_ctl09");
if (element)
element.style.overflow = "visible";
【讨论】:
【参考方案10】:很遗憾,主要答案打破了 Internet Explorer 报告中的浮动(绝对位置)列。因此,我稍微修改了它,我不喜欢它,因为它专门寻找 WebKit,但它正在工作:
//s-s-rS 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";
【讨论】:
【参考方案11】:为了避免对元素 ID 进行硬编码,我在 RS 服务器 @ [Drive]:\Program Files\Microsoft SQL Server\[Reporting Services Instance]\Reporting Services\ReportManager 上编辑了 ReportingServices.js 文件\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 完成了测试,效果很好。
【讨论】:
【参考方案12】:Chrome 22.0.1229.79 中问题依然存在。
YMMV,但我发现从 ReportViewer 标记中删除高度可以解决此问题。
我在 SSAS 报告中遇到了这个问题,但在 s-s-rS 报告中没有。直到我检查了页面中的差异(一位顾问完成了 SSAS 报告),我才弄清楚为什么。他将 ReportViewer Height=60% 设置为 s-s-rS 报告未指定高度。
删除高度后,我的报告就会显示出来。
【讨论】:
【参考方案13】:对于Windows Server 2008 R2 x64 上的 s-s-rS 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
上述所有建议的版本根本不起作用。
【讨论】:
【参考方案14】: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;
【讨论】:
【参考方案15】:我尝试了这些方法,它对我有用,但我们的系统管理员对这些变化持怀疑态度。
我没有在ReportViewer
上将高度设置为 100%,而是使用了固定高度,它成功地在我的 Internet Explorer 和 Chrome 应用程序中工作。
【讨论】:
【参考方案16】:我从来没有在 Chrome 中显示报告的运气。大多数 Microsoft 的文档甚至都没有列出它,所以我认为 Chrome 必须在解释 ASP 中的某些内容时遇到问题。
见Browser Support for Reporting Services and Power View。
我正在运行 Chrome 11 并遇到与您相同的行为。
【讨论】:
【参考方案17】:我在 Chrome 上查看报告时遇到了同样的问题。我通过将扩展“s-s-rS Report Fix”添加到 Google Chrome 来修复它。 https://chrome.google.com/webstore/detail/s-s-rs-report-fix/fjbdfjiheheafbioiejbdpalmojkeobk
【讨论】:
以上是关于s-s-rS 2008 R2 - s-s-rS 2012 - ReportViewer:在 Safari/Chrome 中报告,但在 Firefox/Internet Explorer 8 中运行良好的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 R2 / s-s-rS 2008:服务水平报告创建
s-s-rS 2008 R2 - 导出到 Excel 时的 MAX TABS