JavaScript错误:[elementname]没有属性

时间:2020-03-06 14:47:51  来源:igfitidea点击:

我正在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.sourcedocument.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"元素之间的时间可能太快,以至于浏览器无法找到它。我知道,听起来完全不对劲,但是我已经看到浏览器在某些情况下出于某些原因无法做到这一点。