在JavaScript中可以通過BOM查詢html文檔中的元素,也就是所謂的在html中獲取對象然後對它添加一個函數。
常用的方法有以下幾種:
①document.getElementById() 通過元素ID在全局查找元素
②document.getElementsByTagName() 通過元素標籤名字在全局查找元素
element.getElementsByTagName() 通過元素標籤在指定元素內部查找元素
③document.getElementsByClassName() 通過元素標籤的className在全局查找元素
element.getElementsByClassName() 通過元素標籤的className在指定元素內部查找元素
但是很多實際情況下,用這三種方法不是很方便,很多時候需要多次調用,就曉得有點麻煩,代碼量也有點大,所以這個時候我們就需要將查詢函數封裝成一個函數。這裏我們可以參照css包含選擇器的特性,給函數傳遞一串字符串。比如如下所示:
html結構:
傳遞的參數如下:
var atrr = $(".box .box1 .div1 span");
然後就是封裝函數了。
首先我們需要獲取最外層的一個html標籤,然後再在這個標籤內部去查找我們需要的元素。
var result = document.getElementsByTagName("html");
上面的代碼中我們獲取了html中最外層的標籤<html>標籤
然後將接收到的字符串按照空格分隔爲一個數組,數組的每個元素爲一個className、ID或者標籤名。然後接下來就是遍歷了。
當數組元素爲className時,我們就需要調用element.getElementsByClassName() 來獲取元素
當數組元素爲標籤名時,我們就需要調用element.getElementsByTagName() 來獲取元素
當數組元素爲ID時,我們就需要調用document.getElementById() 來獲取元素
最後當遍歷完成的時候,我們也就查找到了我們需要的內容。代碼如下:
function $(selector){
var strs = selector.split(" ");//通過空格切割傳遞的字符串
var result = document.getElementsByTagName("html");//獲取最外層的dom元素
for(var i = 0,len = strs.length;i<len;i++){//根據傳過來的字符串,一層一層的遍歷查找dom
if(strs[i].charAt(0)==="#"){//如果是id,返回的是dom元素
result = document.getElementById(strs[i].slice(1));
}else if(strs[i].charAt(0)==="."){//如果是class,則返回的是一個僞數組(集合),需要加一個下標,才能獲得dom
result = byClass(strs[i].slice(1),result[0]);
}else{//如果是tagName
if(i===0)//代表傳遞的字符串只有一個tagName,
result = result[0].getElementsByTagName(strs[i]);
else
if(strs[i-1].charAt(0)==="#")//代表上一個是id,返回的是dom,可以直接調用
result = result.getElementsByTagName(strs[i]);
else//代表上一個是class或者tagName,返回的是集合,需要加下標
result = result[0].getElementsByTagName(strs[i]);
}
}
return result;
}
這樣封裝好了之後,我們使用起來就相當的方便了。