[jQuery] Lijst zoeken die na een bepaalde tekst staat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SpaceK33z
  • Registratie: Mei 2009
  • Laatst online: 03-06 19:14

SpaceK33z

Webdeveloper

Topicstarter
Ik ben bezig met een WordPress blog en wil daarvoor een simpel effectje creëren, waarmee een lijst (<ul>) kan uitklappen als er op de titel van de lijst erboven wordt geklikt.
Nou wil ik echter die lijst niet steeds een class mee hoeven te geven, want dat is in WordPress nogal irritant en ik werk ook samen met mensen die helemaal niks van html snappen.

Uiteraard heb ik al gezocht en ook gevonden, alleen niet helemaal het juiste. Met 'after' is het mogelijk om NA een bepaalde tag (wat dus <strong> zou moeten zijn) een lijst of wat dan ook in te voegen. Ik wil echter niks nieuws invoegen, maar alleen die lijst te 'pakken' krijgen.

Met 'contains' krijg ik al de gewenste <strong>:
JavaScript:
1
2
3
$("strong:contains('Default applications')").click(function () {
            $("*deze zou dan de eerstvolgende lijst NA de <strong> moeten pakken*").slideToggle("slow");
});


De code ziet er zo uit, onthoud wel dat er nog meerdere lijsten staan in de pagina.
HTML:
1
2
3
4
5
6
7
8
<strong>Default applications</strong>
<ul>
    <li>Google Apps</li>
    <li>Titanium Backup</li>
    <li>Spare Parts</li>
    <li>DeFroST Setup</li>
    <li>DSPManager</li>
</ul>


Hoe krijg ik via jQuery de eerstvolgende lijst na die <strong> tag te 'pakken'?

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Het is wel erg bad practice om op text content elementen te selecteren. Mensen snappen misschien geen HTML, maar wijzigen wel content... Ik zou hier echt een oplossing voor zoeken (bijv. met een container div incl. class om dat stuk content).

Wat je nu zoekt is "next sibling":
http://api.jquery.com/next/ (of evt. http://api.jquery.com/next-siblings-selector/)

Edit: dit gaat dus ook al mis als strong en ul niet direct na elkaar staan in de markup. Classes! ;)

Edit 2: leuk dat jQuery, er zit ook een "closest" selector in (http://api.jquery.com/closest/) :X

[ Voor 21% gewijzigd door X-Lars op 10-10-2010 10:28 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

closest wordt voornamelijk intern gebruikt in de selector engine (en wordt intensief gebruikt voor event delegation), maar is inderdaad ook via de api beschikbaar

Leuk stukje over de optimalisaties overigens:
http://ejohn.org/blog/closestarray-in-jquery-14/

Je vroeg er niet om, maar je :X smiley leek me wat onbegrijpend :)

[ Voor 50% gewijzigd door Bosmonster op 10-10-2010 11:28 ]


Acties:
  • 0 Henk 'm!

  • SpaceK33z
  • Registratie: Mei 2009
  • Laatst online: 03-06 19:14

SpaceK33z

Webdeveloper

Topicstarter
X-Lars schreef op zondag 10 oktober 2010 @ 10:23:
Het is wel erg bad practice om op text content elementen te selecteren. Mensen snappen misschien geen HTML, maar wijzigen wel content... Ik zou hier echt een oplossing voor zoeken (bijv. met een container div incl. class om dat stuk content).

Wat je nu zoekt is "next sibling":
http://api.jquery.com/next/ (of evt. http://api.jquery.com/next-siblings-selector/)

Edit: dit gaat dus ook al mis als strong en ul niet direct na elkaar staan in de markup. Classes! ;)

Edit 2: leuk dat jQuery, er zit ook een "closest" selector in (http://api.jquery.com/closest/) :X
Dankje :) :). Nou loop ik alleen nog vast, ik weet niet of ik closest() of next() kan gebruiken in combinatie met 'contains' voor die <strong>. Er zit niet echt een andere oplossing op, het is juist de bedoeling dat die <strong> exact die naam heeft dus dat maakt niet veel uit.

Ik heb nou bijvoorbeeld dit, maar dat wil niet echt werken.
JavaScript:
1
2
3
4
$("strong:contains('Default applications')").click(function () {
    $("strong:contains('Default applications')").closest('ul').slideToggle("slow");
    $("strong:contains('Default applications')").toggleClass("activelist");     
});

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Binnen je click function is er een andere scope. Probeer dit eens:
code:
1
this.closest('ul').slideToggle("slow");


