javascript中未定义的未捕获类型错误
我得到一个错误: 未捕获的TypeError:无法读取未定义的属性“length” 使用以下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页面中 我假设,如果元素未定义,则第二个子句不会计算 知道我为什么会出现这样的错误吗?您正在尝试获取
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
}