В настоящее время я столкнулся с проблемой в jquerymobile: я добавляю элементы в список динамически и в конце концов использую boostWithin() (поэтому стиль правилен). После этого мне нравится добавлять клики-события для каждого элемента списка, но проблема в том, что boostWithin работает асинхронно, поэтому я всегда получаю сообщение об ошибке "не может вызывать методы на checkboxradio до инициализации, попытался вызвать метод" refresh ""
Когда я задерживаю код добавления событий, он отлично работает.
Кто-нибудь есть идея, если есть событие boostWithin.done или что-то еще, что я могу использовать?
HTML:
...
<div id="shoppinglist">Loading list...</div>
...
Javascript:
function updateList()
{
var result = "";
$.each(shoppinglistItems, function (index, item) {
result += '<label><input type="checkbox" ' + item.checked + ' id="item_' + item.id + '">' + item.name + '</label>\n';
});
$('#shoppinglist').html(result).enhanceWithin();
// Change-Events an die Checkboxen knoten
$('input[id*=item_]').unbind('change').bind('change', function (event) {
var itemid = $(this).attr('id');
itemid = (itemid.split('_'))[1]; // Nur die Zahl extrahieren
// Passendes Item aus der Liste der Items suchen und checken
$.each(shoppinglistItems, function (index, item) {
if (item.id == itemid)
{
item.checked = "checked";
item.timestamp = moment().format("YYYYMMDDHHmmss");
}
});
updateList();
});
}
Рекомендации Омара по использованию делегирования событий должны работать на вас. В моем примере ниже я вызываю updatelist на pagecreate, чтобы сначала создавать флажки. Затем я использую делегирование событий (on()) для создания обработчика изменений на любых входах в списке покупок DIV, независимо от того, существуют они прямо сейчас или нет. строка $ ("# shoppinglistItemsCont"). html (JSON.stringify(shoppinglistItems)); просто печатает содержимое объекта на экране, чтобы вы могли видеть его изменение.
$(document).on("pagecreate", "#page1", function(){
$("#shoppinglistItemsCont").html(JSON.stringify(shoppinglistItems));
updateList();
$("#shoppinglist").on("change", "input[id*=item_]", function(event){
var itemid = $(this).attr('id');
itemid = (itemid.split('_'))[1]; // Nur die Zahl extrahieren
// Passendes Item aus der Liste der Items suchen und checken
$.each(shoppinglistItems, function (index, item) {
if (item.id == itemid)
{
item.checked = "checked";
item.timestamp = moment().format("YYYYMMDDHHmmss");
}
});
updateList();
$("#shoppinglistItemsCont").html(JSON.stringify(shoppinglistItems));
});
});
function updateList()
{
var result = "";
$.each(shoppinglistItems, function (index, item) {
result += '<label><input type="checkbox" ' + item.checked + ' id="item_' + item.id + '">' + item.name + '</label>\n';
});
$('#shoppinglist').html(result).enhanceWithin();
}
Вот работая DEMO