我是jQuery和jQuery mobile的新手。
我跟踪了一些示例和文档并创建了以下代码:
function initListByUrl(id, requestUrl) {
$.ajax({
url: requestUrl,
type:'GET',
dataType:'json',
success: function(data) {
var items = []
$.each(data, function(i, elem) {
items.push('<li id="cat_li_'+i+'"><a href="#places">' + elem.name + '</a></li>');
});
id.html(items).listview('refresh');
}
});
}
$(document).on("click", '[id^=cat_li]', function(event, ui) {
console.log(3);
})
我需要在点击事件的上下文中提供$ .ajax中的elem事件
这是因为当点击项目时,elem对象包含一个相关的字段。
我该怎么做?
修改
只是为了澄清。在文档就绪中调用initListByUrl函数。它通过检索到的包含数组的json对象构建列表视图。
如果我在点击事件的上下文中有elem,我会做这样的事情:
$(document).on("click", '[id^=cat_li]', function(event, ui) {
call_some_function(elem.someField);
})
我的问题是如何在点击事件的范围内拥有适当的elem对象?
这是我的完整代码:
var stack = []
var site_url = 'http://localhost:3000';
$(function() {
initCategoriesList();
$("#places").on('pageinit', function() {
var category = stack.pop();
initPlacesList(category);
});
$("#place").on('pageinit', function() {
});
});
function initCategoriesList(id, requestUrl) {
$.ajax({
url: site_url + '/categories',
type:'GET',
dataType:'json',
success: function(data) {
var items = []
$.each(data, function(i, elem) {
items.push('<li id="cat_li_'+i+'"><a href="#places">' + elem.name + '</a></li>');
});
$("#categories_ul").html(items).listview('refresh');
}
});
}
function initPlacesList(category_id) {
$.ajax({
url: site_url + '/business_places/category/' + category_id,
type:'GET',
dataType:'json',
success: function(data) {
var items = []
$.each(data, function(i, elem) {
items.push('<li id="place_li_'+i+'"><a href="#place">' + elem.name + '</a></li>');
$("#places_ul").html(items).listview('refresh');
var element = $("#place_li_" + i)[0];
$.data(element, "object", elem);
});
$("#places_ul").html(items).listview('refresh');
}
});
}
$(document).on("click", '[id^=cat_li]', function(event, ui) {
stack.push(event.target.innerText);
})
$(document).on("click", '[id^=place_li]', function(event, ui) {
var place = $.data(this, "object");
alert(place.name);
})
var place = $ .data(this,“object”); 最终有未定义的
答案 0 :(得分:1)
您最好的选择是在li
元素内创建自定义数据属性,以便稍后访问。将所需数据推送到这些自定义属性。例如:
items.push('<li id="cat_li_'+i+'" data-custom-cool="' + elem.someData + '"><a href="#places">' + elem.name + '</a></li>');
现在,您可以在点击处理程序中使用this
根据需要提取数据。
$(this).data("custom-cool"); //this is equiv to elem.someData .
或者,如果您有更大的数据,则可以使用带有$ .data的元素存储对象:
$.each(data, function(i, elem) {
items.push('<li id="cat_li_'+i+'"><a href="#places">' + elem.name + '</a></li>');
});
id.html(items).listview('refresh');
var element = $("#cat_li_" + i)[0]; //cant use jQ object
$.data(element, "object", elem); //assign object
});
现在你的点击处理程序应该能够像这样访问对象(在处理程序内):
console.log($.data(this, "object").objProperty); //replace objProperty with your property to get.
演示:http://jsfiddle.net/tymeJV/vx8Xt/1/点击“testdiv”并查看控制台。
答案 1 :(得分:1)
我认为问题出在id.html(items)
,.html()
不接受数组。
id.html(items.join('')).listview('refresh');
另外,为了解决您的其他问题,您应该使用类而不是ID:
function initListByUrl(id, requestUrl) {
$.getJSON(requestUrl, function(data) {
var items = []
$.each(data, function(i, elem) {
items.push('<li class="cat"><a href="#places">' + elem.name + '</a></li>');
});
id.html(items).listview('refresh');
});
}
$(document).on("click", '.cat a', function(event, ui) {
console.log(3);
});
答案 2 :(得分:0)
默认情况下,ajax是异步的,您有两个选择:
如果你告诉我们,当执行函数initListByURL()时,也许它会有所帮助。
答案 3 :(得分:0)
在将列表中的所有项目附加到Document
之后,您应该将事件绑定移动到success函数中 success: function(data) {
var items = []
$.each(data, function(i, elem) {
items.push('<li id="cat_li_'+i+'"><a href="#places">' + elem.name + '</a></li>');
});
id.html(items).listview('refresh');
// move your click event handling here
}