在寫JS或者是JQuery的時(shí)候,使用$("#btn1")或者Domcument.getElementById獲取相關(guān)標(biāo)簽元素的時(shí)候,偶爾會(huì)出現(xiàn),獲取不到相應(yīng)元素的情況。報(bào)出以下錯(cuò)誤等等:
Cannot read property 'XXX' of null 錯(cuò)誤
Cannot read property 'visibility' of undefined
其實(shí)導(dǎo)致這樣的問題的原因只有一種,那就是沒有獲取到相應(yīng)的標(biāo)簽元素值,也就是 $("#btn1")取到的值是null,所以再去獲取這個(gè)元素下面的屬性的時(shí)候,自然就會(huì)報(bào)錯(cuò)了,而導(dǎo)致出現(xiàn)這樣的情況的原因,可能有以下幾種。
1.Html頁面尚未加載完,在元素加載完成之前就調(diào)用元素
根據(jù)html頁面的特性,是從上到下依次加載的,也就是遇到什么加載什么,所以,有可能JS方法會(huì)先于頁面DOM元素加載。
如果在這個(gè)時(shí)候提前調(diào)用了JS方法,由于標(biāo)簽元素尚未加載完成,是找不到相應(yīng)元素的,所以就會(huì)報(bào)出這種找不到元素的錯(cuò)誤。
解決這類型的錯(cuò)誤的方法也很簡單,只需要:
把相應(yīng)的JS代碼放在html頁面的最后面,保持在標(biāo)簽元素加載完后再調(diào)用相應(yīng)的JS方法即可。
或者是使用:
JS的window.onload()方法
onload 事件會(huì)在指示頁面包含圖片等文件在內(nèi)的所有元素都加載完成立即發(fā)生。
JQuery的ready()方法
ready事件會(huì)在文檔結(jié)構(gòu)已經(jīng)加載完成(不包含圖片等非文字媒體文件)后立即發(fā)生。
思想就是讓JS方法在頁面加載完全之后再運(yùn)行,這樣就可以保證相應(yīng)元素一定加載完成了。
2.多層iframe嵌套,獲取不到不同層級(jí)iframe的元素
當(dāng)整個(gè)HTML頁面使用了多層iframe嵌套的情況時(shí),就會(huì)容易出現(xiàn)這種找不到相應(yīng)內(nèi)層iframe中的元素情況。
當(dāng)我們?nèi)カ@取元素的時(shí)候,會(huì)默認(rèn)去外層的iframe中尋找元素,如果是多層嵌套的iframe頁面,那我們要去內(nèi)層iframe中尋找元素的時(shí)候,就要通過iframe ID 切換到指定的iframe層中,再獲取元素。
var obj=document.getElementById("Iframe").contentWindow;
obj.document.getElementById("menu").style.visibility="hidden";//隱藏元素
還有一種情況就是調(diào)用的JS方法處于內(nèi)層iframe中,而外層窗口又沒有相應(yīng)ID時(shí)。
可以使用window.parent的方法,獲取當(dāng)前窗口的父窗口,再使用父窗口的方法獲取相應(yīng)元素。
window.parent.document.getElementById("null_box").getElementsByTagName("input")[0].style.visibility="visible";//恢復(fù)元素
當(dāng)獲取不到相應(yīng)的標(biāo)簽元素的時(shí)候,要記住前端的一種思想
當(dāng)這個(gè)元素標(biāo)簽獲取不到的時(shí)候,可以嘗試的去找這個(gè)元素標(biāo)簽的父標(biāo)簽。
按照這種尋找父親的思想一層層往上找,當(dāng)能獲取到最外層父類時(shí),再按照這種層級(jí)關(guān)系一層層往下找,就可以找到這個(gè)元素了。