前端部分兼容性问题汇总


/* 1.滚动条: */
var myScroll = document.documentElement.scrollTop || document.body.scrollTop

/* 2.获取样式 */
function getStyle(dom, styleName) {
    return dom.currentStyle ? dom.currentStyle[styleName] : getComputedStyle(dom)[styleName];
}

/* 3.网页可视区 */
var h = window.innerHeight || document.documentElement.clientHeight;
var w = window.innerWidth || document.documentElement.clientWidth;

/* 4.事件对象 
    这里函数传入的参数e,就是事件,浏览器会实时跟踪用户的行为。
    如e.screenX、e.screenY、e.offsetX、e.offsetY…这种做法在FireFox、Chrome、Safari等遵循W3C规范的浏览器下是没有问题的。
    唯独在IE下是行不通的, IE采用了一种非标准的方式,将事件作为window对象的event属性:window.event、window.event.screenX…
*/
var event = event || window.event;

/* 5.事件目标对象 
IE下,event对象有srcElement属性,但是没有target属性;
Firefox下,even对象有target属性,但是没有srcElement属性。 
请同时注意 事件对象event 的兼容性问题。
*/
var target = event.target || event.srcElement;

/* 6.阻止事件冒泡 
前者是方法,是标准的写法,后者是属性,赋值true表示阻止,是IE的写法。
判断stopPropagation是否存在,如果存在则用标准写法否则则用IE的写法,不可反过来判断。
*/
event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;

/* 7.阻止默认事件 
前者是方法,是标准的写法,后者是属性,赋值false表示阻止,后者IE写法。
一般情况建议直接使用return false阻止,但和取消默认事件的含义是不同的。
*/
event.preventDefault ? event.preventDefault() : event.returnValue = false;

/* 8.事件监听
说明:标准浏览器的写法addEventListener()和IE的写法attachEvent()。
解决方法:判断addEventListener是否存在,如果存在则用,否则用IE8以下的版本(含IE8)的绑定方法attachEvent,
removeEventListener()和detachEvent()也是一样的用法。
addEventListener 第三个参数代表事件监听方式,只能是true和false。
true,采用capture(捕获模式:从外向内);false,采用bubbling(冒泡模式:从内向外)。如无特殊要求,一般是false。
*/
function addEvent(obj, type, fn) {//添加事件监听,三个参数分别为 对象、事件类型、事件处理函数,默认为false
    if (obj.addEventListener) {
        obj.addEventListener(type, fn, false);//非IE
    } else {
        obj.attachEvent('on' + type, fn);//ie,这里已经加上on,传参的时候注意不要重复加了
    };
}
function removeEvent(obj, type, fn) {//删除事件监听
    if (obj.removeEventListener) {
        obj.removeEventListener(type, fn, false);//非IE
    } else {
        obj.detachEvent('on' + type, fn);//ie,这里已经加上on,传参的时候注意不要重复加了
    };
}

/* 9. 
为什么window.innerHeight和document.body.clientHeight的值会不一样呢?
其实原因是:滚动条!!!
你打开缩小窗口使得横纵都出现滚动条,会发现window.inner宽高总是比document.body.client宽高(firefox是document.documentElement.client宽高)
多一个固定值(这个和各个浏览器有关),比如是站也10px差距吧。
你把窗口拉大到滚动条消失(由于网页一般不止一屏那么长,所以纵向实验不好做,可以选百度或谷歌首页),再查询,会发现二者一致了。
所以呢你这innerHeight实际是比clientHeight多了个滚动条的height。
*/
var winW = document.body.clientWidth || document.docuemntElement.clientWidth;//网页可见区域宽
var winH = document.body.clientHeight || document.docuemntElement.clientHeight;//网页可见区域宽
//以上为不包括边框的宽高,如果是offsetWidth或者offsetHeight的话包括边框

/* 10 */
var winWW = document.body.scrollWidth || document.docuemntElement.scrollWidth;//整个网页的宽
var winHH = document.body.scrollHeight || document.docuemntElement.scrollHeight;//整个网页的高

var scrollHeight = document.body.scrollTop || document.docuemntElement.scrollTop;//网页被卷去的高
var scrollLeft = document.body.scrollLeft || document.docuemntElement.scrollLeft;//网页左卷的距离

var screenH = window.screen.height;//屏幕分辨率的高
var screenW = window.screen.width;//屏幕分辨率的宽
var screenX = window.screenLeft;//浏览器窗口相对于屏幕的x坐标(除了FireFox)
var screenXX = window.screenX;//FireFox相对于屏幕的X坐标
var screenY = window.screenTop;//浏览器窗口相对于屏幕的y坐标(除了FireFox)
var screenYY = window.screenY;//FireFox相对于屏幕的y坐标

/* 11.dom节点 */
var nextNode = obj.nextElementSibling ? obj.nextElementSibling : obj.nextSibling//获取下一个兄弟节点
var prevNode = obj.previousElementSibling ? obj.previousElementSibling : obj.previousSibling//获取上一个兄弟节点
var f_c_node = obj.firstElementChild ? obj.firstElementChild : obj.firstChild//获取第一个子节点
var l_c_node = obj.lastElementChild ? obj.lastElementChild : obj.lastChild//获取最后一个子节点

