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