2012-11-29 45 views
0

以下功能不適用於某些原因。有人可以看到問題是什麼嗎?無法獲得的document.getElementById工作

function checkMaxLen(txt, maxLen) { 
    var actualLen = txt.value.length; 
    var remain = maxLen - actualLen; 
    document.getElementById('remainChar').Value = remain; 
} 

<input type="text" id="remainChar" runat="server" value="500"/> 

每當我嘗試運行的功能,我得到這個錯誤:

Microsoft JScript runtime error: Unable to set value of the property 'Value': object is null or undefined

+3

可能是一個時間問題,'remainChar'還不當你試圖讀取它存在。順便說一下,「價值」應該是「價值」; )。 – Teemu

+0

什麼時候調用這個函數? – Ian

+0

@Teemu根據函數的名稱和函數的用途,我確定它在正確的時間被調用。我敢打賭,'id'不是「remainingChar」,正在被ASP.NET修改,就像它有時一樣。但問題是,它沒有找到該元素 – Ian

回答

3

檢查輸入的ID在您的最終HTML。由於你有runat="server" ASP.NET可能會添加其典型的容器前綴。

+0

只有在容器中才會有容器前綴:) – Ian

+0

非常真實 - 儘管問題中沒有足夠的信息來確定問題是否存在。 –

+0

但你說得對!我認爲這是問題。如果MasterPages被使用或者處於中繼器或類似的狀態,控制器將會有一個修改的ID。所以**解決方案**是使用'document.getElementById(「<%= remainingChar.ClientID%>」)或任何語法 – Ian

0

區分大小寫:

document.getElementById('remainChar').value 
+0

我試過了,但我仍然收到錯誤Microsoft JScript運行時錯誤:無法設置屬性'值'的值:對象爲空或未定義 – user1804234

+1

爲什麼-1?它*是*區分大小寫。 – George

+0

@ F4r-20因爲它不能解決問題 - 它會解決最終的問題。問題是該元素未找到 – Ian

1

主要問題:沒有使用Javascript的getElementById問題,而是餵養的權限ID爲的getElementById(造成的,因爲ASP.NET覺得可以自由改變RUNAT =「服務器」元素的ID)的問題(通過覆蓋接受的答案)。這是什麼原因造成的OP報告的錯誤:

Microsoft JScript runtime error: Unable to set value of the property 'Value': object is null or undefined 

這是因爲的getElementById被賦予了不存在的ID和返回null。

另一個問題:第二個問題確實是一個Javascript問題,但與getElementById無關。 Javascript區分大小寫,所以試圖設置輸入元素的DOM對象的value屬性不能通過嘗試設置來完成但即使(不存在)Value屬性。

解決方案:

,解決了這兩個問題正確的代碼如下:

function checkMaxLen(txt, maxLen) { 
    var actualLen = txt.value.length; 
    var remain = maxLen - actualLen; 
    document.getElementById('<%= remainChar.ClientId%>').value = remain 
    } 

注:由於去伊恩指出了我原來的答覆了重要的監督。

+0

什麼時候/它要求改變''的顏色? – George

+0

@ F4r-20我認爲他們證明財產是問題,其他財產通常會起作用。這是真的。但是在這種情況下,這不是底層問題 – Ian

+0

@ F4r-20請反轉downvote。關鍵是,當我在jsFiddle中嘗試OP的代碼時,其他屬性工作正常。 Ian對我錯過了runat =「服務器」的看法,但幾乎立刻就解決了這個問題......我以前從來沒有得到過任何一個downvote,它傷害了我的感情:-) –

0

.value的應該是.value的,腳本應執行後出現在源或domready中事件已被解僱後。

也因爲這是asp.net框的id屬性不會被「remainChar」,而是轉化成別的東西。

讓你無論是要找出最後的ID將是什麼或刪除runat="server"屬性

<html> 
<body> 
<input type="text" id="remainChar" value="500"/> 
<script> 
    function checkMaxLen(txt, maxLen) { 
     var actualLen = txt.value.length; 
     var remain = maxLen - actualLen; 
     document.getElementById('remainChar').value = remain; 
    } 
    checkMaxLen({value:""},20); 
</script> 
</body> 
</html> 
+0

當在不同的文本框中輸入時,函數被調用...所以DOM已經做好了準備 – Ian

+0

你沒有在你的問題中指定 –

+0

這不是我的問題。它在評論中。不是說這是你的錯,但這不是問題所在 – Ian