Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Prototype] Detecteren of dat een element een child is van

Pagina: 1
Acties:

Onderwerpen


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Ik heb een menu met de volgende opbouw:
HTML:
1
2
3
4
5
6
7
8
<ul id="menu">
    <li class="level0"><a><span>item 1</span></a></li>
    <li class="level0 parent"><a><span>item 2</span></a>
        <ul class="level0">
            <li class="level1"><a><span>child item</span></a></li>
        </ul>
    </li>
</ul>


Als er wordt geklikt op een item moet ik dit detecteren en op het moment dat dit element een parent is (aangegeven met class="parent"), moet ik actie ondernemen.


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var menu = Class.create({
    
    initialize: function(){
        $$("#menu li").invoke('observe', 'click', this.linkClick.bind(this));
    },

    linkClick: function(e){
        var menuElement = e.element();
        // Pseudo code:
        if(Element has class Parent){
            Do Something();
        }
})

document.observe('dom:loaded', function() {
    new menu();
})


menuElement is soms een span, soms een a. Het gemakkelijkste zou zijn om de CSS selector ($$) zo in te stellen zodat deze alleen triggert op het moment dat er op een parent wordt geklikt. Hiervoor heb ik "#nav li.parent a" geprobeert, maar deze triggert ook op alle sub menu items. Performance is belangrijk.

Specialist in:
Soldeerstations
Oscilloscoop


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 26-11 13:16
Zetje in de goede richting (zelf aanpassen naar jouw situatie):

JavaScript:
1
document.getElementById("someElementId").classList.contains("myClass")

  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
classList werkt in te weinig browsers helaas.

Het enige wat ik tot nu toe heb bedacht is om alle ancestors op te vragen en hier doorheen te stappen todat een li.parent is gevonden of tot dat li.parent is uitgesloten doordat bijv. #menu wordt gevonden. Maar dit lijkt me nogal traag.

[ Voor 72% gewijzigd door -DarkShadow- op 07-09-2011 22:38 ]

Specialist in:
Soldeerstations
Oscilloscoop


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 26-11 13:16
Fallback kan je makkelijk maken. Mozilla heeft daar functies voor geschreven, die je hier kan downloaden. ik zou die aan het Element type toevoegen indien die niet bestaan.

(Bron: http://hacks.mozilla.org/2010/01/classlist-in-firefox-3-6/)

Alle browsers behalve IE ondersteunen deze methode trouwens ;).

[ Voor 30% gewijzigd door Styxxy op 07-09-2011 22:46 . Reden: bron toegevoegd ]


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
De className van menuElement (het element waar op geklikt werd) is leeg, dus vziw heb ik niks aan classList of de Protoype equivalenten hasClassName, toggleClassName, etc...

Specialist in:
Soldeerstations
Oscilloscoop


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49

Bosmonster

*zucht*

Nu heb ik weinig kennis van Prototype, maar ik kan me niet voorstellen dat er niet gewoon een parent() method iets is.

jQuery
JavaScript:
1
$(this).parent().hasClass('parent');
Hiervoor heb ik "#nav li.parent a" geprobeert, maar deze triggert ook op alle sub menu items.
Gebruik eens > ipv een spatie in je selector..

[ Voor 30% gewijzigd door Bosmonster op 07-09-2011 22:50 ]


  • -DarkShadow-
  • Registratie: December 2001
  • Niet online
Bosmonster schreef op woensdag 07 september 2011 @ 22:48:
Nu heb ik weinig kennis van Prototype, maar ik kan me niet voorstellen dat er niet gewoon een parent() method iets is.
Gevonden! (Ik ben ook niet ervaren met Prototype). element.up("CSS selector").
[...]
Gebruik eens > ipv een spatie in je selector..
Tnx, dat werkt.
JavaScript:
1
2
3
initialize: function(){
        $$("#nav li.parent>a").invoke('observe', 'click', this.linkClick.bind(this));
    },

Specialist in:
Soldeerstations
Oscilloscoop


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 24-11 18:49
-DarkShadow- schreef op woensdag 07 september 2011 @ 22:32:
Het enige wat ik tot nu toe heb bedacht is om alle ancestors op te vragen en hier doorheen te stappen todat een li.parent is gevonden of tot dat li.parent is uitgesloten doordat bijv. #menu wordt gevonden. Maar dit lijkt me nogal traag.
Toch is dat precies hoe bijv. de 'closest' operator zou werken in jQuery. Sommige dingen kunnen nou eenmaal niet sneller gedaan worden.
Pagina: 1