老师帮我看看这段代码
(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”这个元素中,那应该随时都可以读出来才是啊?
正在回答
同学你好,问题解答如下:
1. ajax请求数据所花费的时间,与网络和接口等多种因素有关系,它可能会花费1s、2s的时间(这个时间不太可控),但js代码的执行速度是特别快的,也就是ajax请求数据的过程中,left.js和right.js中的代码可能从头到尾都执行完了,所以你在right.js中,直接打印也可能由于数据没渲染完,获取不到数据,在init()代码后面打印也是一样的道理。
同学可以通过定时器延时获取数据,比如在right.js中,setTimeout一秒的时间:
2. 而你点击的时候,此时元素已经渲染出来,数据也挂载上了,所以能获取到数据:
3. 由于ajax是异步的,当它请求数据成功后,会执行回调函数,所以我们将渲染结构和绑定数据的代码写在了回调函数中:
所以我们能明确的就是,initContentList这个方法执行完后,数据就被挂载完成了。
祝学习愉快!
- 参与学习 人
- 提交作业 622 份
- 解答问题 6815 个
微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星