[javascript] Lägga till en meny inuti flera element som kanske inte alltid existerar i DOM

Permalänk
Medlem

[javascript] Lägga till en meny inuti flera element som kanske inte alltid existerar i DOM

Jag vill lägga till en meny på YouTube, men elementen jag vill lägga menyn inuti existerar inte alltid.

Deras DOM ser ut så här typ:

<ytd-page-manager> <ytd-browse page-subtype="home">

Till exempel elementet <ytd-browse page-subtype="trending"> skapas inte förens användaren navigerat dit genom att klicka på Populärt i YouTubes egna meny.

Menyn jag vill lägga till:

function oldAppbar() { // All nav items const navItems = [ {href: '/', text: chrome.i18n.getMessage('c_home')}, {href: '/feed/trending', text: chrome.i18n.getMessage('c_trending')}, ]; let navElem = document.createElement("div"), navList = document.createElement("ul"), navItem, navLink; // Cycle over each nav item for (let i = 0; i < navItems.length; i++) { // Create a fresh list item, and anchor navItem = document.createElement("li"); navLink = document.createElement("a"); // Set properties on anchor navLink.href = navItems[i].href; navLink.innerHTML = navItems[i].text; // add class to li navItem.className = "ytcp-nav-item"; // Add anchor to list item, and list item to list navItem.appendChild(navLink); navList.appendChild(navItem); } // add elements const grid = document.querySelector('ytd-browse'); grid.appendChild(navElem).appendChild(navList); }

En meny måste alltid finnas inuti alla ytd-browse som finns och kommer att finnas i DOM, men jag vet inte hur. Nuvarande meny fungerar enbart på ett av elementen. Jag har provat med querySelectorAll('ytd-browse'), men jag antar att den behöver nån form av loop, och någon function som kan kolla om en ny ytd-browse lagts till?

Visa signatur
Permalänk
Medlem
Skrivet av lassekongo83:

Jag har provat med querySelectorAll('ytd-browse'), men jag antar att den behöver nån form av loop

Det stämmer! Du kan använda en for-loop likt den du redan har.

Citat:

och någon function som kan kolla om en ny ytd-browse lagts till?

Man kan använda en MutationObserver för att få reda på när element läggs till, tas bort eller ändras.

Permalänk
Medlem

Jag löste det lite halvt genom att observera role attributen i ytd-browse. När den är satt till main så sätts elementet in.

let element = document.querySelector('ytd-browse'), role = false; const observer = new MutationObserver(function (mutations) { const grid = document.querySelector('ytd-browse[role="main"]'); grid.appendChild(navElem).appendChild(navList); }); observer.observe(element, { attributes: true, subtree: role });

Jag läste att man bör använda observer.disconnect(); men gör jag det så försvinner min meny när jag navigerar genom youtubes vänstra meny. Är det nåt man behöver tänka på?

Visa signatur
Permalänk
Medlem

observer.disconnect() använder man om man vill sluta lyssna på förändringar. I ditt fall låter det som att du vill fortsätta lyssna ”för evigt”. Det är inget fel med det.