Permalänk

jQuery show/hide med flera ID

Hejsan.
Har hittat ett jQuery script;

// initialize the jquery code $(document).ready(function(){ //close all the content divs on page load $('.mover').hide(); // toggle slide $('#slideToggle').click(function(){ // by calling sibling, we can use same div for all demos $(this).siblings('.mover').slideToggle(); }); });

Problemet med detta script är att jag inte kan ha flera show / hide på samma sida, då öppnas och stängs dom samtidigt.
Hur skulle man kunna ändra på detta för att få det att fungera med individuella ID?

Här finns HTML koden:

<div class="pusher" id="slideToggle">Show / Hide</div> <div class="mover"> Text </div>

Tack i förhand!
/seamonster

Visa signatur

"I think everybody I know is NPCs"
Intel C2Q Q6660 | 4096MB RAM | GeForce GTS250 1GB

Permalänk
Medlem

Här är två lösningar som gör att du kan ha hur många sådana här som helst. Den första varianten har bäst prestanda, den andra varianten är lättast att förstå. Bytte till länk, men du kan byta tillbaka om du vill. Ta i så fall bort return false.

<a href="#" class="pusher">Show / Hide</a> <div class="mover"> Text </div> $(document).ready(function(){ // Loopa igenom varje .pusher för prestanda $('div.pusher').each(function(){ // Lagra this för prestanda var $this = $(this); $this.next().hide(); $this.click(function(){ $this.next().slideToggle(); return false; }); }); }); // Variant 2 - lättare att förstå men långsammare $(document).ready(function(){ $('div.mover').hide(); $('a.pusher').click(function(){ $(this).next().slideToggle(); return false; }); });

Permalänk

Tog den första eftersom jag inte förstår så mycket Javascirpt över huvud taget, har aldrig tagit mig tiden o lära mig det.

Men nu funkar det perfekt, tack så mycket

Visa signatur

"I think everybody I know is NPCs"
Intel C2Q Q6660 | 4096MB RAM | GeForce GTS250 1GB

Permalänk
Medlem

Varför är version 2 långsammare?

Citat:

Ursprungligen inskrivet av azoapes
Här är två lösningar som gör att du kan ha hur många sådana här som helst. Den första varianten har bäst prestanda, den andra varianten är lättast att förstå. Bytte till länk, men du kan byta tillbaka om du vill. Ta i så fall bort return false.

<a href="#" class="pusher">Show / Hide</a> <div class="mover"> Text </div> $(document).ready(function(){ // Loopa igenom varje .pusher för prestanda $('.pusher').each(function(){ // Lagra this för prestanda var $this = $(this); $this.next().hide(); $this.click(function(){ $this.next().slideToggle(); return false; }); }); }); // Variant 2 - lättare att förstå men långsammare $(document).ready(function(){ $('.mover').hide(); $('.pusher').click(function(){ $(this).next().slideToggle(); return false; }); });

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av nystan
Varför är version 2 långsammare?

För att den först letar igenom DOM efter klassen .mover och sen letar igenom hela DOM igen efter klassen .pusher, medan version 1 bara letar igenom DOM en gång, efter .pusher

Att söka igenom DOM efter klasser är riktigt långsamt. Att spara $(this) i en cache-variabel är inte alls viktigt i jämförelse, men man sparar några millisekunder på det också. Jag gjorde just ett test för att bevisa detta för mig själv, och då tog det 2,1 sek att köra testet med $(this) och 1,5 sek att köra testet med en cachad variabel $this

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av azoapes
För att den först letar igenom DOM efter klassen .mover och sen letar igenom hela DOM igen efter klassen .pusher, medan version 1 bara letar igenom DOM en gång, efter .pusher

Så sant, så sant, men jag undrar om inte i moderna webläsare (som implementerar .querySelector och .querySelectorAll) ändå är snabba på att leta upp även klasser (jag gjorde en snabb koll genom jQuery sourcen och det verkar som om den använder dessa native metoder om de finns). Men det är bra att vara på den säkra sidan (och tänka på de äldre webbläsarna)!

Citat:

Att söka igenom DOM efter klasser är riktigt långsamt. Att spara $(this) i en cache-variabel är inte alls viktigt i jämförelse, men man sparar några millisekunder på det också. Jag gjorde just ett test för att bevisa detta för mig själv, och då tog det 2,1 sek att köra testet med $(this) och 1,5 sek att köra testet med en cachad variabel $this

Det är en klar prestandaförbättring, att skapa ett nytt jQuery objekt ($(this)) varje gång det ska användas är klart dyrt.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av nystan
Så sant, så sant, men jag undrar om inte i moderna webläsare (som implementerar .querySelector och .querySelectorAll) ändå är snabba på att leta upp även klasser (jag gjorde en snabb koll genom jQuery sourcen och det verkar som om den använder dessa native metoder om de finns). Men det är bra att vara på den säkra sidan (och tänka på de äldre webbläsarna)!

Det är bara typ 5-10 % av besökarnas webbläsare som klarar querySelector så det är ganska odugligt ännu. jQuery använder Sizzle som CSS3-motor, och Sizzle är ju inte direkt känt för att vara snabbt... det är stabilt, men långt ifrån snabbast. Att selektera klasser med jQuery är ganska snabbt i Fx, Chrome etc. men testa IE... att 1000 gånger selektera 1000 st divar med $('div.klass') i IE8 tar ca 9,6 sekunder. Jämför med samma operation i Chrome som tar ca 0,16 sekunder (ca 1 s i Fx). Selekterar man $('div') i IE8 tar det ca 1,45 sekunder. Detsamma tar ca 0,12 sekunder i Chrome (ca 0,5 s i Fx).

Permalänk
Medlem

Jag var medveten om tekniken bakom jQuery men inte visste jag att det var en sån stor skillnad när man går till IE. Jag får ta och lägga det på minnet till framtida projekt (eller om man medvetet struntar i IE så klarar man sig ändå, hur många % av besökarna som har en modern webbläsare är helt beroende på ens målgrupp (5-10% är alltså inte sant, alltid)

Citat:

Ursprungligen inskrivet av azoapes
Det är bara typ 5-10 % av besökarnas webbläsare som klarar querySelector så det är ganska odugligt ännu. jQuery använder Sizzle som CSS3-motor, och Sizzle är ju inte direkt känt för att vara snabbt... det är stabilt, men långt ifrån snabbast. Att selektera klasser med jQuery är ganska snabbt i Fx, Chrome etc. men testa IE... att 1000 gånger selektera 1000 st divar med $('div.klass') i IE8 tar ca 9,6 sekunder. Jämför med samma operation i Chrome som tar ca 0,16 sekunder (ca 1 s i Fx). Selekterar man $('div') i IE8 tar det ca 1,45 sekunder. Detsamma tar ca 0,12 sekunder i Chrome (ca 0,5 s i Fx).

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av nystan
Jag var medveten om tekniken bakom jQuery men inte visste jag att det var en sån stor skillnad när man går till IE.

Det är viktigt att titta på prestanda i Fx också, 1 s är en helt oacceptabel laddningstid jämfört med 160 ms, och det var i Fx 3.6 med jQ 1.4. Jag vet inte om jQ använder querySelector/All i Fx för i så fall är har Mozilla gjort en riktigt långsam native-funktion där, iaf jämfört med Chrome.

Permalänk
Medlem

När vi ändå delar med oss av jQuery snippets så vill jag bidraga med min variant:

$(document).ready(function() { /* ända .showorhide till en annan klass eller matchning du vill använda som klickare */ $('.showorhide').live('click', function() { /* hämta elementet direct efter det klickade och göm eller visa detta */ var nextTarget = $(this).next(); /* Här anger 1000 duration, alltså ska animationen ta 1000 milisekunder */ $(nextTarget).slideToggle(1000); /* för att inte få oönskad effekt om en länk används för klicket. */ return false; }); });

Detta fungerar på det viset att vi tänker oss två DIV:ar:

<div class="showorhide">Göm visa innehåll under.</div> <div class="whatEver">Innehåll.... bla bla bla bla...</div>

Kanske inte mångsidigt men bör fylla den funktion du behöver eftersom du kan langa in hur många klickare och visa/göm divar du vill på sidan och alla kommer bara öppna den div direkt efter den du klickar på. eller stänga.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.