我得到错误:
未捕获的类型错误:无法读取未定义的属性“长度”
使用以下 JavaScript 代码:
var varId = $("#someInputId");
if (typeof varId !== "undefined" && varId.val().length == 0)
varId
HTML 页面中可能存在或不存在的输入元素的 id在哪里。
我想如果元素未定义,则不会计算第二个子句。
任何想法为什么我会收到这样的错误?
我得到错误:
未捕获的类型错误:无法读取未定义的属性“长度”
使用以下 JavaScript 代码:
var varId = $("#someInputId");
if (typeof varId !== "undefined" && varId.val().length == 0)
varId
HTML 页面中可能存在或不存在的输入元素的 id在哪里。
我想如果元素未定义,则不会计算第二个子句。
任何想法为什么我会收到这样的错误?
这是因为 jQuery 对象可能是空的。
让我们逐步浏览您的代码:
var varId = $("#someInputId");
所以在这之后,你就有了一个由 varId 引用的 jQuery 对象。请记住,这是一个 jQuery对象,与返回的元素数量无关。现在你这样做:
if (typeof varId !== "undefined" && varId.val().length == 0)
首先,不确定这是否只是问题中的错字,!== 应该是!=。
无论如何,考虑typeof varId != "undefined"
条件的一部分。这将返回 true,因为 varId 是一个对象并且不是未定义的。由于这是正确的,因此条件评估将继续进行下一部分。因此,在评估varId.val().length == 0
时,您会遇到错误Uncaught TypeError: Cannot read property 'length' of undefined
。为了使某些东西具有长度属性,它必须是一个字符串或一个数组,并且val()
在 jQuery 中返回一个字符串,或者在多选输入的情况下返回一个数组。但是,如果 jQuery 对象为空,则 val() 将返回undefined
,它没有长度属性。
所以基本上,你可以重写表达式如下:
if ( varId.length && varId.val().length === 0 ) {
// Do something
}
您正在尝试获取undefined
(ie, undefined.length
) 的长度,这就是引发“未捕获的类型错误”错误的原因。
显然,$("#someInputId")
未定义或不返回任何结果。很可能,$("#someInputId")
没有返回任何结果,并且空集的值未定义。
您的条件检查到达第二个子句,因为$()
将始终实例化一个 jQuery 对象。但是如果 jQuery 对象是空的,它的值将是未定义的。
为避免此错误,您需要检查查询是否返回结果:
var varId = $("#someInputId");
if (varId.length > 0 && varId.val().length === 0) {
#someInputId
如果存在且值为 0,则该条件将为真。
尝试这个
if ($("#someInputId").val()!= undefined &&
$("#someInputId").val().length == 0)
其中 varId 是 ntml 页面中可能存在或不存在的输入元素的 ID。
如果可以是该元素不存在,那么您必须检查 jQuery 对象是否包含任何元素:
if (varId.length && ...) {
$
将始终返回一个 jQuery 对象,即使它没有选择任何元素(因此永远不会undefined
)。但是调用.val
一个空的选择会返回undefined
。
还要确保在 DOM 准备好之后执行代码。请阅读jQuery 教程“jQuery 工作原理”以了解如何执行此操作。
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 varIdValue 10
如果你不使用 jQuery,那么你必须使用value
这样的属性:
var varId = document.getElementById('varId');
var output = document.getElementById('output');
output.innerHTML = (typeof varId == "undefined") + ' ' + varId.value + ' ' + varId.value.length;
输出将是相同的:false varIdValue 10
编辑
var varId = document.getElementById('doesntExist');
var varIdIsObject = (typeof varId == "object");
varId
将是null
并且varIdIsObject
将是真实的
但是在 jQuery 中:
var varId = $('#doesntExist');
varId
将是具有 2 个字段的 jQuery 对象:context
(HTMLDocument) 和selector
(在我们的变体中是 '#doesntExist')。