Javascript 无法使document.getElementByID正常工作

Javascript 无法使document.getElementByID正常工作,javascript,asp.net,Javascript,Asp.net,由于某些原因,以下函数不起作用。有人能看出问题出在哪里吗 function checkMaxLen(txt, maxLen) { var actualLen = txt.value.length; var remain = maxLen - actualLen; document.getElementById('remainChar').Value = remain; } 每当我尝试运行该函数时,都会出现以下错误: Microsoft JScript运行时错误:无

由于某些原因,以下函数不起作用。有人能看出问题出在哪里吗

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


每当我尝试运行该函数时,都会出现以下错误:

Microsoft JScript运行时错误:无法设置属性“value”的值:对象为null或未定义

区分大小写:

document.getElementById('remainChar').value
区分大小写:

document.getElementById('remainChar').value

检查最终HTML中输入的ID。由于您有
runat=“server”
ASP.NET可能会添加其典型的容器前缀。

请检查最终HTML中输入的ID。由于您有
runat=“server”
ASP.NET可能会添加其典型的容器前缀。

主要问题:没有Javascript getElementById问题,而是在将正确的id输入getElementById时出现了问题(原因是ASP.NET可以随意更改runat=“server”元素的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 
  }
函数checkMaxLen(txt,maxLen){
var actualLen=txt.value.length;
var剩余=最大值-实际值;
document.getElementById(“”).value=remaine
}

注意:感谢Ian在我的原始答案中指出了一个重要的疏忽。

主要问题:没有Javascript getElementById问题,而是在将正确的id输入getElementById时出现了问题(原因是ASP.NET可以随意更改runat=“server”元素的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 
  }
函数checkMaxLen(txt,maxLen){
var actualLen=txt.value.length;
var剩余=最大值-实际值;
document.getElementById(“”).value=remaine
}

注意:感谢Ian在我的原始答案中指出了一个重要的疏忽。

.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>

函数checkMaxLen(txt,maxLen){
var actualLen=txt.value.length;
var剩余=最大值-实际值;
document.getElementById('remainChar')。value=remain;
}
checkMaxLen({值:},20);

.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>

函数checkMaxLen(txt,maxLen){
var actualLen=txt.value.length;
var剩余=最大值-实际值;
document.getElementById('remainChar')。value=remain;
}
checkMaxLen({值:},20);


可能是时间问题,
remainChar
在您尝试读取它时还不存在。顺便说一句,
Value
应该是
Value
;)。何时调用此函数?@Teemu基于函数的名称和函数的用途,我确信它在正确的时间被调用。我敢打赌
id
不是“雷曼查尔"ASP.NET有时也会对其进行修改。但问题是,当我在另一个文件中键入内容时,它找不到元素textbox@Ian我同意,因为似乎也定义了
txt.value
。可能需要更多的代码来解决这个问题。可能是时间问题,
remainChar
在您尝试阅读时还不存在。BTW,
Value
应该是
Value
;)。什么时候调用这个函数?@Teemu根据函数的名称和函数的用途,我确信它在正确的时间被调用。我敢打赌,
id
不是“remainChar”,而是像有时一样被ASP.NET修改。但问题是,当我在另一个文件中输入时,它并没有找到元素textbox@Ian我同意,因为似乎也定义了
txt.value
。也许需要更多的代码来解决这个问题。它只有在容器中才会有容器前缀:)非常正确-虽然问题中没有足够的信息来知道问题是否存在。但是你是对的!我认为这就是问题所在。如果使用母版页,或者母版页位于转发器或类似设备中,则控件将具有修改的id。因此,解决方案是使用
document.getElementById(“”)
或任何语法,这可能是问题所在。您可能必须使用
来获取输入的实际呈现ID。谢谢您,这就是问题所在。只有在容器中才会有容器前缀:)非常正确-尽管问题中没有足够的信息来确定问题是否存在。但您是对的!我想