pc端兼容

一、事件

addEventListener 事件註冊

ie9+才支持

function setEventListener (ele, fn, eventName, bol) {
	// 如果支持這個方法, 會返回函數, 函數轉布爾值是true; 不支持返回undefined
	if(ele.addEventListener) {
		ele.addEventListener(eventName, fn, bol);
	} else if (ele.attachEvent) {
		ele.attachEvent('on' + eventName, fn);
	} else {
		// 中括號裏可以寫變量和直接量(1912)
		ele['on'+eventName] = fn
	}
}

事件對象event

一般瀏覽器會將事件對象, 傳遞到事件處理函數中. 但是, 早期ie(8都不支持)瀏覽器, 不會傳遞, 它會將事件對象綁定到window對象上, window.event

var lis = document.querySelector('li');
for(var i = 0; i < lis.length; i++){
	event = event || window.event; // 或運算, 如果第一個是true, 就能確定結果了, 就不會看第二個, 就是envet; 如果沒有event, 那第一個就是false, 就是第二個, window.event
}

事件對象的target屬性(事件目標)

ie8及以前, 事件對象都沒有target屬性, 而是用srcElement屬性

// 兼容性函數 (此處傳入的event也是經過兼容性處理過的, event =  event || window.event)
function getTarget(event) {
	if(event.target){
		return event.target;
	}else {
		return event.srcElement;
	}
}
// 使用
var lis = document.querySelector('li');
for(var i = 0; i < lis.length; i++){
	event = event || window.event; 
	console.log(event.target.innerText);
	console.log(event.srcElement.innerText);
	var target = getTarget(event);
	console.log(target.innerText)
}

事件方法event.stopPropagation() 阻止冒泡和捕獲

ie8及以前的瀏覽器不能使用, 而是用event.cancleBubble = true

// 兼容阻止事件傳播的方法
function stopProp(event){
	if (event.stopPropagation) {
		event.stopPropagation;
	} else {
		event.cancelBubble = true;
	}
}
// 使用
var divs = document.getElementsByTagName('div');
for(var i = 0; i < divs.length; i++) {
	divs[i].onclick = function(event) {
		event = event || window.event;
		stopProp(event);
	}
}

二、DOM階段

innerText 獲取元素的內容

早期火狐沒有, 用textContent代替

// 獲取內容
function getText(ele) {
	// 如果元素的內容是空, ele.innerText獲取的是'', 轉換成布爾是false, 所以不能直接用ele.innerText作爲判斷條件, 而是它返回值的類型是否是字符串. 如果支持這個方法, 必定返回string類型, 如果不支持這個方法, 返回的是undefined.
	if( typeof ele.innerText === 'string') {
		return ele.innerText;
	} else {
		return ele.textContent;
	}
}

// 設置內容
function setText(ele, str) {
	if(typeof ele.innerText === 'string') {
		ele.innerText = str;
	} else {
		ele.textContent = str;
	}
}

children 獲取子元素們

在早期的瀏覽器當中, 會返回註釋節點

// ele是父節點
function getChildElement(ele) {
	var childs = ele.childNodes; // 獲取所有子節點
	var arr = []; // 存放元素節點
	for(var i = 0; i < childs.length; i++) {
		if(childs[i].nodeType == 1) { // 判斷哪些是子元素
			arr.push(childs[i]) // 將子元素添加到arr裏面
		}
	}
	return arr;
}

nextElementSibling 下一個兄弟元素

ie8及以前版本不支持

// 封裝兼容性方法
function getNextElementSibling(ele) {
	// 先找到下一個兄弟節點
	var next = ele.nextSibling;
	// 判斷next是不是null(有沒有下一個兄弟節點了, 如果有, 就判斷是不是元素, 如果沒有, 就直接return, 並返回個null)
	if (next == null) {
		return null; 
	}
	// 判斷next是不是元素
	if (next.nodeType == 1) {
		return next;
	} else {
		// 如果不是元素, 就遞歸繼續往後面找
		return getNextElementSibling(next);
	}
}

firstElementChild 第一個子元素

function getFirstElementChild(ele) {	
	// 方法一 調用上面的找子元素們的方法
	// var childElements = getChildElement(ele);
	//  retrun childElements[0]

	// 正經獨立方法
	for(var i = 0; i < ele.childNodes.length; i++) {
		if(ele.childNodes[i].nodeType == 1) {
			return ele.childNodes[i];
		}
	}
	return null;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章