# 兼容集合(js)

+ scrollTop
	- document.documentElement.scrollTop DTD
	- window.pageYOffset  safari
	- document.body.scrollTop
+ e.stopPropagation?e.stopPropagation():e.cancelBubble=true;
+  e.preventDefault?e.preventDefault():e.returnValue=false;

# event target

    oBox.onclick = function (ev) {
        var ev = ev || window.event;
        var target = ev.target || ev.srcElement;
	}

# className方法 IE浏览器

思路

  • 首先判断浏览器是否至此getElementsByClassName方法
  • 如果不支持,则获取该元素下所有的子元素, 并对每个元素的className进行查询,这里要考虑多个类名的情况 因此对每个子元素的类名通过split(' ');进行类名的拆封,split返回的是一个数组,因此需要一次遍历,如果匹配,则通过push方法存放到数组中,如果不匹配进行下次循环 最后返回获得的数组
function getClassName(obj, className) {  
    // 没有传递 obj 参数,则默认使用 document
    var ele = obj || document;  
    //兼容ie浏览器
    if (!ele.getElmentsByClassName) { 
        var result = [];
        var elmemets = ele.getElementsByTagName("*");
        for (var i = 0; i < elements.length; i++) {
            //使用split函数将元素中含有的多个类名分开,并一个个查找
            var classNames = elements[i].className.split(" ");
            // 遍历当前元素的每个类名  
            for (var j = 0; j < classNames.length; j++) {
                //如果该元素中存在要获取的类明,则加入到数组中
                if (classNames[j] == className) {
                    result.push(elements[j]);
                }
            }
        }
    } else {
        return ele.getElementsByClassName(className);
    }
    return result;
}

# scrollTop

var scrollTop = document.documentElement.scrollTop ||
				window.pageYOffset || 
				document.body.scrollTop;
IE6/7/8: 
+ 对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度 ; 
+ 对于有doctype声明的页面则可以使用 document.documentElement.scrollTop; 

Safari: 
+ safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ; 

Firefox: 
+ 火狐等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;2021年测试window.pageYOffset也会生效

页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement。页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body。(Edge、谷歌和火狐都是这种情况2021年) [另外一个不被用的值始终为0]

  • IE10以上,三个值都相等,无DTD;当设置DTD时,document.body.scrollTop=0
  • IE9不管设置与否,document.body.scrollTop=0;剩下两值相等
  • IE7,8不管设置与否,document.body.scrollTop=0;window.pageYOffset=undefined
  • IE5 不管设置与否,document.documentElement.scrollTop=0;window.pageYOffset=undefined
<!DOCTYPE html>
<html>
<style>
	#test{
		width:400px;
		height:400px;
		border:1px solid red
	}
</style>
<body class="m-2">
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
	<div id="test">1111</div>
  <script>
		setInterval(function(){
			var scrollTop = document.documentElement.scrollTop||
							window.pageYOffset || 
							document.body.scrollTop;
							console.log(document.documentElement.scrollTop,window.pageYOffset,document.body.scrollTop)
							
		},1000)
  </script>
</body>

</html>

# scrollHeight

  • document.body.scrollHeight
  • document.documentElement.scrollHeight IE8以上二者相等,以下会有兼容问题(而且不一样)

# addEventListener()

	document.getElementById("myBtn").addEventListener("click", function(){
    	document.getElementById("demo").innerHTML = "Hello World";
	});

	element.addEventListener(event, function, useCapture)
	
	/*您可以在同一个元素中添加不同类型的事件。*/

	/*useCapture
	可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
	可能值:
	true - 事件句柄在捕获阶段执行
	false- false- 默认。事件句柄在冒泡阶段执行*/

	// 移除 <div> 元素的事件句柄
	document.getElementById("myDIV").removeEventListener("mousemove", myFunction);

# 为什么要用addEventListener

  • 允许给一个事件注册多个监听器,可以是同一个类型,比如两个click事件.
  • 它提供了一种更精细的手段控制 listener 的触发阶段。(即可以选择捕获或者冒泡)。
  • 它对任何 DOM 元素都是有效的,而不仅仅只对 HTML 元素有效。
var t1=document.getElementById("test")
	t1.addEventListener("click",function(){
		console.log(1)
	})
	t1.addEventListener("click",function(){
		console.log(2)
	})
	//1 2

# 低版本的浏览器 attachEvent detachEvent

这两个方法都接受两个相同的参数。

  • 事件处理程序名称
  • 事件处理程序方法
  • 注意事件名与addEventListener不同要加 on
//IE只支持事件冒泡
let box = document.querySelector('.box')
function xxx(){console.log('box clicked...')}
box.attachEvent('onclick',xxx) 

# e.keycode||e.which

利用navigator对象的appName属性,当然也可以用userAgent属性,这里用appName来实现判断浏览器类 型,IE和Maxthon的appName是“Microsoft Internet Explorer” ,而FireFox和Opera的appName"Netscape":

       function keyUp(e) {   
          if(navigator.appName == "Microsoft Internet Explorer")
           {
                var keycode = event.keyCode;    
                var realkey = String.fromCharCode(event.keyCode);    
             }else
            {
                  var keycode = e.which;    
                var realkey = String.fromCharCode(e.which);    
            }
           alert("按键码: " + keycode + " 字符: " + realkey); 
      } 
        document.onkeyup = keyUp;

比较简洁的方法是[2]:

     function keyUp(e) { 
        var currKey=0,e=e||event;
        currKey=e.keyCode||e.which||e.charCode;
        var keyName = String.fromCharCode(currKey);
        alert("按键码: " + currKey + " 字符: " + keyName); 
       }
      document.onkeyup = keyUp;

# 兼容阻止冒泡事件

对象.事件=function(e){
    var e = e || event;
    e.stopPropagation?e.stopPropagation():e.cancelBubble=true;
}

# 兼容阻止默认行为

对象.事件=function(e){
    var e = e || event;
    e.preventDefault?e.preventDefault():e.returnValue=false;
}

# 兄弟元素的兼容写法

查阅

最后更新: 5/26/2021, 1:06:35 PM