JavaScript错误:[elementname]没有属性
我正在Webapp上进行一些维护编码,并且遇到以下形式的javascript错误:" [elementname]没有属性"
部分代码是通过AJAX调用动态生成的,该调用会更改页面一部分的innerHTML,完成后,我需要将一条数据从隐藏的输入字段复制到可见的输入字段。
因此,我们有一个目标字段:<input id =" dest" name =" dest" value =" 0">
源字段:<input id =" source" name =" source" value =" 1">
现在,当ajax运行时,它会覆盖源所在的div的innerHTML,因此源字段现在显示为:" <input id =" source" name =" source" value =" 2">`。
在将ajax数据复制到innerHTML的javascript行之后,接下来的行是:document.getElementById('dest')。value = document.getElementById('source')。value;
我收到以下错误:错误:document.getElementById(" source")没有属性
(我也尝试了document.formname.source
和document.formname.dest
以及同样的问题)
我想念什么?
注意1:页面已完全加载,并且该元素存在。 Ajax调用仅在用户操作之后发生,并替换元素所在的html部分。
注意2:至于不使用innerHTML,这就是给我代码库的方式,为了删除它,我需要重写所有的ajax调用,这不在当前维护周期的范围之内。
注意3:用新数据更新了innerHTML,正在复制具有数据和格式的整个表,我试图在这个大块的末尾添加一个布尔值,而不是为一个布尔值创建一个全新的ajax调用。看来这是我必须要做的...因为最后我的破解然后复制方法不起作用。
额外的双眼FTW。
是的,我有几个家伙在这里看工作,他们发现了我简单的打字错误...我发誓我有开始的权利,但是嘿,我们生活和学习...
感谢帮助。
解决方案
通常,我们不应该使用innerHTML,而应使用DOM方法创建元素。我不能说这是否是你的问题。
确保代码在页面完全加载后运行。如果代码在呈现我们要查找的元素之前运行,则将发生这种类型的错误。
我们所描述的是此功能:
<div id="test2"> <input id="source" value="0" /> </div> <input id="dest" value="1" /> <script type="text/javascript" charset="utf-8"> //<![CDATA[ function pageLoad() { var container = document.getElementById('test2'); container.innerHTML = "<input id='source' value='2' />"; var source = document.getElementById('source'); var dest = document.getElementById('dest'); dest.value = source.value; } //]]> </script>
这在常见的浏览器中有效(我在IE,Firefox和Safari中检查过);我们是否正在使用其他浏览器,或者确定它在innerHTML操作中创建的元素正确?
" [[elementname]没有属性""是javascript错误,表示"我们尝试引用的元素不存在或者为nil"
这意味着我们遇到了一些可能的问题中的一个或者多个:
- 页面尚未呈现,并且我们尝试在它存在之前对其进行引用
- 我们有拼写错误
- 我们已将自己的ID命名为保留字(例如,通过"提交"按钮提交)
- 我们认为自己所引用的内容实际上不是(传递的变量不是我们认为的传递对象)
听起来好像DOM没有用我的新元素进行更新。
为此,为什么要重写整个div只是为了更改源输入?直接更改来源的价值是否一样容易?
这只是一个延伸,但这可能只是我之前所见过的窍门,而这种破解实际上是有效的。
所以,你说:
Ok after the javascript line that copies the ajax data to innerHTML the next line is: document.getElementById('dest').value = document.getElementById('source').value;
将该行更改为此:
setTimeout(function() { document.getElementById("dest").value = document.getElementById("source").value; }, 10);
我们确实不应该这样做,但是在设置innerHTML到尝试访问" source"元素之间的时间可能太快,以至于浏览器无法找到它。我知道,听起来完全不对劲,但是我已经看到浏览器在某些情况下出于某些原因无法做到这一点。