0

我得到错误:

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

使用以下 JavaScript 代码:

var varId = $("#someInputId");
if (typeof varId !== "undefined" && varId.val().length == 0)

varIdHTML 页面中可能存在或不存在的输入元素的 id在哪里。

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

任何想法为什么我会收到这样的错误?

4

5 回答 5

2

这是因为 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
}
于 2013-07-23T09:07:56.700 回答
0

您正在尝试获取undefined(ie, undefined.length) 的长度,这就是引发“未捕获的类型错误”错误的原因。

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

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

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

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

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

于 2013-07-23T08:29:32.867 回答
0

尝试这个

   if ($("#someInputId").val()!= undefined &&
           $("#someInputId").val().length == 0)
于 2013-07-23T08:49:24.833 回答
0

其中 varId 是 ntml 页面中可能存在或不存在的输入元素的 ID。

如果可以是该元素不存在,那么您必须检查 jQuery 对象是否包含任何元素:

if (varId.length && ...) {

$始终返回一个 jQuery 对象,即使它没有选择任何元素(因此永远不会undefined)。但是调用.val一个空的选择会返回undefined

还要确保在 DOM 准备好之后执行代码。请阅读jQuery 教程“jQuery 工作原理”以了解如何执行此操作。

于 2013-07-23T08:37:51.220 回答
-1

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')。

于 2013-07-23T08:35:23.717 回答