javascript中未定义的未捕获类型错误

javascript中未定义的未捕获类型错误,javascript,jquery,if-statement,Javascript,Jquery,If Statement,我得到一个错误: 未捕获的TypeError:无法读取未定义的属性“length” 使用以下JavaScript代码: var varId = $("#someInputId"); if (typeof varId !== "undefined" && varId.val().length == 0) 其中varId是输入元素的id,该元素可能在HTML页面中,也可能不在HTML页面中 我假设,如果元素未定义,则第二个子句不会计算 知道我为什么会出现这样的错误吗?您正在尝试获取

我得到一个错误:

未捕获的TypeError:无法读取未定义的属性“length”

使用以下JavaScript代码:

var varId = $("#someInputId");
if (typeof varId !== "undefined" && varId.val().length == 0)
其中
varId
是输入元素的id,该元素可能在HTML页面中,也可能不在HTML页面中

我假设,如果元素未定义,则第二个子句不会计算


知道我为什么会出现这样的错误吗?

您正在尝试获取
未定义的长度(即
未定义的.length
),这就是抛出“未捕获的TypeError”错误的原因

显然,
$(“#someInputId”)
未定义或未返回任何结果。很可能,
$(“#someInputId”)
未返回任何结果,并且空集的值未定义

您的条件检查到达第二个子句,因为
$()
将始终实例化jQuery对象。但如果jQuery对象为空,则其值将未定义

要避免此错误,您需要检查查询是否返回结果:

var varId = $("#someInputId");
if (varId.length > 0 && varId.val().length === 0) {

如果
#someInputId
存在且值为0,则该条件为真。

jQuery中只有一个
val()
函数

<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<input id="varId" value="varIdValue" />
<p id="output"></p>
<script type="text/javascript">
  var varId = $("#varId");
  var output = $("#output");
  output.html((typeof varId == "undefined") + ' ' + varId.val() + ' ' + varId.val().length);
</script>  
和输出将相同:
false变量值10

编辑

var varId = document.getElementById('doesntExist');
var varIdIsObject = (typeof varId == "object");
varId
将为
null
并且
varidObject
将为true

但在jQuery中:

var varId = $('#doesntExist');
varId
将是jQuery对象,有两个字段:
context
(HTMLDocument)和
selector
(在我们的变体中是“#doesntExist”)

其中varId是输入元素的id,该元素可能在ntml页面中,也可能不在ntml页面中

如果该元素不存在,则必须检查jQuery对象是否包含任何元素:

if (varId.length && ...) {
$
将始终返回jQuery对象,即使它没有选择任何元素(因此永远不会是未定义的
)。但是对空选择调用
.val
将返回
未定义的

还要确保在DOM就绪后执行代码。请阅读以了解如何执行此操作。

试试这个

   if ($("#someInputId").val()!= undefined &&
           $("#someInputId").val().length == 0)

这是因为jQuery对象可能是空的

让我们一步一步地浏览您的代码:

var varId = $("#someInputId");
因此,在此之后,就有了一个由varId引用的jQuery对象。请记住,这是一个jQuery对象,与返回的元素数无关。现在您可以这样做:

if (typeof varId !== "undefined" && varId.val().length == 0)
首先,我不确定这是否只是问题中的一个输入错误,!==应该是!=

<>无论如何,请考虑<代码>类型VALID!“未定义”
条件的一部分。这将返回true,因为varId是一个对象并且不是未定义的。由于这是真的,条件评估将转到下一部分。因此,在计算
varId.val().length==0
时,您会得到错误
uncaughttypeerror:无法读取未定义的
的属性“length”。为了使某些内容具有length属性,它必须是字符串或数组,jQuery中的
val()
返回字符串,或者在多选输入的情况下返回数组。但是,如果jQuery对象为空,则val()将返回未定义的
,它没有长度属性

基本上,你可以重写表达式如下:

if ( varId.length && varId.val().length === 0 ) {
  // Do something
}

罚款不足
?你的意思是
未定义的
?varId.length不是varId.val()。length这是罗杰·古德尔开发的新NFL应用程序,它确定你是否收到了足够的罚款或“罚款不足”?修复“未定义”的打印错误这是jQuery,如果是,是什么版本?如果没有jQuery,什么是
val()
,什么是
$
$()
返回一个jQuery对象,因此
varId
是一个jQuery对象。@FelixKling,OP在问题发布几分钟后编辑了她的问题。我的编辑反映了她的编辑——您刚好在中途加入了对话!;)啊,我现在明白了。很抱歉以下内容不正确:
==应该是
=。事实上,人们应该始终保持使用
==
的习惯==
除非有很好的理由不测试完全相等。注意,从答案中删除它。
varId.length
仍然是定义的,即使查询没有返回任何对象,所以测试也不会工作。事实上,我的理解是,如果
varId.length
的值为0,它无论如何都会被计算为false。所以不需要像
varId.length==0
varId.length>0
@DerekHenderson这样的测试,只要再看一遍这个问题,就意识到我的第二部分条件是错误的!据此对其进行了编辑。
if ( varId.length && varId.val().length === 0 ) {
  // Do something
}