/* 12.通过类名获取元素 */
document.getElementsByClassName('');//IE 6 7 8不支持;
//第一个为全局获取类名,第二个为局部获取类名
function byClass1(oClass) {//全局获取,oClass为你想要查找的类名,没有“.”
    var tags = document.all ? document.all : document.getElementsByTagName('*');
    var arr = [];
    for (var i = 0; i < tags.length; i++) {
        var reg = new RegExp('\b' + oClass + '\b', 'g');
        if (reg.test(tags[i].className)) {
            arr.push(tags[i]);
        };
    };
    return arr;//注意返回的也是数组,包含你传入的class所有元素;
}
function byClass2(parentID, oClass) {//局部获取类名,parentID为你传入的父级ID
    var parent = document.getElementById(parentID);
    var tags = parent.all ? parent.all : parent.getElementsByTagName('*');
    var arr = [];
    for (var i = 0; i < tags.length; i++) {
        var reg = new RegExp('\b' + oClass + '\b', 'g');
        if (reg.test(tags[i].className)) {
            arr.push(tags[i]);
        };
    };
    return arr;//注意返回的也是数组,包含你传入的class所有元素;
}

/* 13.元素到浏览器边缘的距离(非兼容性问题)
https://www.cnblogs.com/xiaohuochai/p/5828369.html
offsetWidth表示元素在水平方向上占用的空间大小,无单位(以像素px计)
offsetWidth =  border-left-width + padding-left + width + padding-right + border-right-width; 
offsetParent:定位父级,表示与当前元素最近的经过定位(position不等于static)的父级元素,主要分为下列几种情况:
【1】元素自身有fixed定位,offsetParent的结果为null([注意]firefox浏览器有兼容性问题,返回<body>)
【2】元素自身无fixed定位,且父级元素都未经过定位,offsetParent的结果为<body>
【3】元素自身无fixed定位,且父级元素存在经过定位的元素,offsetParent的结果为离自身元素最近的经过定位的父级元素
offsetLeft表示元素的左外边框至offsetParent元素的左内边框之间的像素距离
clientLeft的值就等于border-left的值
*/
function offsetTL(obj) {//获取元素内容距离浏览器边框的距离(含边框)
    var ofL = 0, ofT = 0;
    while (obj) {
        ofL += obj.offsetLeft + obj.clientLeft;//含边框
        ofT += obj.offsetTop + obj.clientTop;
        obj = obj.offsetParent;
    }
    return { left: ofL, top: ofT };
}

/* 14.关于event事件中的target */
document.onmouseover = function (e) {
    var e = e || window.event;
    var Target = e.target || e.srcElement;//获取target的兼容写法,后面的为IE
    var from = e.relatedTarget || e.formElement;//鼠标来的地方,同样后面的为IE...
    var to = e.relatedTarget || e.toElement;//鼠标去的地方
}

/* 15.鼠标滚轮事件 */
//火狐中的滚轮事件
document.addEventListener("DOMMouseScroll", function (event) {
    alert(event.detail);//若前滚的话为 -3,后滚的话为 3
}, false)
//非火狐中的滚轮事件
document.onmousewheel = function (event) {
    alert(event.detail);//前滚:120,后滚:-120
}

/* 16.火狐下特有的节点加载事件,就是节点加载完才执行,和onload不同 */
//感觉用到的不多,直接把js代码放在页面结构后面一样能实现。。
document.addEventListener('DOMContentLoaded', function () { }, false);//DOM加载完成。好像除IE6-8都可以.

1、不同浏览器的标签默认的外补丁( margin )和内补丁(padding)不同
解决方案: css 里增加通配符 * { margin: 0; padding: 0; }

2、IE6双边距问题;在 IE6中设置了float , 同时又设置margin , 就会出现边距问题
解决方案:设置display:inline;

3、当标签的高度设置小于10px,在IE6、IE7中会超出自己设置的高度
解决方案:超出高度的标签设置overflow:hidden,或者设置line-height的值小于你的设置高度

4、图片默认有间距
解决方案:使用float 为img 布局

5、IE9一下浏览器不能使用opacity
解决方案:
opacity: 0.5;filter: alpha(opacity = 50);filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);

6、边距重叠问题;当相邻两个元素都设置了margin 边距时,margin 将取最大值,舍弃最小值;
解决方案:为了不让边重叠,可以给子元素增加一个父级元素,并设置父级元素为overflow:hidden;

7、cursor:hand 显示手型在safari 上不支持
解决方案:统一使用 cursor:pointer

8、两个块级元素,父元素设置了overflow:auto;子元素设置了position:relative ;且高度大于父元素,在IE6、IE7会被隐藏而不是溢出;
解决方案:父级元素设置position:relative


 

参考:

https://blog.csdn.net/wanmeiyinyue315/article/details/79654984

https://www.cnblogs.com/duenyang/p/6066737.html

工欲善其事 必先利其器
原文地址:https://www.cnblogs.com/fengyouqi/p/10882237.html