老师帮我看看这段代码

老师帮我看看这段代码

(function(){

    var itemTmpl = '<div class="left_bar_inner_item">'+

                    '<div class="item_text">$food_spu_tags_name</div>'+

                    '</div>'


    function getList(){

        $.get("./menu/json/food.json",function(data){

            var List = data.data.food_spu_tags;

            initContentList(List)

        })

    }

    function initContentList(List){

        List.forEach(function(item){

            var str = itemTmpl.replace("$food_spu_tags_name",getfoodsputags(item))

            var $food_detail = $(str);

            $food_detail.data("itemData",item)

            $(".left_bar_inner").append($food_detail);

            

        });

        

    }

    function addClick(){

        $(".left_bar_inner").on("click",".left_bar_inner_item",function(e){

            var $target = $(e.currentTarget);

            console.log($(".left_bar_inner_item").eq(0).data("itemData"));

        })

    }


    function getfoodsputags(data){

        if(data.icon){

            return '<img src='+data.icon+'>'+data.name

        }else{

            return data.name

        }

    }

    function init(){

        getList();

        addClick();

        console.log($(".left_bar_inner_item").eq(0).data("itemData"));

    }

    init();

})()

这里不涉及别的部分,就是data的部分,这里我为了测试只读了第一个“.left_bar_inner_item”就用eq(0)赛选了,然后在点击中是可以正常实现的。那为什么放在冒泡点击事件当中我就可以读出data的数据,放在全局中就显示undefined呢??既然是绑定在“.left_bar_inner_item”这个元素中,那应该随时都可以读出来才是啊?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,问题解答如下:

1. ajax请求数据所花费的时间,与网络和接口等多种因素有关系,它可能会花费1s、2s的时间(这个时间不太可控),但js代码的执行速度是特别快的,也就是ajax请求数据的过程中,left.js和right.js中的代码可能从头到尾都执行完了,所以你在right.js中,直接打印也可能由于数据没渲染完,获取不到数据,在init()代码后面打印也是一样的道理。

同学可以通过定时器延时获取数据,比如在right.js中,setTimeout一秒的时间:

http://img1.sycdn.imooc.com//climg/5f0414dd092b862405540264.jpg

2. 而你点击的时候,此时元素已经渲染出来,数据也挂载上了,所以能获取到数据:

http://img1.sycdn.imooc.com//climg/5f0414fc09c4595c08070453.jpg

3. 由于ajax是异步的,当它请求数据成功后,会执行回调函数,所以我们将渲染结构和绑定数据的代码写在了回调函数中:

http://img1.sycdn.imooc.com//climg/5f04150709d4b93308720313.jpg

所以我们能明确的就是,initContentList这个方法执行完后,数据就被挂载完成了。

祝学习愉快!

好帮手慕久久 2020-07-07 11:41:03

同学你好,这和代码的执行顺序有关系,具体如下:

由于getList方法中使用ajax请求数据,这个过程是异步的,所以当执行init方法中的打印时,由于此时“.left_bar_inner_item”的数据还没有渲染上,所以获取的是undefined,同学可以通过打印看一下代码的执行顺序,如下:

http://img1.sycdn.imooc.com//climg/5f03ee7409debb7a00000000.jpghttp://img1.sycdn.imooc.com//climg/5f03ee770926bf8211300306.jpghttp://img1.sycdn.imooc.com//climg/5f03ee7d09c2ec8c06450304.jpg

如果我的回答帮到了你,欢迎采纳,祝学习愉快!

  • 提问者 慕雪9296518 #1
    可是就算我在渲染完了之后,也就是init()之后再单独console.log这段依旧是undefined,或者说我在rightjs右边列表中部分试图直接获取$(".left_bar_inner_item").eq(0).data("itemData")依旧是undefined,这时候怎么也该渲染完了吧
    2020-07-07 11:46:27
  • 提问者 慕雪9296518 #2
    那到底这时候怎么才能获取到挂在的数据呢???为什么点击的事件又可以正常获取挂载的事件呢?想老师这块详细的解释一下,因为这个东西我想了两天了,也做了各种测试,依旧是不知道其中的道理。
    2020-07-07 11:50:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师