记跨浏览器开发的案例
讲之前:由于目前公司的项目开发时间比较早,大概十几年前的东东了。最开始只支持IE,还是IE低版本,IE8、9、10、11、Edge都会有点问题。需求开发完后,做浏览器适配时候,主要是要兼容IE8-11,chrome,firfox,当然还有国产浏览器如360、qq、搜狗等。现总结下遇到的问题及解决方案。
1.eval(idName)
问题:IE、Chrome浏览器下都可以使用eval(idName)或getElementById(idName)来取得id为idName的HTML对象;firefox下只能使用getElementById(idName)来取得id为idName的HTML对象.
解决方案:统一使用getElementById(idName)来取得id为idName的HTML对象
2.ActiveXObject对象未定义
问题:IE下支持用var obj = new ActiveXObject() 的方式创建对象,但其它浏览器都会提示ActiveXObject对象未定义
解决方案:
1>在使用new ActiveXObject()之前先判断浏览器是否支持ActiveXObject对象,以创建AJAX对象为例:
if(window.ActiveXObject){
this.req=new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
this.req=new XMLHttpRequest();
}
2>使用jquery的ajax对象
3.XML操作
问题:装载xml文档使用ActiveXObject对象,但除非IE外,其它浏览器都不支持此方法。XML文档操作,IE和其它浏览器也存在不同,通常取XML对象的XML文本的方法是xml.documentElement.xml,但xml属性只有IE支持,其它浏览器均不支持。查找节点是常用的方法有selectNodes和selectSingleNode,这两个方法也只有IE支持,其它浏览器需要自己扩展。
解决方案:装载XML文档:用$.ajax()
4.window.execScript()
问题:除IE外都不支持window.execScript()方法,但是都支持window.eval()方法
解决方案:统一使用window.eval()方法
5.window.createPopup()未定义
问题:创建一个弹出窗口的方法,IE支持此方法,FireFox、Chrome都不支持,使用时会提示createPopup方法未定义
解决方案:使用之前判断是否支持window.createPopup()方法,不支持时使用原型扩展该方法。具体代码如下:
if (!window.createPopup) {
var __createPopup = function () {
var SetElementStyles = function (element, styleDict) {
var style = element.style;
for (var styleName in styleDict)
style[styleName] = styleDict[styleName];
}
var eDiv = document.createElement('div');
SetElementStyles(eDiv, { 'position': 'absolute', 'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'zIndex': 1000, 'display': 'none', 'overflow': 'hidden' });
eDiv.body = eDiv;
var opened = false;
var setOpened = function (b) {
opened = b;
}
var getOpened = function () {
return opened;
}
var getCoordinates = function (oElement) {
var coordinates = { x: 0, y: 0 };
while (oElement) {
coordinates.x += oElement.offsetLeft;
coordinates.y += oElement.offsetTop;
oElement = oElement.offsetParent;
}
return coordinates;
}
return {
htmlTxt: '',
document: eDiv,
isOpen: getOpened(),
isShow: false,
hide: function () {
SetElementStyles(eDiv, { 'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'display': 'none' });
eDiv.innerHTML = '';
this.isShow = false;
},
show: function (iX, iY, iWidth, iHeight, oElement) {
if (!getOpened()) {
document.body.appendChild(eDiv); setOpened(true);
};
this.htmlTxt = eDiv.innerHTML;
if (this.isShow) {
this.hide();
};
eDiv.innerHTML = this.htmlTxt;
var coordinates = getCoordinates(oElement);
eDiv.style.top = (iX + coordinates.x) + 'px';
eDiv.style.left = (iY + coordinates.y) + 'px';
eDiv.style.width = iWidth + 'px';
eDiv.style.height = iHeight + 'px';
eDiv.style.display = 'block';
this.isShow = true;
}
}
}
window.createPopup = function () {
return __createPopup();
}
}

浙公网安备 33010602011771号