今天第二章,繼續講獲取頁面中DOM元素。大家都知道在JQ中想獲取一個元素的兄弟元素,父級元素,子元素等等是非常方便的。其實在原生的也JS也有這些屬性。和JQ幾乎相同但是比JQ少一些。但是用起來卻比JQ麻煩一點。
主要因為FF浏覽器,因為FF會把你的換行也當做一個DOM元素。比如說
<div id = "dom">
<div></div>
<div></div>
</div>
我用原生的JS獲取ID為dom的元素下的子元素。用我第一章說的方法就是
var a = document.getElementById("dom").getElementsByTagName("div");這個沒問題。可以
alert(a.length)提示會是
2,但是我們現在換一種方法獲取就是我上章提到的
var b = document.getElementById("dom").childNodes;如果這樣
alert(b.length)IE浏覽器上沒問題還是
2,但是在FF浏覽器上會提示是
4,這就是因為FF把換行也當做一個元素了。
所以我們必須處理一下才能用JS的那些屬性。處理思想很簡單就是遍歷一下這些元素。把元素類型為空格而且是文本都刪除。處理函數是這樣的
function del_space(elem){var elem_child = elem.childNodes;for(var i=0;i<elem_child.length;i++){if(elem_child.nodeName == "#text" && !/\S/.test(elem_child.nodeValue)){elem.removeChild(elem_child)}}}我解釋一下這個函數
var elem_child = elem.childNodes;
把傳進來的elem元素的子元素都扔給elem_child;
for(var i=0;i<elem_child.length;i++){if(elem_child.nodeName == "#text" && !/\S/.test(elem_child.nodeValue)){elem.removeChild(elem_child)}}
遍歷這些子元素。如果這些元素裡面有節點類型是文本並且這個文本類型節點的節點值是空的。就把它刪除
(nodeName是JS裡的一個屬性,得到這個節點的節點類型,/\S/這個是非空字符在JS裡的正規表達式。前面加一個感歎號就表示是空字符。test是JS的一個方法,就是把它裡面的東西和外面的東西對比一下。nodeValue表示得到這個節點裡的值removeChild也是個方法就刪除外面這個元素的某個子元素)
這樣只需要在調用這些屬性之前調用這個函數把空格清理一下就能放心用了比如
<div id = "dom"><div></div><div></div></div><script>function dom(){var a = document.getElementById("dom");del_space(a);調用清理空格的函數var b = a.childNodes;獲取a的全部子節點;var c = a.parentNode;獲取a的父節點;var d = a.nextSbiling;獲取a的下一個兄弟節點var e = a.previousSbiling;獲取a的上一個兄弟節點var f = a.firstChild;獲取a的第一個子節點var g = a.lastChild;獲取a的最後一個子節點}</script>(另外說下。var b = a.childNodes;獲取的也是一個數組;所以比如我要用第一個節點就是childNodes[0];我要用第二個節點就是childNodes[1];以此類推)
到這裡獲取DOM方面就算是結束了。下章就教大家如何操作DOM元素。