【问题标题】:New to json/ajax .. The Console error is Uncaught TypeError: Cannot read property 'length' of undefined新到 json/ajax .. 控制台错误是 Uncaught TypeError: Cannot read property 'length' of undefined
【发布时间】:2015-08-07 10:12:38
【问题描述】:

我的代码有问题。请注意,我对此完全陌生,所以如果解决方案很简单,请原谅我。在发布之前我确实尝试过找到解决方案,并且我发现很多帖子都有类似的控制台错误,但是没有一个与我的问题有关(或者我只是不太了解它)。

我已经发布了我正在做的工作的 JSFiddle 版本,然后是我在 GitHub 中的另一个抛出错误的版本。除了它指向外部文档的位置之外,功能是相同的。然而,在我的 Github 完整版中,我收到一个错误“未捕获的类型错误:无法读取未定义的属性‘长度’”。阅读其他人的问题,似乎对象没有正确转换,但如果是这种情况,我不知道为什么它在 JSFiddle 中有效。

这里是 js 代码的片段。

$(document).ready(function() {

        $( "#sortable1, #sortable2, #sortable3" ).sortable({
      connectWith: ".connectedSortable"
    }).disableSelection();


    //Some code
    $("#sortable3").sortable();
    //Some more code
    $("#addStuff").click(function(e) {
        e.preventDefault();
        var itemSelector = $("#myList li"),
            items = [],
            dataObj = {};
        $.each(itemSelector, function(i, v) {
            items.push($(v).val());
        });
        //I Am Sure There Is A Better Way Of Sending Checked Items Than A Ton Of IF Statements, However This Works..
        if(document.getElementById('bacon').checked) {
            items.push($("#bacon").val());
        }        
        if(document.getElementById('bananapeppers').checked) {
            items.push($("#bananapeppers").val());
        }          
        if(document.getElementById('blackolives').checked) {
            items.push($("#blackolives").val());
        }        
        if(document.getElementById('greenpeppers').checked) {
            items.push($("#greenpeppers").val());
        }         

        dataObj.stuff = items;
        $.ajax({
            url: '/echo/json/',
            data: {
                json: JSON.stringify(dataObj)
            },
            success: function(data) {
                $("#sortable3").empty();
                $.each(data.stuff, function(k, v) {


     $("#sortable3").append("<li>" + v + "</li>");
            })
        },
        type: 'POST',
        datatype: 'json',
        cache: false
    });
});

这是有效的 JSFiddle 版本的链接: http://jsfiddle.net/1ukyLgnh/5/

这是一个无法正常工作的完整内容的 Github 存储库: https://github.com/dhierholzer/Basiconlineorderingone

如果重要的话,我会通过 WAMP 服务器对其进行测试,并通过一个名为 Light Table 的程序进行调试

最后一点,在我的 Github 版本上,我添加了一行 window.alert(dataObj.stuff);只是为了确保这些值至少传递了那么远,而且它们确实如此。任何帮助将不胜感激。

【问题讨论】:

  • 您尝试在代码中的哪个位置访问长度?
  • 我尝试访问长度的唯一地方是我正在检查检查了多少单选按钮的功能。例如 "var cnt = $("input[name='toppingtypes']:checked").length;"但正如您所看到的,我在那里定义了一个 var,并且控制台在到达可排序页面之前不会抛出错误(最后一个淡入窗口,这是我在 JSfiddle 链接中显示的函数)
  • 您不能在 wordpress 中为 jQuery 使用 $ 运算符,因为它使用无冲突。将$ 替换为jQuery,这是我找到的最简单的方法(还有其他方法)。您描述的错误应该附加到一行代码,但如果它在 jsfiddle 中工作并假设您在 wp 中有完全相同的 html,则很可能是命名问题,如果不是,您需要找到代码的位置失败,很可能正如您所建议的那样,访问对象的尝试失败了,这意味着 html 元素不存在。
  • 谢谢,不过,我没有使用 wordpress。我没有任何类型的基础 CMS。我只是通过 WAMP 服务器在 localhost 上运行。尽管如此,我还是会开始使用不同的运算符。

标签: javascript html ajax json


【解决方案1】:

$.each 使用length 属性,您的问题很可能与您调用eachAJAX 调用返回的数据有关。您可以通过更改 data.stuff 的名称轻松地在 jsfiddle 中重现您的问题,您将收到错误消息: http://jsfiddle.net/7d2wqkpq/

您的调试警报中有错误。您正在检查 dataObj 是否正常,但 dataObj 是您在 ajax 调用中发送的对象,而不是返回的对象。将alert(dataObj.stuff) 替换为alert(data.stuff),您可能会得到未定义。从那时起,修复您的代码应该很容易。

【讨论】:

  • 这完全有效!非常感谢朱利安!在我通过那部分之后,我得知我的 jquery 2.0 出于某种原因不支持我的可排序选项?无论如何,我改为加载 1.6.4(与工作 Jsfiddle 上的相同版本)然后它工作了!
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2012-02-10
  • 2017-04-24
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2013-01-15
  • 2013-04-22
相关资源
最近更新 更多