Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno HTML seznam ul li - volání metody pouze potomka

Ahoj,

mám nepříjemný problém s probubláváním metod elementů u seznamu v HTML s pomocí jQuery.

Jde mi o tohle:

<li id="child_node_1" >Produkty (všechny)
<ul>
<li>Podprodukty
<ul>
<li onclick="ajaxLoadURL('wasserlacke')">Polozka 1
<ul>
<li>Polozka 2
<ul>
<li> Polozka 3
<ul>
<li onclick="ajaxLoadURL('HENECRYL1K-2K')";>
Polozka 4
</li>
</li>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</li>
</ul>
</li>

Ve zkratce jde o to, že když kliknu na kteréhokoliv potomka, tak event mi probublává přes rodiče.
Jde mi o to, aby když kliknu na POLOŽKU4, tak aby se provedla jen její funkce (onclick).
Škodí když se provádí i funkce u nadřízené položky 1.

Kdo se s tímto setkal, tak je mu asi jasné co mě vadí.

Podstatné také je, aby se nějak předal parametr metody ajaxLoadURL.
Díky za radu, hledám nějaké elegantní řešení.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Elegantni reseni: event.stopPropagation() Mrkni na to :-)
vopicak 09.02.2019 00:26
vopicak
To je mi známo. Našel jsem konkrétně: $('li').click(function(event) { if (this === event.target) {…
Flash_Gordon 09.02.2019 00:30
Flash_Gordon
Ak to chceš mať inline v atribúte, tak môžeš použiť premennú event, ktorá je implicitne nastavená: o…
moose 09.02.2019 01:29
moose
Děkuji za navržená řešení. Zkoušel jsem obě. První nefunguje, ale druhé je ještě lepší a funkční.… poslední
Flash_Gordon 09.02.2019 01:45
Flash_Gordon

Ak to chceš mať inline v atribúte, tak môžeš použiť premennú event, ktorá je implicitne nastavená: onclick="ajaxLoadURL(event, 'HENECRYL1K-2K')". Následne v ajaxLoadURL zavoláš stopPropagation.

Ak to chceš lepšie, tak namiesto inline JavaScriptu nastavíš všetko deklaratívne a JavaScript následne nainicializuješ. V tom prípade dáš rootu nejaký identifikátor (dajme tomu, že ten child_node_1, ktorý tam už máš) a URL nastavíš do dátových atribútov: <li data-url="HENECRYL1K-2K">. Obsluhu JavaScriptom potom budeš mať na jednom mieste a bude vyzerať zhruba takto:

const tree = document.getElementById('child_node_1');
tree.onclick = event => {
    const item = event.target.closest('li');
    if (item.dataset.url) {
        ajaxLoadURL(item.dataset.url);
    }
}

Kód som písal z hlavy, tak tam môžu byť chyby.

Zpět do poradny Odpovědět na původní otázku Nahoru