最新版本的birt4.2.2,对于ie的支持仅仅到ie8,好在birt生成的报表是纯网页格式,在ie10里其实是可以显示的,只是在采用frameset方式显示由于birt提供的js版本比较老,所以在ie11,ie10或ie9上不能运行,这个时候开源的好处就来了,下面我介绍下如何进行修改
1:去官方下载property.js 1.7版,放到webcontent\birt\ajax\core\lib\ 里 ,记得原版要备份
2:打开 BrowserUtility.js,进行修改
10-40行左右,修改成如下:
this.isIE = this.__isIE();
if (document.documentMode==11){
this.isIE=false;
}
if ( this.isIE )
{
this.isIE6 = false;
this.isIE7 = false;
this.isIE8 = false;
this.isIE9 = false;
if (document.documentMode) {
if (document.documentMode >= 9) {
this.isIE9 = true;
}else if (document.documentMode >= 8) {
this.isIE8 = true;
} else if (document.documentMode >= 7) {
this.isIE7 = true;
} else {
this.isIE6 = true;
}
}
else if ( window.XMLHttpRequest )
{
this.isIE7 = true;
}
else
{
this.isIE6 = true;
}
}
3、打开 AbstractBaseReportDocument.js 121行左右,修改如下
if ( BrowserUtility.isIE6 || BrowserUtility.isIE7 || BrowserUtility.isIE8 || BrowserUtility.isIE9 || BrowserUtility.isOpera || BrowserUtility.isKHTML || BrowserUtility.isSafari)
4、打开 AbstractBaseReportDocument.js 160行左右,修改如下
if (BrowserUtility.isIE&&(BrowserUtility.isIE6 || BrowserUtility.isIE7 || BrowserUtility.isIE8))
5、打开刚刚复制过来的property.js 找到7458行左右将以下代码加入
Object.extend(Element, {
visible: function(element) {
return $(element).style.display != 'none';
},
toggle: function() {
for (var i = 0; i < arguments.length; i++) {
var element = $(arguments[i]);
Element[Element.visible(element) ? 'hide' : 'show'](element);
}
},
hide: function() {
for (var i = 0; i < arguments.length; i++) {
var element = $(arguments[i]);
element.style.display = 'none';
}
},
show: function() {
for (var i = 0; i < arguments.length; i++) {
var element = $(arguments[i]);
element.style.display = '';
}
},
remove: function(element) {
element = $(element);
element.parentNode.removeChild(element);
},
update: function(element, html) {
$(element).innerHTML = html.stripScripts();
setTimeout(function() {html.evalScripts()}, 10);
},
getHeight: function(element) {
element = $(element);
return element.offsetHeight;
},
classNames: function(element) {
return new Element.ClassNames(element);
},
hasClassName: function(element, className) {
if (!(element = $(element))) return;
return Element.classNames(element).include(className);
},
addClassName: function(element, className) {
if (!(element = $(element))) return;
return Element.classNames(element).add(className);
},
removeClassName: function(element, className) {
if (!(element = $(element))) return;
return Element.classNames(element).remove(className);
},
// removes whitespace-only text node children
cleanWhitespace: function(element) {
element = $(element);
for (var i = 0; i < element.childNodes.length; i++) {
var node = element.childNodes[i];
if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
Element.remove(node);
}
},
empty: function(element) {
return $(element).innerHTML.match(/^\s*$/);
},
scrollTo: function(element) {
element = $(element);
var x = element.x ? element.x : element.offsetLeft,
y = element.y ? element.y : element.offsetTop;
window.scrollTo(x, y);
},
getStyle: function(element, style) {
element = $(element);
var value = element.style[style.camelize()];
if (!value) {
if (document.defaultView && document.defaultView.getComputedStyle) {
var css = document.defaultView.getComputedStyle(element, null);
value = css ? css.getPropertyValue(style) : null;
} else if (element.currentStyle) {
value = element.currentStyle[style.camelize()];
}
}
if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
if (Element.getStyle(element, 'position') == 'static') value = 'auto';
return value == 'auto' ? null : value;
},
setStyle: function(element, style) {
element = $(element);
for (name in style)
element.style[name.camelize()] = style[name];
},
getDimensions: function(element) {
element = $(element);
if (Element.getStyle(element, 'display') != 'none')
return {width: element.offsetWidth, height: element.offsetHeight};
// All *Width and *Height properties give 0 on elements with display none,
// so enable the element temporarily
var els = element.style;
var originalVisibility = els.visibility;
var originalPosition = els.position;
els.visibility = 'hidden';
els.position = 'absolute';
els.display = '';
var originalWidth = element.clientWidth;
var originalHeight = element.clientHeight;
els.display = 'none';
els.position = originalPosition;
els.visibility = originalVisibility;
return {width: originalWidth, height: originalHeight};
},
makePositioned: function(element) {
element = $(element);
var pos = Element.getStyle(element, 'position');
if (pos == 'static' || !pos) {
element._madePositioned = true;
element.style.position = 'relative';
// Opera returns the offset relative to the positioning context, when an
// element is position relative but top and left have not been defined
if (window.opera) {
element.style.top = 0;
element.style.left = 0;
}
}
},
undoPositioned: function(element) {
element = $(element);
if (element._madePositioned) {
element._madePositioned = undefined;
element.style.position =
element.style.top =
element.style.left =
element.style.bottom =
element.style.right = '';
}
},
makeClipping: function(element) {
element = $(element);
if (element._overflow) return;
element._overflow = element.style.overflow;
if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
element.style.overflow = 'hidden';
},
undoClipping: function(element) {
element = $(element);
if (element._overflow) return;
element.style.overflow = element._overflow;
element._overflow = undefined;
}
});
以上代码是从 原property.js复制过来的
做完以上改动 就可以在ie10,ie11运行了
由于本人不用ie9 所以未在ie9 测试, ie10,11测试 也不是很充分
如果你的birt报表 没有嵌入到iframe中的话,可以不用修改的,因为birt会强制使用ie7,8 模式,但似乎在iframe中 该强制不好使
希望 能有用