【问题标题】:Why does this recursive method break in IE? using JSON为什么这种递归方法会在 IE 中中断?使用 JSON
【发布时间】:2012-03-26 23:36:40
【问题描述】:

在使用下面的代码时,它可以在除 IE 之外的所有浏览器中运行,它会返回一个错误,指出行 'if(data[item].sub !== null)' 为 null 或未定义。我故意将 JSON 对象的子属性设置为 null,以便对此进行测试并确保存在与该“子”属性关联的值。所有版本中只有 IE 中断。

            createDropDownCode: function(arr){
            // loop through li's of primary menu
            that.find("li").each(function(idx){

                $(this).append( menusort(arr.menu[idx].sub) );

                $('#PrimNav div.menu').hide();

                function menusort(data){
                    if(data !== null)
                        var html = "<div class='menu'><ul>";    

                    var data_count = 0;

                    for(item in data){

                        data.length-1 == data_count ? html += "<li class='last'>" : html += "<li>";

                        if(data[item].sub !== null){
                            if(typeof(data[item].sub) === 'object'){

                                html += "<a href='" + data[item].link + "'><span>" + data[item].name + "</span></a>";

                                if($.isArray(data[item].sub)){
                                    html += menusort(data[item].sub);
                                }
                            }
                        }

                        html += "</li>"
                        data_count += 1;

                    }

                    if(data !== null)
                        html += "</ul></div>";

                    return html;
                }

JSON 传递给 'createDropDownCode' 函数....

var JSON = {
    menu: [
        {id: '0',sub: [
            {name: 'lorem ipsum 0-0',link: '0-0', sub: null},
            {name: 'lorem ipsum 0-1',link: '0-1', sub: null},
            {name: 'lorem ipsum 0-2',link: '0-2', sub: null}
            ]
        },
        {id: '1',sub: null},
        {id: '2',sub: [
            {name: 'lorem ipsum 2-0',link: '2-0', sub: null},
            {name: 'lorem ipsum 2-1',link: '2-1', sub: null},
            {name: 'lorem ipsum 2-2',link: '2-2', sub: [
                {name: 'lorem ipsum 2-2-0',link: '2-2-0', sub: null},
                {name: 'lorem ipsum 2-2-1',link: '2-2-1', sub: null},
                {name: 'lorem ipsum 2-2-2',link: '2-2-2', sub: [
                    {name: 'lorem ipsum 2-2-2-0',link: '2-2-2-0', sub: null},
                    {name: 'lorem ipsum 2-2-2-1',link: '2-2-2-1', sub: null},
                    {name: 'lorem ipsum 2-2-2-2',link: '2-2-2-2', sub: null},
                    {name: 'lorem ipsum 2-2-2-3',link: '2-2-2-3', sub: null}
                ]},
                {name: 'lorem ipsum 2-2-3',link: '2-2-3', sub: null},
                {name: 'lorem ipsum 2-2-4',link: '2-2-4', sub: null},
                {name: 'lorem ipsum 2-2-5',link: '2-2-5', sub: null},
                {name: 'lorem ipsum 2-2-6',link: '2-2-6', sub: null}
            ]},
            {name: 'lorem ipsum 2-3',link: '2-3', sub: [
                {name: 'lorem ipsum 2-3-0',link: '2-3-0', sub: null},
                {name: 'lorem ipsum 2-3-1',link: '2-3-1', sub: null},
                {name: 'lorem ipsum 2-3-2',link: '2-3-2', sub: [
                    {name: 'lorem ipsum 2-3-2-0',link: '2-3-2-0', sub: null},
                    {name: 'lorem ipsum 2-3-2-1',link: '2-3-2-1', sub: null},
                    {name: 'lorem ipsum 2-3-2-2',link: '2-3-2-2', sub: null},
                    {name: 'lorem ipsum 2-3-2-3',link: '2-3-2-3', sub: null}
                ]},
                {name: 'lorem ipsum 2-2-6',link: '2-3-3', sub: null}
            ]},
            {name: 'lorem ipsum 2-4',link: '2-4', sub: null},
            {name: 'lorem ipsum 2-5',link: '2-5', sub: null}
            ]
        },
        {id: '3',sub: null},
        {id: '4',sub: null},
        {id: '5',sub: null}
        ]
    }

【问题讨论】:

  • 为什么不写if (data === null) return "";
  • 这一行是做什么的: data.length-1 == data_count ? html += "
  • " : html += "
  • "; ?
  • Fabian,因为我正在使用 for...in 循环,我无法访问给定当前项目的变量,因此必须包含一个计数器以便我知道何时我在项目循环的末尾并向该项目添加一个类“last”。
  • @quinton 我明白了,但这是一种非常“hackish”的写作方式。乍一看,我不认为它是一个缩短的 if 语句。顺便问一下,我的回答对你有帮助吗?我刚刚有了另一个想法,您能否将您的代码的工作示例发布到jsfiddle.net
  • 我找到了答案,虽然它的响应不好,但 IE 出错了,这真的很简单而且很好。我需要做的就是确保我事先用'var'定义了'item'。所以 for(item in data) 变成 for(var item in data)。我还将在 for 循环内添加一个 hasOwnProperty 测试,以确保所有属性都属于该对象。
  • 标签: javascript json internet-explorer recursion


    【解决方案1】:

    在JSON数据中,尽量使用false而不是null,我认为对象类型比较有点多。

    if(data[item].sub) {
    
        html += "<a href='" + data[item].link + "'><span>" + data[item].name + "</span></a>";
    
        if($.isArray(data[item].sub)) {
            html += menusort(data[item].sub);
        }
    }
    

    编辑:好的,这不是答案。正如我在上面的评论中所说,请将一个工作(或不工作;))示例发布到http://jsfiddle.net

    【讨论】:

    • 感谢您的想法,但将子属性更改为分配为 null,只需将 for 循环中的 item 变量设置为 'for(var item in data)' 错过了 'var'关键字。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签