JQuery - innehåll i element: Skillnad mellan sidversioner

Från Webbling
Hoppa till: navigering, sök
 
(29 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:


I grunden finns det två sätt på vilka man kan få tillgång till innehållet i ett element. Dels kan vi komma åt den rena text som eventuellt står där, dels kan vi komma åt den HTML-kod som finns i noden. Vi kan antingen läsa ut elementets innehåll eller ändra på det.
I grunden finns det två sätt på vilka man kan få tillgång till innehållet i ett element. Dels kan vi komma åt den rena text som eventuellt står där, dels kan vi komma åt den HTML-kod som finns i elementet. Vi kan antingen läsa ut elementets innehåll eller ändra på det.


De två huvudsakliga metoderna som är till för att manipulera elements innehåll är; <code>.text()</code> och <code>.html()</code>. Vi kommer nu att gå igenom hur dessa två metoder fungerar.
De två huvudsakliga metoderna som är till för att manipulera elements innehåll är; <code>.text()</code> och <code>.html()</code>. Vi kommer nu att gå igenom hur dessa två metoder fungerar.


<div class="well well-warning">
<div class="well well-warning">
OBS man kan inte läsa ut innehållet i <code>[[input]]</code>-element som finns i formulär med dessa två kommandon. Vill du ha innehållet ifrån t.ex. ett textfält läser du ut det med metoden <code>.val()</code> istället.
OBS Dessa två kommandon kan kan inte läsa ut innehållet som finns i <code>[[input]]</code>-element och liknande element som används i formulär. Vill du ha innehållet ifrån t.ex. ett textfält läser du ut det med metoden <code>.val()</code> istället.
</div><!-- end well -->
</div><!-- end well -->


== Grundexempel ==
== Grundexempel ==
För exemplen i denna sektion, kommer vi att använda oss av följande grund för HTML-biten:
För exemplen i denna sektion, kommer vi att använda oss av följande grund för HTML-biten:
<codepen pen="VempyY" tab="html" height="330">
<codepen pen="VempyY" tab="html,result" height="400">
</codepen>
</codepen>


Här skapas en enkel HTML-struktur, där topphalvan är till för att vi ska ha något att experimentera med och bottenhalvan, den gulfärgade ytan, är till för att visa upp resultatet ifrån vårt JavaScript. Tryck på fliken "Result" för att se hur slutresultatet blir att se ut.
Här skapas en enkel HTML-struktur, där topphalvan är till för att vi ska ha något att experimentera med och bottenhalvan, den gulfärgade ytan, är till för att visa upp resultatet ifrån vårt JavaScript.


== <code>.text()</code>==
== <code>.text()</code>==
=== Nod med enkelt innehåll ===
=== Element med enkelt innehåll ===
Om du vill ha det rena textinnehållet som finns inuti ett element, kan du använda dig av metoden <code>.text()</code>. Här följer ett kort grundexempel:
Om du vill ha det rena textinnehållet som finns inuti ett element, kan du använda dig av metoden <code>.text()</code>. Här följer ett kort grundexempel:
<codepen pen="EPNjax" tab="js" height="340">
<codepen pen="EPNjax" tab="js,result" height="400">
</codepen>
</codepen>
(Återigen, tryck på "Result" för att se resultatet.)


På rad ett i JavaScript-koden läser vi ut innehållet som finns i det HTML-element som har klassen <code>a</code>.  Innehållet läses ut med metoden <code>.text()</code>. När man kallar på denna metod utan att ange någon parameter, så kommer jQuery att läsa ut innehållet ur angivet element.
På rad ett i JavaScript-koden läser vi ut innehållet som finns i det HTML-element som har klassen <code>a</code>.  Innehållet läses ut med metoden <code>.text()</code>. När man kallar på denna metod utan att ange någon parameter, så kommer jQuery att läsa ut innehållet ur angivet element.


På rad två väljer vi ut det <code>p</code>-element som ligger i ett element vars ID är satt till <code>resultat</code>. Nu använder vi oss av en parameter i <code>text()</code>-metoden. När vi gör detta kommer eventuellt textinnehåll i det utvalda elementet att ersättas med det innehåll som vi anger med vår parameter. I vårt fall innebär det att den nuvarande texten, "<code>Detta skrivs över</code>" ersätts med innehållet i vår variabel <code>a</code>. Denna variabel innehåller den text som vi läste ut på föregående rad, dvs innehållet i det <code>p</code>-element som har klassen <code>a</code>. Alltså  texten "<code>Paragraf 1</code>".
På rad två väljer vi ut det <code>p</code>-element som ligger i ett element vars ID är satt till <code>resultat</code>. Nu använder vi oss av en parameter i <code>text()</code>-metoden. När vi gör detta kommer eventuellt textinnehåll i det utvalda elementet att ersättas med det innehåll som vi anger med vår parameter. I vårt fall innebär det att den nuvarande texten, "<code>Detta skrivs över</code>" ersätts med innehållet i vår variabel <code>a</code>. Denna variabel innehåller den text som vi läste ut på föregående rad, dvs innehållet i det <code>p</code>-element som har klassen <code>a</code>. Alltså  texten "<code>Stycke 1</code>".


=== Nod med komplext innehåll ===
=== Element med komplext innehåll ===
I nästa exempel ska vi se vad som händer om vi tar ut text ifrån ett element som har flera underelement.
I nästa exempel ska vi se vad som händer om vi tar ut text ifrån ett element som har flera underelement.
<codepen pen="GoNJoM" tab="js" height="340">
<codepen pen="GoNJoM" tab="js,result" height="400">
</codepen>
</codepen>


I detta fall väljer vi ut det <code>div</code>-element som innehåller ett antal <code>p</code>-element. Som resultat får vi allt textinnehåll som finns i de olika <code>p</code>-elementen.
I detta fall väljer vi ut elementet som har klassen <code>n</code>. Detta är en <code>div</code> som innehåller ett antal <code>p</code>-element. Nu kommer vår <code>.text()</code> att läsa ut allt textinnehåll som finns i de olika <code>p</code>-elementen.


Lägg märke till att det enbart är det rena textinnehållet, vi får inte med något av den HTML-kod som skapat elementen.  Med andra ord så läser <code>text()</code> ut textinnehållet ur elementet och alla dess underelement.
Lägg märke till att vi enbart får det rena textinnehållet. Vi får inte med något av den HTML-kod som skapat elementen.  Med andra ord så läser <code>text()</code> ut allt textinnehåll ur elementet och alla dess underelement.


Det kan alltså vara bra att göra en mycket specifik sökning när man anger vilket element man ska välja ut, så att man inte får med en massa extra text.
Det kan alltså vara bra att göra en mycket specifik sökning när man anger vilket element man ska välja ut, så att man inte får med en massa extra text.


=== Läsa flera noder samtidigt ===
=== Läsa flera element samtidigt ===
Vi provar en annan variant. Den här gången väljer vi ut alla <code>p</code>-element.
Vi provar en annan variant. Den här gången väljer vi ut alla <code>p</code>-element.
<codepen pen="gPLpro" tab="js" height="340">
<codepen pen="gPLpro" tab="js,result" height="400">
</codepen>
</codepen>


Vi får då tillbaka en sträng som innehåller det sammanlagda textinnehållet ifrån alla <code>p</code>-element. Lägg märke till att vi även får texten som finns från början i <code>resultat</code>, dvs ”<code>Detta skrivs över</code>”. Vi läser ju ut innehållet som finns i elementet innan vi skriver över detta med nytt innehåll.
Vi får då tillbaka en sträng som innehåller det sammanlagda textinnehållet ifrån alla <code>p</code>-element. Lägg märke till att vi även får texten som finns från början i <code>resultat</code>, dvs ”<code>Detta skrivs över</code>”. Vi läser ju ut innehållet som finns i elementeten ''innan'' vi sätter det till nytt innehåll.


=== Sätta flera noder samtidigt ===
=== Sätta flera element samtidigt ===
Vad händer då om vi väljer ut alla <code>p</code>-element och använder <code>.text('skriv över');</code>?
Vad händer då om vi väljer ut alla <code>p</code>-element och använder <code>.text('skriv över');</code>?
<codepen pen="VemLjp" tab="js" height="310">
<codepen pen="VemLjp" tab="js,result" height="400">
</codepen>
</codepen>


Kolla in resultatet. Som förväntat så ersätts innehållet i varje <code>p</code>-element med den text vi skickade in. jQuery loopar alltså igenom alla <code>p</code>-element som matchas och kör den angivna metoden på varje nod som matchar.
Kolla in resultatet. Som förväntat så ersätts innehållet i varje <code>p</code>-element med den text vi skickade in. jQuery loopar alltså igenom alla <code>p</code>-element som matchas och kör den angivna metoden på varje element som matchar.


=== Ändra innehåll i en komplex nod ===
=== Ändra innehåll i ett komplex element ===
Nu ska vi prova att ersätta textinnehållet ett element som har flera underelement.
Nu ska vi prova att ersätta textinnehållet i ett element som har flera underelement.
<codepen pen="RroPGZ" tab="js" height="330">
<codepen pen="RroPGZ" tab="js,result" height="400">
</codepen>
</codepen>


Som du ser så skrevs alla underelement över med den angivna texten och de försvann dessa element ifrån vår [[DOM]].
Som du ser så skrevs alla underelement över med den angivna texten. De element som fanns där försvann ifrån vår [[DOM]].


== [[.html()]] ==
== [[.html()]] ==


=== Att visa med <code>text()</code>===
=== Att visa med <code>text()</code>===
Om man vill ha med den HTML-kod som byggt upp ett utvalt element, använder man sig av <code>.html()</code>. Denna metod fungerar i stort sett såsom <code>.text()</code> med den skillnaden att man istället för att hantera ren text hanterar html-kod.
Om man inte bara vill komma åt textinnehållet, utan även vill ha med den HTML-kod som byggt upp utvalt element, använder man sig av <code>.html()</code>. Denna metod fungerar i stort sett såsom <code>.text()</code> med den skillnaden att man istället för att hantera ren text hanterar html-kod.


Ett exempel på detta:
Ett exempel på detta:
<codepen pen="jWVPVd" tab="js" height="400">
<codepen pen="jWVPVd" tab="js,result" height="400">
</codepen>
</codepen>


Vi läser alltså ut innehållet med <code>.html()</code> och visar det med <code>.text(a)</code>. Här ser vi att vi får den rena HTML-koden som motsvarar allt innehåll i vår <code>div</code>. Dock får vi inte med HTML-koden som skapade själva elementet vi valde ut, utan vi får enbart innehållet i det!
Vi läser alltså ut innehållet med <code>.html()</code> och visar det med <code>.text(a)</code>. Här ser vi att vi får den rena HTML-koden som motsvarar allt innehåll i vår <code>div</code>. Dock får vi inte med HTML-koden som skapade själva elementet vi valde ut, utan vi får enbart de innehåll som finns inuti elementet.


<div class="well well-meadow">
<div class="well well-meadow">
Rad 76: Rad 74:
=== Att visa med <code>html()</code>===
=== Att visa med <code>html()</code>===
Om vi istället skulle visa det utlästa innehållet med <code>.html(a)</code> skulle resultatet bli följande:
Om vi istället skulle visa det utlästa innehållet med <code>.html(a)</code> skulle resultatet bli följande:
 
<codepen pen="zroGZG" tab="js,result" height="475">
<codepen pen="zroGZG" tab="js" height="410">
</codepen>
</codepen>


Webbläsaren omvandlade alltså strängen med HTML-kod till nytt innehåll och skapade nya element utifrån detta.
Webbläsaren omvandlade alltså strängen med HTML-kod till nya element. Vi kan därmed skapa nytt innehåll dynamiskt.


== Att manipulera DOM är kostsamt ==
== Att manipulera DOM är kostsamt ==

Nuvarande version från 12 januari 2019 kl. 22.52

I grunden finns det två sätt på vilka man kan få tillgång till innehållet i ett element. Dels kan vi komma åt den rena text som eventuellt står där, dels kan vi komma åt den HTML-kod som finns i elementet. Vi kan antingen läsa ut elementets innehåll eller ändra på det.

De två huvudsakliga metoderna som är till för att manipulera elements innehåll är; .text() och .html(). Vi kommer nu att gå igenom hur dessa två metoder fungerar.

OBS Dessa två kommandon kan kan inte läsa ut innehållet som finns i input-element och liknande element som används i formulär. Vill du ha innehållet ifrån t.ex. ett textfält läser du ut det med metoden .val() istället.

Grundexempel

För exemplen i denna sektion, kommer vi att använda oss av följande grund för HTML-biten:

See the Pen VempyY by Patrik Grip-Jansson (@PGJ) on CodePen.

Här skapas en enkel HTML-struktur, där topphalvan är till för att vi ska ha något att experimentera med och bottenhalvan, den gulfärgade ytan, är till för att visa upp resultatet ifrån vårt JavaScript.

.text()

Element med enkelt innehåll

Om du vill ha det rena textinnehållet som finns inuti ett element, kan du använda dig av metoden .text(). Här följer ett kort grundexempel:

See the Pen EPNjax by Patrik Grip-Jansson (@PGJ) on CodePen.

På rad ett i JavaScript-koden läser vi ut innehållet som finns i det HTML-element som har klassen a. Innehållet läses ut med metoden .text(). När man kallar på denna metod utan att ange någon parameter, så kommer jQuery att läsa ut innehållet ur angivet element.

På rad två väljer vi ut det p-element som ligger i ett element vars ID är satt till resultat. Nu använder vi oss av en parameter i text()-metoden. När vi gör detta kommer eventuellt textinnehåll i det utvalda elementet att ersättas med det innehåll som vi anger med vår parameter. I vårt fall innebär det att den nuvarande texten, "Detta skrivs över" ersätts med innehållet i vår variabel a. Denna variabel innehåller den text som vi läste ut på föregående rad, dvs innehållet i det p-element som har klassen a. Alltså texten "Stycke 1".

Element med komplext innehåll

I nästa exempel ska vi se vad som händer om vi tar ut text ifrån ett element som har flera underelement.

See the Pen GoNJoM by Patrik Grip-Jansson (@PGJ) on CodePen.

I detta fall väljer vi ut elementet som har klassen n. Detta är en div som innehåller ett antal p-element. Nu kommer vår .text() att läsa ut allt textinnehåll som finns i de olika p-elementen.

Lägg märke till att vi enbart får det rena textinnehållet. Vi får inte med något av den HTML-kod som skapat elementen. Med andra ord så läser text() ut allt textinnehåll ur elementet och alla dess underelement.

Det kan alltså vara bra att göra en mycket specifik sökning när man anger vilket element man ska välja ut, så att man inte får med en massa extra text.

Läsa flera element samtidigt

Vi provar en annan variant. Den här gången väljer vi ut alla p-element.

See the Pen gPLpro by Patrik Grip-Jansson (@PGJ) on CodePen.

Vi får då tillbaka en sträng som innehåller det sammanlagda textinnehållet ifrån alla p-element. Lägg märke till att vi även får texten som finns från början i resultat, dvs ”Detta skrivs över”. Vi läser ju ut innehållet som finns i elementeten innan vi sätter det till nytt innehåll.

Sätta flera element samtidigt

Vad händer då om vi väljer ut alla p-element och använder .text('skriv över');?

See the Pen VemLjp by Patrik Grip-Jansson (@PGJ) on CodePen.

Kolla in resultatet. Som förväntat så ersätts innehållet i varje p-element med den text vi skickade in. jQuery loopar alltså igenom alla p-element som matchas och kör den angivna metoden på varje element som matchar.

Ändra innehåll i ett komplex element

Nu ska vi prova att ersätta textinnehållet i ett element som har flera underelement.

See the Pen RroPGZ by Patrik Grip-Jansson (@PGJ) on CodePen.

Som du ser så skrevs alla underelement över med den angivna texten. De element som fanns där försvann ifrån vår DOM.

.html()

Att visa med text()

Om man inte bara vill komma åt textinnehållet, utan även vill ha med den HTML-kod som byggt upp utvalt element, använder man sig av .html(). Denna metod fungerar i stort sett såsom .text() med den skillnaden att man istället för att hantera ren text hanterar html-kod.

Ett exempel på detta:

See the Pen jWVPVd by Patrik Grip-Jansson (@PGJ) on CodePen.

Vi läser alltså ut innehållet med .html() och visar det med .text(a). Här ser vi att vi får den rena HTML-koden som motsvarar allt innehåll i vår div. Dock får vi inte med HTML-koden som skapade själva elementet vi valde ut, utan vi får enbart de innehåll som finns inuti elementet.

Lägg märke till att vi även får med de attribut som är angivna i varje element.

Att visa med html()

Om vi istället skulle visa det utlästa innehållet med .html(a) skulle resultatet bli följande:

See the Pen zroGZG by Patrik Grip-Jansson (@PGJ) on CodePen.

Webbläsaren omvandlade alltså strängen med HTML-kod till nya element. Vi kan därmed skapa nytt innehåll dynamiskt.

Att manipulera DOM är kostsamt

Återigen... Att göra ändringar i DOM kan innebära att sidan måste ritas om ifrån grunden. Vilket kan vara tungt för webbläsaren. Så gör inte detta i onödan. Försök att göra alla ändringar i en enda stor, samtidig ändring istället för att göra många små ändringar. Då behöver sidan bara ritas om en gång. Självklart så gör man ändringar enbart då detta är absolut nödvändig.

Optimering är en hel vetenskap och speciellt krångligt blir det när man börjar involvera olika webbläsare. Dessa kanske är olika bra på olika saker. Rent generellt är det bäst att skriva klart sin applikation, så allt fungerar och börja optimera först efter man har all tänkt funktionalitet färdig.

Nästa aktivitet

jQuery - element-samlingar