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í.

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
Ve frontendu se nepohybuju, ale co je mi známo, tak $('li') znamená, že se má najít prvek s id 'li'.…
vladah 09.02.2019 01:06
vladah
Děkuji za radu, ale tohle si nemohu dovolit. V mém případě je dokonce použita komponenta: https://…
Flash_Gordon 09.02.2019 01:10
Flash_Gordon
https://www.jstree.com/api/#/ sem jsi se díval? Edit: a hlavně sem? https://github.com/vakata/jstr…
vladah 09.02.2019 01:17
vladah
Dívám se tam, ale nenacházím, co potřebuji. Můj strom zkrátka reprezentuje zboží. Při klepnutí na p…
Flash_Gordon 09.02.2019 01:28
Flash_Gordon
A co třeba ten event "selected"? Podívej se co ti vrací. Pak v konfiguraci (json) budeš moct přidat…
vladah 09.02.2019 01:37
vladah
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

Ve frontendu se nepohybuju, ale co je mi známo, tak $('li') znamená, že se má najít prvek s id 'li'. Nebo je to jinak? Každopádně pokud ano, tak potom stačí přidat "id" attribute nějakému konkrétnímu prvku a potom na něj navázat onclick event s konkrétní hodnotou.

Potom to může vypadat nějak takto

<li id="prvek"></li>
<script>
$("prvek").click(function(event) {
    if (this === event.target) {
        ajaxLoadURL('HENECRYL1K-2K');
    }
});
</script>

Případně by šlo využít to "vybublání", ale tímhle si nejsem moc jistej


$("nejvyssi_prvek").click(function(event) {
    if (event.target === $("nizsi_prvek")) {
        ajaxLoadURL('HENECRYL1K-2K');
    } else (event.target === $("jiny_nizsi_prvek")) {
        ajaxLoadURL('HENECRYL1K-5K');
    }
});

Dívám se tam, ale nenacházím, co potřebuji.

Můj strom zkrátka reprezentuje zboží.
Při klepnutí na položku potřebuji přes ajax natáhnout text do divu (dynamicky přes Ajax).

Je ale úplně k zlosti, když uživatel klikně na kategorii (zobrazí se mu obecný popis kategorie) a
potom klikne na konkrétní položku a ta jen "problikne" a zůstane zobrazen obecný název z nadřazené kategorie.

Chápeš, co myslím.

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