document.getElementById
、$("#id")
或任何其他 DOM 方法/jQuery 選擇器找不到元素的可能原因是什麼?
範(fàn)例問(wèn)題包括:
.val()
、>.html()、.text()
) 傳回 undefined
null
的標(biāo)準(zhǔn) DOM 方法會(huì)導(dǎo)致下列錯(cuò)誤:未捕獲類(lèi)型錯(cuò)誤:無(wú)法設(shè)定 null 屬性“...”
# 未捕獲的類(lèi)型錯(cuò)誤:無(wú)法設(shè)定 null 的屬性(設(shè)定“...”)
未捕獲的類(lèi)型錯(cuò)誤:無(wú)法讀取 null 的屬性“...”
# 未捕獲的類(lèi)型錯(cuò)誤:無(wú)法讀取 null 的屬性(讀取“...”)
最常見(jiàn)的形式是:
未捕獲類(lèi)型錯(cuò)誤:無(wú)法將屬性“onclick”設(shè)定為 null
未捕獲的類(lèi)型錯(cuò)誤:無(wú)法讀取 null 的屬性“addEventList ener”
未捕獲的類(lèi)型錯(cuò)誤:無(wú)法讀取 null 的屬性“樣式”
簡(jiǎn)短:因?yàn)槟獙ふ业脑卦谖募猩胁淮嬖凇?
對(duì)於這個(gè)答案的其餘部分,我將使用例如getElementById
,但這同樣適用於getElementsByTagName
#, querySelector,以及選擇元素的任何其他DOM 方法。
可能的原因
#元素可能不存在的三個(gè)原因:
文件中確實(shí)不存在具有傳遞的 ID 的元素。您應(yīng)該仔細(xì)檢查您傳遞給getElementById
的ID 是否確實(shí)與(生成的)HTML 中現(xiàn)有元素的ID 匹配,並且您沒(méi)有拼寫(xiě)錯(cuò)誤該ID(ID 是區(qū)分大小寫(xiě)?。?。
如果您使用 getElementById
,請(qǐng)確保您僅提供元素的 ID(例如 document.getElemntById("the-id “)
)。如果您使用的方法接受CSS 選擇器(例如querySelector
),請(qǐng)確保在ID 之前包含# 以表示您正在尋找ID(例如,
document.querySelector(" #the-id")
)。您不能不將#與
getElementById
一起使用,並且必須將其與querySelector
一起使用和類(lèi)似的。另請(qǐng)注意,如果ID 中包含在CSS 標(biāo)識(shí)符(例如.
;包含.
字元的id
屬性是不好的做法,但有效),您必須使用querySelector
(document.querySelector("#the\\.id")
)) 時(shí)轉(zhuǎn)義這些內(nèi)容,但使用getElementById
( >document.getElementById("the.id")
)。
您呼叫 getElementById
時(shí)該元素不存在。
即使您可以在頁(yè)面上看到該元素,但該元素並不在您正在查詢(xún)的文檔中,因?yàn)樗混?iframe
中(這是它自己的文檔)。當(dāng)您搜尋包含 iframe
中的元素的文件時(shí),不會(huì)搜尋這些元素。
如果問(wèn)題是原因3(位於iframe
或類(lèi)似文件中),您需要查看iframe
中的文檔,而不是父文檔,也許可以透過(guò)取得iframe
元素並使用其contentDocument 屬性來(lái)存取其文件(僅限同源)。本答案的其餘部分解決了前兩個(gè)原因。
第二個(gè)原因——它還沒(méi)有出現(xiàn)——很常見(jiàn)。瀏覽器從上到下解析和處理 HTML。這意味著在 DOM 元素出現(xiàn)在 HTML 中之前發(fā)生的對(duì) DOM 元素的任何呼叫都會(huì)失敗。
考慮以下範(fàn)例:
sssccc
div
出現(xiàn)在script
之後。執(zhí)行腳本時(shí),該元素尚不存在,且 getElementById
將傳回 null
。
jQuery
#這同樣適用於所有 jQuery 選擇器。如果您拼字錯(cuò)誤您的選擇器,或者您在它們實(shí)際存在之前嘗試選擇它們,則 jQuery 不會(huì)找到它們。
一個(gè)額外的問(wèn)題是當(dāng)找不到 jQuery 時(shí),因?yàn)槟d入了沒(méi)有協(xié)定的腳本並且正在從檔案系統(tǒng)執(zhí)行:
sssccc
此語(yǔ)法用於允許腳本透過(guò) HTTPS 在協(xié)定為 https:// 的頁(yè)面上加載,並在協(xié)定為 http:// 的頁(yè)面上載入 HTTP 版本
它有一個(gè)不幸的副作用,就是嘗試載入 file://somecdn.somewhere.com...
解決方案
在呼叫 getElementById
(或任何與此相關(guān)的 DOM 方法)之前,請(qǐng)確保您要存取的元素存在,即 DOM 已載入。
只需將 JavaScript 放在對(duì)應(yīng)的 DOM 元素之後即可確保這一點(diǎn)
sssccc
在這種情況下,您也可以將程式碼放在結(jié)束正文標(biāo)記 (
您嘗試尋找的元素不在 DOM 當(dāng)你的腳本執(zhí)行時(shí)。
依賴(lài) DOM 的腳本的位置可能對(duì)其行為產(chǎn)生深遠(yuǎn)的影響。瀏覽器從上到下解析 HTML 文件。元素被添加到 DOM 中,並且腳本(通常)在遇到它們時(shí)執(zhí)行。 這意味著順序很重要。 通常,腳本無(wú)法找到標(biāo)記中稍後出現(xiàn)的元素,因?yàn)檫@些元素尚未新增到 DOM。
考慮以下標(biāo)記;腳本 #1 找不到 sssccc