Edit: hopelijk werkt dat niet in jQuery, maar het zal wel iets zijn als $(this) i.p.v. this ofzo.

[ Voor 29% gewijzigd door X-Lars op 10-10-2010 11:31 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Als je de API leest zie je dat je closest hier niet kan gebruiken. Next is hier je vriend. (ongeacht over hoe inefficient het is om op content te zoeken..)

Daarnaast doe je dezelfde selector nu 3x. Daar kun je gewoon $(this) gebruiken natuurlijk binnen de event-functie.

@X-Lars: idd, this verwijst naar het DOM-object. jQuery werkt unobtrusive in tegenstelling tot bijvoorbeeld Mootools en Prototype en verandert de DOM elementen niet. Via $(this) krijg je de jQuery functionaliteit van dat element tot je beschikking.

[ Voor 33% gewijzigd door Bosmonster op 10-10-2010 11:45 ]


Acties:
  • 0 Henk 'm!

  • SpaceK33z
  • Registratie: Mei 2009
  • Laatst online: 03-06 19:14

SpaceK33z

Webdeveloper

Topicstarter
Ik snap er helemaal niks meer van. Ik geef jullie even de link: http://keeskluskens.nl/romfinder/12/defrost/
Hier heb ik deze Javascript in staan:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $(document).ready(function() {
        $("strong:contains('Default applications')").click(function () {
            $(this).closest('ul').slideToggle("slow");
            $(this).toggleClass("activelist");
        });
        
        $("strong:contains('Default applications')").next("ul").css("display","none");

        var cssObj = {
        'background' : 'url(http://keeskluskens.nl/romfinder/wp-content/themes/romfinder/images/add.png) no-repeat left center',
        'padding-left' : '25px'
        }
        $("strong:contains('Default applications')").css(cssObj);
        
    });
X-Lars schreef op zondag 10 oktober 2010 @ 11:30:
Binnen je click function is er een andere scope. Probeer dit eens:
code:
1
this.closest('ul').slideToggle("slow");


Edit: hopelijk werkt dat niet in jQuery, maar het zal wel iets zijn als $(this) i.p.v. this ofzo.
Vreemd genoeg werkt dit niet, net zoals de Next siblings selector en .next().

[ Voor 21% gewijzigd door SpaceK33z op 10-10-2010 12:03 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Bosmonster schreef op zondag 10 oktober 2010 @ 11:23:
Je vroeg er niet om, maar je :X smiley leek me wat onbegrijpend :)
Die smiley was er, omdat "closest" me niet echt betrouwbaar leek (stel ik heb een <div/><div/><div/> en ik doe closest() van de middelste, welke krijg ik dan terug?). Maar ik lees nu dat-ie alleen ancestors traversed, en dan vind ik de naam van de method weer niet goed.
Bosmonster schreef op zondag 10 oktober 2010 @ 11:33:
@X-Lars: idd, this verwijst naar het DOM-object. jQuery werkt unobtrusive in tegenstelling tot bijvoorbeeld Mootools en Prototype en verandert de DOM elementen niet. Via $(this) krijg je de jQuery functionaliteit van dat element tot je beschikking.
Daarom zei ik ook "hopelijk werkt dat niet". Had afgelopen week nog zo'n aanvaring met Prototype, snap niet dat ze daar nog niet vanaf gestapt zijn.

Sorry TS, beetje off-topic. Voor jou is ook console.dir() je friend ;)

Acties:
  • 0 Henk 'm!

  • SpaceK33z
  • Registratie: Mei 2009
  • Laatst online: 03-06 19:14

SpaceK33z

Webdeveloper

Topicstarter
X-Lars schreef op zondag 10 oktober 2010 @ 12:03:
...
Sorry TS, beetje off-topic. Voor jou is ook console.dir() je friend ;)
Ik heb geen fouten in de Console gevonden (in Chrome dan).

Edit:
Ik geef het op, dan zet ik maar een extra class in de lijst. Toch bedankt, X-Lars en Bosmonster ;).

[ Voor 17% gewijzigd door SpaceK33z op 10-10-2010 12:18 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Bosmonster schreef op zondag 10 oktober 2010 @ 11:33:
Als je de API leest zie je dat je closest hier niet kan gebruiken. Next is hier je vriend. (ongeacht over hoe inefficient het is om op content te zoeken..)
Pagina: 1