未捕获的类型错误:无法读取未定义的属性“值”

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“值”【英文标题】:Uncaught TypeError: Cannot read property 'value' of undefined 【发布时间】:2011-09-26 21:44:22 【问题描述】:

我有一些 javascript 代码给出了这个错误

Uncaught TypeError: Cannot read property 'value' of undefined

代码

var i1 = document.getElementById('i1');
var i2 = document.getElementById('i2');
var __i = 'user' : document.getElementsByName("username")[0], 'pass' : document.getElementsByName("password")[0] ;
if(  __i.user.value.length >= 1 )  i1.value = '';  else  i1.value = 'Acc'; 

if(  __i.pass.value.length >= 1 )  i2.value = '';  else  i2.value = 'Pwd'; 

这个错误是什么意思?

【问题讨论】:

【参考方案1】:

似乎您的值之一,属性键为“值”是未定义的。测试在执行 if 语句之前是否定义了 i1i2__i

var i1 = document.getElementById('i1');
var i2 = document.getElementById('i2');
var __i = 'user' : document.getElementsByName("username")[0], 'pass' : document.getElementsByName("password")[0] ;
if(i1 && i2 && __i.user && __i.pass)

    if(  __i.user.value.length >= 1 )  i1.value = '';  else  i1.value = 'Acc'; 

    if(  __i.pass.value.length >= 1 )  i2.value = '';  else  i2.value = 'Pwd'; 

【讨论】:

这可以帮助我找出我的问题。我已将脚本代码从 head 部分移至 body 部分,问题已解决。【参考方案2】:

document.getElementById('i1')document.getElementById('i2')document.getElementsByName("username")[0] 均未返回任何元素。检查所有元素是否存在。

【讨论】:

谢谢...我忘记了当用户登录时,没有名为用户名或密码的输入...我添加了if语句'if(i2 && i2)'并且它有效..有时最简单的代码可能会给你带来麻烦:D【参考方案3】:

试试这个,它总是有效的,你会得到 NO TypeError:

try

    var i1 = document.getElementById('i1');
    var i2 = document.getElementById('i2');
    var __i = 'user' : document.getElementsByName("username")[0], 'pass' : document.getElementsByName("password")[0] ;
    if(  __i.user.value.length >= 1 )  i1.value = '';  else  i1.value = 'Acc'; 
    if(  __i.pass.value.length >= 1 )  i2.value = '';  else  i2.value = 'Pwd'; 

catch(e)
    if(e)
    // If fails, Do something else
    

【讨论】:

感谢您展示正确的做法。虽然我很好奇为什么if(e) 需要在catch(e) 内部,因为它已经捕获了(e) @TetraDev 'e' 将返回 'undefined',除非它是有效的 TypeError。因此,您可以在“if”语句中验证 TypeError,还可以执行自定义 TypeError。 简单而伟大:)【参考方案4】:

首先,您应该确保 document.getElementsByName("username")[0] 实际上返回一个对象,而不是“未定义”。你可以简单地检查一下

if (typeof document.getElementsByName("username")[0] != 'undefined')

对于其他元素密码也是如此。

【讨论】:

【参考方案5】:

这里的帖子在我找到 Uncaught TypeError: Cannot read property 'value' of undefined 问题的解决方案的过程中帮助了我很多。

这里已经有很多正确的答案,但我们这里没有的是我认为完全解决这个问题的 2 个答案的组合。

function myFunction(field, data)
  if (typeof document.getElementsByName("+field+")[0] != 'undefined')
  document.getElementsByName("+field+")[0].value=data;
 

不同之处在于您进行检查(是否定义了属性),如果检查为真,那么您可以尝试为其分配一个值。

【讨论】:

【参考方案6】:

你可以创建一个函数来检查变量是否存在,否则将返回一个默认值:

function isSet(element, defaultVal)

    if(typeof element != 'undefined')

        return element;

    

    console.log('one missing element');

    return defaultVal;

并在变量检查中使用它:

var variable = isSet(variable, 'Default value');

【讨论】:

【参考方案7】:

您的代码看起来像是从其他代码自动生成的 - 在处理它们之前,您应该检查带有 id=i1i2name=usernamepasswordhtml 元素是否存在。

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性“值”的主要内容,如果未能解决你的问题,请参考以下文章

Solidity - “未捕获的类型错误:无法读取未定义的属性‘合同’”

未捕获的类型错误:无法读取未定义的属性“区域”?

未捕获的类型错误:无法读取未定义的属性 toLowerCase

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

我该如何解决这个问题:未捕获的类型错误:无法读取 javascript 中未定义的属性“toString”