Идея состоит в том, что я хочу пройтись по этим объектам и построить структуру HTML, которая будет добавлена на страницу.Я думал, что было бы чище делать все это в цепочке, но, видимо, я не понимаю что-то о контексте this
, поскольку он развивается через внутренние циклы.Я немного посмотрел на jQuery.proxy()
, но я не уверен, что понимаю, как применить его здесь.Может быть, есть и другой способ сделать то, что я пытаюсь сделать здесь ...
var obj = [
{"id":1213854620001,"name":"item 1","URL":"1213897576001.jpg"},
{"id":1213854619001,"name":"item 2","URL":"1213890384001.jpg"},
{"id":1213854618001,"name":"item 3","URL":"1213890378001.jpg"},
{"id":1213854616001,"name":"item 4","URL":"1213897663001.jpg"},
{"id":1213854615001,"name":"item 5","URL":"1213897554001.jpg"}
];
$(function() {
if(obj.length) {
$("<ul/>",{id:"myID"}).append(function(){
var that = document.createDocumentFragment();
$.each(obj,function(index,dataObj){
$("<li/>",{data:{dataID:dataObj.id},text:dataObj.name}) // this === obj[index] === dataObj, shouldn't it be the [object HTMLLIElement]
.live("click",function(event) {
openVideo($(event.target).data(dataID));
})
.append(function() {
return $("<img/>",{src:dataObj.thumbnailURL})[0];
})
.appendTo(that);
});
return that;
}).appendTo("body");
}
});
function openVideo(str) {
//console.log(str);
}
Неявный вопрос: почему that
пусто после моего цикла?и как я могу построить эту структуру HTML с помощью вложенных циклов?
Используя предложения из комментариев и ответов, я построил это, которое, кажется, работает точно так, как должно, читает немного чище и позволяет jQuery делатьвесь javascript (например, documentFragment
создание, манипулирование и т. д.):
$(function() {
if(obj.length) {
$("<ul/>",{id:"myID"})
.delegate("li","click",function(){openVideo($(this).data("dataID"));})
.append(function() {
var that = $(this);
$.each(obj,function(index,dataObj) {
$("<li/>",{data:{dataID:dataObj.id},text:dataObj.name}).each(function() {
$("<img/>",{src:dataObj.URL}).appendTo(this);
that.append(this);
})
});
}).appendTo("body");
}
});