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

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“长度”【英文标题】:Uncaught TypeError: Cannot read property 'length' of undefined 【发布时间】:2013-11-24 15:54:59 【问题描述】:

当我尝试从 AJAX 调用中获取数据并在单击提交按钮时将其插入另一个函数时,如何避免以下错误?

ajax 函数中的 console.log 调用显示数据已被抓取,我希望随后将其存储在 json_data 中。

目标是使用这些数据来更改通过 html 表单提交的字符串。

然后在'click'函数的行返回错误:

console.log(json_data.length);

<title>Test Form</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<style>
    #results_box 
        border: red 5px solid;
                

    #place 
        border: #cccccc 1px solid;

               
</style>
<script type="text/javascript">
$(document).ready(function() 
    var json_source = "https://spreadsheets.google.com/feeds/list/0ApL1zT2P00q5dG1wOUMzSlNVV3VRV2pwQ2Fnbmt3M0E/od7/public/basic?alt=json";
    var string_data ="";
    var json_data = $.ajax(
        dataType: 'jsonp',
        url: json_source,
        success: function(data)
            var data_obj = [];
            for (i=0; i<data.feed.entry.length; i++)
                var el = 'key': data.feed.entry[i].title['$t'], 'value': '<p><a href="'+data.feed.entry[i].content['$t']+'>'+data.feed.entry[i].title['$t']+'</a></p>';
                data_obj.push(el);

            console.log("data grabbed");    

            return data_obj;

        ,      

        error: function(jqXHR, textStatus, errorThrown) 
                        $('#results_box').html('<h2>Something went wrong!</h2><p><b>' + textStatus  + '</b> ' + errorThrown  + '</p>');
        
    ); 

    $(':submit').click(function(event, json_data)
        event.preventDefault();
        console.log(json_data.length);

        //function
        if ($('#place').val() !='')
            var copy_string = $('#place').val();
            var converted_string = copy_string;
            for (i=0; i<json_data.length; i++)
                //console_log(data.feed.entry[i].title['$t']);
                converted_string = converted_string.replace(json_data.feed.entry[i].title['$t'], 
                    '<a href="'+json_data.feed.entry[i].content['$t']+'>'+json_data.feed.entry[i].title['$t']+'</a>');
              
            $('#results_box').text(converted_string).html();
        
    );

);//document ready end 

</script>
</head>

<body>
    <div id="wrapper">
    <div id="query_box" class="panel">  
        <form id="form_submit"><h4>Copy to process:</h4>
          <textarea id="place"></textarea>
          <input type="submit" value="Go" />

        </form>
    </div>
   <div id="results_box" >Results will appear here</div>  
</div>

【问题讨论】:

你应该接受正确的答案.. 【参考方案1】:
console.log(typeof json_data !== 'undefined'
    ? json_data.length : 'There is no spoon.');

...或者更简单...

console.log(json_data ? json_data.length : 'json_data is null or undefined');

【讨论】:

【参考方案2】:

您没有正确传递变量。一种快速的解决方案是创建一个像这样的全局变量:

var global_json_data;
$(document).ready(function() 
    var json_source = "https://spreadsheets.google.com/feeds/list/0ApL1zT2P00q5dG1wOUMzSlNVV3VRV2pwQ2Fnbmt3M0E/od7/public/basic?alt=json";
    var string_data ="";
    var json_data = $.ajax(
        dataType: 'json', // Return JSON
        url: json_source,
        success: function(data)
            var data_obj = [];
            for (i=0; i<data.feed.entry.length; i++)
                var el = 'key': data.feed.entry[i].title['$t'], 'value': '<p><a href="'+data.feed.entry[i].content['$t']+'>'+data.feed.entry[i].title['$t']+'</a></p>';
                data_obj.push(el);

            console.log("data grabbed");  
            global_json_data =   data_obj;

            return data_obj;


        ,      

        error: function(jqXHR, textStatus, errorThrown) 
                        $('#results_box').html('<h2>Something went wrong!</h2><p><b>' + textStatus  + '</b> ' + errorThrown  + '</p>');
        
    ); 

    $(':submit').click(function(event)
        var json_data = global_json_data;
        event.preventDefault();
        console.log(json_data.length);

        //function
        if ($('#place').val() !='')
            var copy_string = $('#place').val();
            var converted_string = copy_string;
            for (i=0; i<json_data.length; i++)
                //console_log(data.feed.entry[i].title['$t']);
                converted_string = converted_string.replace(json_data.feed.entry[i].title['$t'], 
                    '<a href="'+json_data.feed.entry[i].content['$t']+'>'+json_data.feed.entry[i].title['$t']+'</a>');
              
            $('#results_box').text(converted_string).html();
        
    );

);//document ready end 

【讨论】:

这是一个快速的解决方案。现在我需要了解有关范围规则的更多信息。 :)【参考方案3】:

“ProjectID”JSON数据格式问题删除“ProjectID”:这个值 集合对象键值

  * * "ProjectID" * * : 
            "name": "ProjectID",
            "value": "16,36,8,7",
            "group": "Genel",
            "editor": 
                "type": "combobox",
                "options": 
                    "url": "..\/jsonEntityVarServices\/?id=6&task=7",
                    "valueField": "value",
                    "textField": "text",
                    "multiple": "true"
                
            ,
            "id": "14",
            "entityVarID": "16",
            "EVarMemID": "47"
        
    

【讨论】:

【参考方案4】:

您正在访问一个未定义的对象。

解决方案是检查 null 或 undefined(查看对象是否存在),然后再进行迭代。

【讨论】:

以上是关于未捕获的类型错误:无法读取未定义的属性“长度”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

未捕获的类型错误:尝试使用 PHP 填充响应式数据表时无法读取未定义的属性“长度”?

jquery 数据表:“未捕获的类型错误:无法读取未定义的属性‘长度’”在销毁和重新初始化后。表作为数据源

无法读取未定义和未处理的承诺拒绝的属性“捕获”

我得到一个未被捕获的类型错误,在尝试获取div时无法读取未定义的属性长度