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

时间:2014-07-08 09:10:32

标签: javascript html

我在这里有一些代码来搜索keyup()事件期间的现有名称。它得到了正确的结果。但它显示Cannot read property "length" of undefined。为什么呢?

function ajax(firstname)
 {
var pathxml;
var answer;
var result;
if(firstname.length== 0)
{
    document.getElementById("hh").innerHTML = "";
    return;
}
if (window.XMLHttpRequest) {
  pathxml = new XMLHttpRequest();
}
else
{
    pathxml = new ActiveXObject("Microsoft.XMLHTTP");
}

pathxml.onreadystatechange= function()
{
    if (pathxml.readyState==4 && pathxml.status==200) 
    {
         answer = JSON.parse(pathxml.responseText);
      document.getElementById("hh").innerHTML = "";

    }
    for (var i=0; i<=answer.length; i++)
    {
        result = answer[i].firstname + " " +answer[i].lastname + "\n";
        document.getElementById("hh").innerHTML += result;
    }
}
pathxml.open("GET","books/ax?firstname=" + firstname, true);
pathxml.send();
}

控制器动作:

def ax
@books =Book.where("firstname like ?","#{params[:firstname]}%")
render json: @books.as_json
end

HTML

<form>
<input type="text" name "search" onkeyup="ajax(this.value);">
</form>
<div id ="hh">
</div>

4 个答案:

答案 0 :(得分:1)

它基本上意味着你试图在变量上使用一个属性,但仍然没有定义,但你可能认为它是。

  • 您可能将null传递给ajax(firstname),导致firstname为null或未定义,因此它不包含任何属性长度。
  • 如果您没有点击if条件,则
  • answer为空或未定义。

如果firstname的长度为0或者未定义,则检查firstname的长度是否为0是不够的。在开始检查lenght属性之前,请确保for不为null或未定义,并在if语句中移动lenght循环,以确保您赢了&#39 ;尝试访问answer的{​​{1}}属性,即使它为null或未定义。

提供一个包含错误的行将有助于确定它是哪种情况,记录命中的代码段也可以帮助您了解哪些if语句已经完成。

答案 1 :(得分:0)

if (pathxml.readyState==4 && pathxml.status==200) 
{
     answer = JSON.parse(pathxml.responseText);
  document.getElementById("hh").innerHTML = "";

}
for (var i=0; i<=answer.length; i++)
{
    result = answer[i].firstname + " " +answer[i].lastname + "\n";
    document.getElementById("hh").innerHTML += result;
}

我很确定for循环应该 if块。只是预感。

另外,inb4“为什么这一切都在一行”,使用这个CSS:#hh {white-space:pre-wrap}

答案 2 :(得分:0)

在您的代码中

if(firstname.length== 0)

在这一行你打电话&#34;长度&#34; &#34; firstname&#34;可能是null或undefined,即。它没有任何价值。所以你得到了这个恐怖。确保&#34; firsname&#34;有价值。然后检查一下。

答案 3 :(得分:0)

因为它有时会返回与&#39; 4不同的状态。把&#39;放在&#39;条件内的cyscle&#39;如果&#39; :)