簡體   English   中英

獲取SCRIPT5009:Internet Explorer IE 11中未定義“id”

[英]Getting SCRIPT5009: 'id' is undefined in Internet Explore IE 11

我有一個非常簡單的腳本(setUser),點擊一個按鈕就可以調用。這個腳本在chrome中運行正常但在IE 11中我收到了一個控制台錯誤。 另一個奇怪的事情是,只有當dev工具打開時我才會收到錯誤。如果devtool沒有打開,它可以正常工作。

錯誤是: - SCRIPT5009:'id'未定義

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        function setUser(eventType){
            console.log(eventType);
        }
    </script>
</head>
<body>
    <button id="vish" onclick="setUser(id)" style="height:40px;width:200px">Click Me</button>
</body>
</html>

簡單的解決方法是聲明一個var id; 在腳本下方。但是我需要正確記錄的原因,為什么這在ie11中不起作用但在chrome中也是如此。並且是比我試過的更好的解決方案

解決方法: - 在頂部添加var id

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var id;
        function setUser(eventType){
            console.log(eventType);
        }
    </script>
</head>
<body>
    <button id="vish" onclick="setUser(id)" style="height:40px;width:200px">Click Me</button>
</body>
</html>

預期: - 當ie工具在ie11中打開時,當我們點擊按鈕時,我們應該將控制台日志視為“vish”

實際結果: - SCRIPT5009:'id'未定義js錯誤

id是簡單的未定義,正如錯誤消息所示。 如果您聲明它,錯誤就會消失,但它的行為不會像您預期的那樣。 如果您聲明它,它的值是未定義的。 你可能想要

onclick="setUser(this.id)"

this.id表示按鈕上下文,而id只是試圖在全​​局上下文中找到它。 如果出現錯誤,則不會聲明 id ,而是

var id; // or var id=undefined;

聲明它,並使其未定義,因此瀏覽器至少知道它是一個變量。 通過說id未定義 Explorer意味着它沒有聲明。

我相信原因是瀏覽器搜索變量命名元素(由name或id屬性引用;這不是標准的,但是瀏覽器會這樣做),這實際上並不存在於全局上下文中,而是通過引用和資源管理器查找顯然無法處理這種情況。 如果它被聲明為var ,則javascript知道它不是命名元素引用。

下面的示例顯示了非標准行為:它應該以未定義的錯誤測試結束(實際上不是),但是瀏覽器會打招呼

<input id="test" value="hello">
<script>
  alert(test.value);
</script>

它在IE11中不起作用的原因是因為您沒有在拋出錯誤的代碼塊中為HTML文檔指定doctype。

如果我將<!DOCTYPE html>添加到HTML的開頭,就像您顯示的解決方法一樣; 它也適用於IE11,無需添加var id;

確切的原因我不知道,但沒有doctype,IE將以怪癖模式運行頁面。 當瀏覽器嘗試將onclick="setUser(id)"解析為有效的JS代碼時,這似乎搞砸了函數范圍的確定。

如果doctype正確並且頁面因此可以以正確的模式運行,則不會發生這種情況。 如果瀏覽器HTML引擎在使用之前不必將HTML字符串setUser(id)解析為有效的JS代碼,也不會發生這種情況。 因此,它不再是一個常見的問題,因為這些天的標准是不在HTML標記上使用內聯事件處理程序屬性。

因此,如果可能的話,更喜歡使用javascript進行顯式事件綁定而不會遇到類似這樣的問題,其中一個完全不相關的部分,即doctype,會擾亂您的代碼。

使用onclick="setUser(this.id)"應該可行。

但是,更簡潔的解決方法是在JavaScript中執行所有onclick處理:

 onload = function() { var buttons = document.getElementsByTagName("button"); for(var i = 0; i < buttons.length; i++) { buttons[i].onclick = function() { console.log(this.id); } } } 
 <!DOCTYPE html> <html> <head> <title></title> </head> <body> <button id="vish" style="height:40px;width:200px">Click Me</button> <button id="vish2" style="height:40px;width:200px">Click Me 2</button> </body> </html> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM