#jquery
#jquery
Вопрос:
После динамического создания элемента с этим:
$('#btnAddBanner').click(function () {
var uid = new Date().getTime(),
newBanner = '<li class="ui-state-default bannerBlock"><div class="beVisible"><input type="checkbox" name="chkBanner_' uid '" id="chkBanner_' uid '" checked="checked" /></div><div class="beDelete"><img class="btnDelete" src="/images/btn_delete.png" alt="Delete Banner" /></div><div class="beBanner"><img src="/images/NewBannerTemplate.jpg" width="285" height="81" border="0" alt="" /></div><div class="beName"><input type="text" id="txtBannerName_' uid '" class="EditBox1" placeholder="Temp Text" value="(type banner name here)" /></div><div class="beFileName">File Name: <input type="text" id="FileName_' uid '" class="EditBox1 EditBoxAltText" style="width: 197px;" value="" /></div><div class="beUpload"><a href="#"><img src="/images/icons/disk.png" alt="Upload" /></a></div><div class="beStart">Start Date: <input type="text" id="StartDate_' uid '" class="EditBox1 EditBoxAltText" style="width: 80px;" value="" /></div><div class="beEnd">End Date: <input type="text" id="EndDate_' uid '" class="EditBox1 EditBoxAltText" style="width: 80px;" value="" /></div></li>';
$('#sortable').append(newBanner);
$('.chkBanner_' uid).screwDefaultButtons({ checked: 'url(images/btn_light_on.png)', unchecked: 'url(images/btn_light_off.png)', disabled: 'url(images/btn_light_off_dim.png)', disabledChecked: 'url(images/btn_light_on_dim.png)', width: 33, height: 35 });
$('.txtBannerName_' uid).val("(type new name here)");
return false;
});
Хотя эта кнопка создает новый элемент LI, мне трудно контролировать многие элементы внутри после их создания. Кнопка «удалить» работает, но только при использовании функции live():
$('.btnDelete').live('click', function () {
$(this).closest('li').remove();
});
Однако подключаемый модуль ScrewDefaultButtons не вызывается. И сами текстовые поля ведут себя не так, как элементы LI, которые я вручную записываю для текстовых сообщений. Например, базовая замена css при наведении курсора не работает с текстовыми полями. Чего мне не хватает? Это связано с привязкой, но все, что я могу понять, это как обращаться с любыми функциями щелчка (например, с кнопкой удаления). Однако все остальное не реагирует как «обычные» элементы, уже находящиеся на странице.
ОБНОВЛЕНИЕ Вот что я добавил, чтобы наведение курсора мыши и т. Д. Работало:
$(".EditBox1").live("mouseover mouseout focus blur", function (event) {
if (event.type == "mouseover") {
$(this).addClass('EditBoxHighlight');
} else if (event.type == "mouseout") {
$(this).removeClass('EditBoxHighlight');
} else if (event.type == "focusin") {
$(this).addClass('EditBoxSelect');
} else {
$(this).removeClass('EditBoxSelect');
}
});
Это отлично работает. Теперь все, что осталось, это замена изображения флажка. Я уверен, что это больше связано с синтаксисом плагинов. Как отформатировать функцию live() с помощью нестандартного вызова, такого как:
$('input:checkbox').screwDefaultButtons({ checked: 'url(images/btn_light_on.png)', unchecked: 'url(images/btn_light_off.png)', disabled: 'url(images/btn_light_off_dim.png)', disabledChecked: 'url(images/btn_light_on_dim.png)', width: 33, height: 35 });
?
Ответ №1:
click
и bind
назначьте событие элементам, которые уже существуют на момент вызова. live
в constrast также добавляется событие, если элемент, соответствующий селектору, будет добавлен позже. Вот почему кнопка работает, когда вы ее используете live
.
Альтернативой может быть вызов click
or bind
после создания элемента. Это лучшее решение с точки зрения производительности, но выигрыш не так велик для небольших страниц. Кроме того, это немного сложнее. Вы должны убедиться, что вы не добавляете событие также и к элементам, у которых оно уже есть, иначе они будут фактически привязаны к двум обработчикам событий.
[править / править код]
Проблема с селекторами '.chkBanner_' uid
и '.txtBannerName_' uid
заключается в том, что они являются селекторами классов, в то время как элементы имеют только идентификатор. Либо создайте 'chkBanner_' uid
класс элемента, либо измените селектор на '#chkBanner_' uid
.
Комментарии:
1. Правильно — именно поэтому кнопка DeleteBanner работает. Но как мне обрабатывать все остальные элементы (txtBox, checkbox и т. Д.); Попытка аналогичного синтаксиса завершается неудачей.
2. Я думаю, это из-за ошибки в селекторах. Смотрите мое редактирование.
3. Спасибо, что поймали эту простую ошибку (я менял их много раз и просто забыл). Теперь, когда это сделано, это по-прежнему вызывает проблемы со сбросом флажка. Это явно связано с простой настройкой функции LIVE() для нестандартных вызовов, таких как: $(‘input:checkbox’).screwDefaultButtons({ проверено: ‘url(images/btn_light_on.png)’, снято: ‘url(images/btn_light_off.png)’, отключено: ‘url(images/btn_light_off_dim.png)’, отключено: ‘url(images/btn_light_on_dim.png)’, ширина: 33, высота: 35 }); Есть идеи о том, как отформатировать такую строку?
4. Я думаю, вам лучше закрыть этот вопрос и задать его в другом вопросе. Это привлечет новое внимание других людей, которые могут быть в состоянии помочь, а также позволит вам выполнить некоторое форматирование вашего кода.