Функция jquery html() удалить привязку?
Я настраиваю страницу со следующими функциями:
- Пользователю показано 5 изображений.
- Некоторые визуальные эффекты привязаны к изображениям.
- Если пользователь прокручивает страницу вниз, загружаются еще 5 изображений.
- HTML контейнера
<div>
обновляется с помощью.html()
функция. - Визуальные эффекты привязаны к новым 5 изображениям.
Визуальный эффект заключается в выделении некоторых предопределенных областей изображения с помощью Image Mapster.
Проблема:
Визуальные эффекты на всех предыдущих изображениях исчезают после добавления новых пяти изображений.
Вопросы:
Зовет
.html()
Функция удаления привязок, ранее установленных на существующихhtml
?Как я могу обновить
html
без удаления ранее установленных привязок?
Вот упрощенная версия кода:
Проверка кода при достижении нижней части страницы при прокрутке вниз:
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {
console.debug("_____________ DEBUG _____________: reached bottom()");
// check if there are images to load, if so call Visualize()
if ( there are more images to load in a buffer)
ShowMore();
}
}
});
КОД, показывающий еще 5 изображений:
function ShowMore() {
console.debug("_____________ DEBUG _____________: in /ShowMore()");
// get the html of the image container div
old_html = $('#image_result_container').html();
// ajax request to get the 5 more images from server
$.ajax({
url: "/GetImages/",
type: "POST",
contentType: "application/json",
data: JSON.stringify({'visualize_ids': visualize_ids}),
dataType: "json",
success: function( response ) {
// some complex manipulation that creates the html for the 5 images just loaded
new_html = old_html + <div>...some stuff in here...</div>
// I set the html of the container to the new html
$('#image_result_container').html(new_html);
// this part calls the ImageMapster function only on the last 5 images using an id value that I won't explain for conciseness reasons...
for (i = 0; i < 5; i++) {
ImageMapster( some_id, i );
}
});
}
Что за ImageMapster()
Функция в основном привязывает функцию визуализации к элементу изображения:
var map = $('#vis_image_' + ann_id + '_' + im_count_id);
map.mapster({ all the cool effects go here... });
Я приложил ниже код для визуального эффекта (для полноты), но это не имеет значения для вопроса.
КОД для визуального эффекта:
function ImageMapster( ann_id, im_count_id ) {
console.debug("_____________ DEBUG _____________: in /ImageMapster()");
console.debug(" $> ann: [" + ann_id + "] im_count: [" + im_count_id + "]");
var map = $('#vis_image_' + ann_id + '_' + im_count_id);
map.mapster({
areas: [
{
key: 'subject',
staticState: true,
fillColor: '6699ff',
fillOpacity: 0.4,
stroke: true,
strokeColor: '6699ff',
strokeWidth: 3
},
{
key: 'object',
staticState: true,
fillColor: '8ae65c',
fillOpacity: 0.4,
stroke: true,
strokeColor: '8ae65c',
strokeWidth: 3
}
],
mapKey: 'name'
});
}
3 ответа
Селекторы jQuery работают так, как они связываются с совпадениями при выполнении кода. Когда HTML-код, соответствующий селекторам, удаляется, привязка также соответствует точному коду. Не шаблон.
Самый короткий способ справиться с этим - использовать jQuery(селектор).append(), чтобы добавить новый код в конец элемента, а не заменять все с помощью.html(). Таким образом, ваши предыдущие связующие будут перенесены.
$().html()
уничтожает элементы, затем создает новые элементы. Привязка была на старых (ныне разрушенных) элементах. Вам нужно перепривязать, если вы используете $().html()
, Вы можете обойти привязку, не используя $().html()
и вместо того, чтобы использовать $().detach()
а также $().attach()
против ваших существующих элементов.
Вы можете использовать Jquery element.clone(true,true); с некоторыми изменениями в вашем существующем коде, и это должно работать очень легко.