• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Funkcje nie działają na dynamicznie dodanych divach.

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 13 lutego 2023 w JavaScript przez el maccho Użytkownik (620 p.)
zamknięte 20 lutego 2023 przez el maccho

Funkcja np 

const postMenuToggle = (e) => {
    const closestMenuList = e.target.closest('.postMenu').querySelector('.postMenuList')
    closestMenuList.classList.toggle("hideMenu")
}

nie wykonuje się na dynamicznym divie tworzonym przez funkcję
 

const createPost = () => {
    const postBox = document.createElement('div')
    const postImg = document.createElement('img')
    const postInfo = document.createElement('div')
    const postCounter = document.createElement('div')
    const postPCount = document.createElement('p')
    const postComment = document.createElement('div')
    
    postBox.append(postImg)
    postBox.append(postInfo)
    postCounter.append(postPCount)
    postBox.append(postCounter)
    postBox.append(postComment)
    
    postCounter.classList.add('counter')
    postBox.classList.add('postBox')
    postPCount.classList.add('count')
    postComment.classList.add('commentBox')
    postInfo.classList.add('postInfo')
    
    postPCount.textContent =  Math.floor(Math.random() * 10000) + " polubień"
    postInfo.innerHTML = `                
    <button>
    <i class="fa-regular fa-heart"></i>
    </button>
    <button>
    <i class="fa-regular fa-comment"></i>
    </button>
    <button>
    <i class="fa-regular fa-paper-plane"></i>
    </button>
    
                    <div class="postMenu">
                    <button class="postMenuBtn">
                        <i class="fa-solid fa-ellipsis"></i>
                    </button>

                    <div class="postMenuList hideMenu">
                        <ul>
                            <li>
                                <button><i class="fa-solid fa-caret-right"></i>Usuń post</button>
                            </li>
                            <li>
                                <button><i class="fa-solid fa-caret-right"></i>Edytuj</button>
                            </li>
                        </ul>
                    </div>
                </div>
    
    `
    postComment.innerHTML = `<i class="fa-regular fa-user"></i> <input type="text" name="" id="" placeholder="Dodaj komentarz...">`
    


    let randId = Math.floor(Math.random()*1000+1)
    postImg.setAttribute('src', `https://picsum.photos/680/500?random=${randId}`)

    mainContainer.append(postBox)
    
}

 

Klikając w przyciski 

                <div class="postMenu">
                    <button class="postMenuBtn">
                        <i class="fa-solid fa-ellipsis"></i>
                    </button>

                    <div class="postMenuList hideMenu">
                        <ul>
                            <li>
                                <button class="deletePostBtn"><i class="fa-solid fa-caret-right"></i>Usuń post</button>
                            </li>
                            <li>
                                <button><i class="fa-solid fa-caret-right"></i>Edytuj</button>
                            </li>
                        </ul>
                    </div>
                </div>

nie dzieje się nic. Z czym może być problem?

komentarz zamknięcia: otrzymałem odpowiedź na moje pytanie

2 odpowiedzi

+1 głos
odpowiedź 13 lutego 2023 przez VBService Ekspert (254,440 p.)
wybrane 13 lutego 2023 przez el maccho
 
Najlepsza

Możesz też przypisać zdarzenie w trakcie tworzenia dynamicznie div-a, bez

for(const postMenuBtn of postMenuBtns){
    postMenuBtn.addEventListener('click', postMenuToggle)
}

i

const postMenuBtns = document.querySelectorAll('.postMenuBtn')

 

tylko, np.

[ on-line ]

const createPost = () => {
  
  ...

  postInfo.querySelector('.postMenuBtn').addEventListener('click', postMenuToggle);
  mainContainer.append(postBox);
}

 

+1 głos
odpowiedź 13 lutego 2023 przez Comandeer Guru (602,340 p.)

Bo event listenery są dodawane tylko do elementów, które już istnieją w DOM-ie w czasie ich dodawania. Jak dodajesz przed powstaniem tego diva, to nie zostanie do niego przyczepiony.

Są dwa rozwiązania:

  1. przypinasz listener w trakcie tworzenia diva,
  2. używasz event delegation.
komentarz 13 lutego 2023 przez el maccho Użytkownik (620 p.)

listenery przypinałem za pomocą for of

    for(const postMenuBtn of postMenuBtns){
        postMenuBtn.addEventListener('click', postMenuToggle)
    }

wstawiłem to do funkcji tworzącej diva lecz nadal nie działa. Powinienem zmienić coś z tym listenerem?

komentarz 13 lutego 2023 przez Comandeer Guru (602,340 p.)

A jak pobierasz postMenuBtns?

komentarz 13 lutego 2023 przez el maccho Użytkownik (620 p.)

pobieram za pomocą

    const postMenuBtns = document.querySelectorAll('.postMenuBtn')

Właśnie wstawiłem to do funkcji tworzącej diva i zaczyna coś działać.

Dzięki wielkie za pomoc

Podobne pytania

0 głosów
1 odpowiedź 434 wizyt
pytanie zadane 9 września 2022 w HTML i CSS przez MacieKap Bywalec (2,400 p.)
+1 głos
3 odpowiedzi 261 wizyt
pytanie zadane 26 maja 2021 w C i C++ przez Domika Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 177 wizyt
pytanie zadane 29 lutego 2016 w PHP przez komputerhk Początkujący (250 p.)

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...