Как связать загрузку с динамическими элементами
Я использую Twitter Bootstrap popover в динамическом списке. В элементе списка есть кнопка, когда я нажимаю кнопку, она должна появляться всплывающим. Он отлично работает, когда я тестировал нединамику.
это мой JavaScript для нединамического списка
$("button[rel=popover]").popover({
placement : 'right',
container : 'body',
html : true,
//content:" <div style='color:red'>This is your div content</div>"
content: function() {
return $('#popover-content').html();
}
})
.click(function(e) {
e.preventDefault();
});
Однако он не работает в динамическом списке. Он может отображаться, когда я нажимаю кнопку "дважды" и показываю только один из элементов списка, на которые я нажимаю кулак.
MY html:
<ul id="project-list" class="nav nav-list">
<li class='project-name'>
<a >project name 1
<button class="pop-function" rel="popover" ></button>
</a>
</li>
<li class='project-name'>
<a>project name 2
<button class="pop-function" rel="popover" ></button>
</a>
</li>
</ul>
<div id="popover-content" style="display:none">
<button class="pop-sync"></button>
<button class="pop-delete"></button>
</div>
Мой JavaScript для динамического:
$(document).on("click", "#project-list li" , function(){
var username = $.cookie("username");
var projectName = $(this).text()
$("li.active").removeClass("active");
$(this).addClass("active");
console.log("username: " +username + " project name: "+projectName );
});
$(document).on("click", "button[rel=popover]", function(){
$(this).popover({
placement : 'right',
container : 'body',
html : true,
content: function() {
return $('#popover-content').html();
}
}).click(function(e){
e.preventDefault();
})
});
//for close other popover when one popover button click
$(document).on("click", "button[rel=popover]" , function(){
$("button[rel=popover]").not(this).popover('hide');
});
Я искал аналогичные проблемы, но я все еще не могу найти решение проблемы. Если у кого-то есть идеи, пожалуйста, дайте мне знать. Спасибо вам за помощь.
Ответы
Ответ 1
Обновление
Если ваш popover будет иметь последовательный селектор, вы можете использовать свойство selector
конструктора popover.
var popOverSettings = {
placement: 'bottom',
container: 'body',
html: true,
selector: '[rel="popover"]', //Sepcify the selector here
content: function () {
return $('#popover-content').html();
}
}
$('body').popover(popOverSettings);
Демо
Другие способы:
- (Стандартный способ) Привяжите снова к новым элементам, которые вставлены. Сохраните popoversettings во внешней переменной.
- Используйте
Mutation Event
/Mutation Observer
, чтобы определить, был ли конкретный элемент вставлен в ul
или элемент.
Источник
var popOverSettings = { //Save the setting for later use as well
placement: 'bottom',
container: 'body',
html: true,
//content:" <div style='color:red'>This is your div content</div>"
content: function () {
return $('#popover-content').html();
}
}
$('ul').on('DOMNodeInserted', function () { //listed for new items inserted onto ul
$(event.target).popover(popOverSettings);
});
$("button[rel=popover]").popover(popOverSettings);
$('.pop-Add').click(function () {
$('ul').append("<li class='project-name'> <a>project name 2 <button class='pop-function' rel='popover'></button> </a> </li>");
});
Но не рекомендуется использовать DOMNodeInserted Mutation Event для проблем с производительностью, а также для поддержки. Это было устарело. Поэтому лучше всего сохранить настройки и привязать после обновления с помощью нового элемента.
Еще один рекомендуемый способ - использовать MutationObserver вместо MutationEvent в соответствии с MDN, но снова поддержка в некоторых браузерах неизвестна, а производительность вызывает беспокойство.
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
// create an observer instance
var observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
$(mutation.addedNodes).popover(popOverSettings);
});
});
// configuration of the observer:
var config = {
attributes: true,
childList: true,
characterData: true
};
// pass in the target node, as well as the observer options
observer.observe($('ul')[0], config);
Ответ 2
Возможно, слишком поздно, но это еще один вариант:
$('body').popover({
selector: '[rel=popover]',
trigger: 'hover',
html: true,
content: function () {
return $(this).parents('.row').first().find('.metaContainer').html();
}
});
Ответ 3
Я сделал это, и это работает для меня.
"content" - объект placesContent. а не html-контент!
var placesContent = $('#placescontent');
$('#places').popover({
trigger: "click",
placement: "bottom",
container: 'body',
html : true,
content : placesContent,
});
$('#places').on('shown.bs.popover', function(){
$('#addPlaceBtn').on('click', addPlace);
}
<div id="placescontent"><div id="addPlaceBtn">Add</div></div>