Я работаю над проектом сайта Prestashop с особенно неудобной настройкой мегаменю.
MutationObserver
отлично справляется с перемещением меню назад при открытом оверлее корзины, но проблема в том, что меню динамически втягивается другой библиотекой JavaScript, которая запутывается безо всякого спасения, и поэтому MutationObserver
каждый раз отключается от узла, в результате чего все отображается неправильно, если что-то добавляется в корзину после загрузки страницы.
MutationObserver
в настоящее время связан напрямую с объектом контейнера главной страницы (category
).
// CREATE A MUTATION OBSERVER OBJECT TO MONITOR ANY STATE CHANGES ON THE JS NODE
let observer = new MutationObserver(blockCartOpened);
function blockCartOpened(mutationRecords) {
// PROCESS THE LIST OF MUTATION THAT HAVE OCCURED
mutationRecords.forEach (function (mutation) {
// GET THE MUTATION TARGET AND SEE IF THE DISPLAY STYLE ATTRIBUTE IS SET OR NOT
// AND REACT ACCORDINGLY
var target = $(mutation.target);
if(target.hasClass("cart_block")) {
if(target.css("display") == "block") {
$(".ets_mm_megamenu").css("z-index", "-1");
} else {
$(".ets_mm_megamenu").css("z-index", "2");
}
}
mutation.addedNodes.forEach(function(node) {
// Nothing to be here yet...
});
});
}
// SET THE TARGETNODE AS WELL AS THE SETTINGS FOR WHAT TO TRIGGER THE OBSERVER ON, IN THIS CASE
// TRIGGER THE OBSERVER ON ANY CHANGES TO THE STYLE ATTRIBURES OF THE NODE
var targetNodes = document.getElementById("category");
var observerOptions = {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ["style"]
}
// SINCE THIS IS A CLASS, A EACH LOOP IS REQUIRED EVEN IF THERE IS ONLY ONE RESULT
observer.observe(targetNodes, observerOptions);
Есть ли способ отслеживать изменения атрибутов на созданных дочерних узлах внутри родитель, или это просто несбыточная мечта?