Jeg har brug for en funktion for at få værdien af navneattributten for hvert element med class =” class “. Jeg spekulerede på, hvad der er den bedste måde at gøre dette på, præstationsmæssigt.
I øjeblikket bruger jeg jQuery og gør det sådan:
$("#Button").click(function() { var myElements = $(".class"); for (var i=0;i<myElements.length;i++) { alert(myElements.eq(i).attr("name")); } });
Alert er selvfølgelig bare for at vise, hvad det gør. For følgende HTML:
<input type="checkbox" class="class" name="1"> <input type="checkbox" class="nope" name="2"> <input type="checkbox" class="class" name="3">
Det ville udstede:
alert("1") alert("3")
Jeg spekulerede på, om det ville være hurtigere at bruge rent Javascript, eller om der er nogen anden (bedre) måde at gøre det på. Jeg undskylder, hvis dette spørgsmål ikke findes på dette websteds “s rækkevidde, flyt det til Stackoverflow, hvis det er tilfældet.
Kommentarer
- Udskift altid alarmen med console.log Alert blokerer kode udførelse og tvinger dig til at klikke på ok eller trykke på enter så mange gange som et resultat er fundet.
Svar
Ren JS vs jQuery
Ren JavaScript vil være betydeligt hurtigere, som du kan se ved denne jsPerf , som sætter document.getElementByClassName
vs jQuery-vælgeren. Her er resultaterne for Chrome 25:
-
$(".class")
– 4355 handlinger pr. sekund -
getElementsByClassName("class")
– 94636 operationer pr. sekund
Som du kan se, for denne enkle handling er jQuery-indstillingen ca. 22 gange langsommere end ren JavaScript-ækvivalent. Du kan let se, hvorfor dette er tilfældet ved at tjekke jQuery-udviklingskilden , da jQuery “vælgerfunktion” er så generel, at den skal gøre en masse kontrollerer for at se, hvad input er, før det kan reagere på det.
Ren JS implementering
Jeg har forladt jQuery click
begivenheden da det ser ud til, at du allerede har en afhængighed af jQuery, så ingen mening ændrer den måde, du tilslutter dine begivenheder på.
$("#Button").click(function() { var items = document.getElementsByClassName("class"); for (var i = 0; i < items.length; i++) alert(items[i].name); });
getElementsByClassName
Bemærk også, at jeg brugte getElementsByClassName
. Det er ret vigtigt at vælge den ideelle vælger, hvis du er interesseret i ydeevne. Da vi bryr os om alle elementer med en bestemt klasse, kan vi straks afvise de andre som getElementsByTagName
og querySelectorAll
og vælge den funktion, der blev bygget for at finde elementer i en bestemt klasse.
jQuery-implementering
Dette ville være min implementering ved hjælp af jQuery, bemærk at jeg ikke gider at få jQuery-objektet til this
(dvs. $(this)
) fordi den almindelige JavaScript-attribut er meget lettere i dette tilfælde.
$("#Button").click(function() { $(".class").each(function() { alert(this.name); }); });
Kommentarer
- Perfekt. Selvom jeg kan lide jQuery I undgå det, når det let kan gøres med rent Javascript. Af en eller anden grund kunne jeg ikke ' ikke få det til at fungere før, sandsynligvis en stum syntaksfejl.
- Ditto. Det tager et stykke tid at få hovedet rundt om alle JS-funktionerne. Sørg for, at du ' ser på dine browserfejl for at debugge det.
- Afhængigt af hvad du vil gøre med
name
s, kan du bruge jQuery ' s.map()
for at få en matrix. - @RoToRa Jeg tror, det ville være lige så nyttigt som
$(".class").each( function() {//stuff});
i dette tilfælde, men tak!
Svar
I stedet for at gemme dem i et array, kan du bruge $.each
-funktionen til at løbe igennem dem. Sådan:
$("#Button").click(function() { $(".class").each( function() { alert( $(this).attr("name") ); } });
Svar
At gøre dette er i “ren” JavaScript, du gør noget som dette, hvis du bruger ES6-syntaks:
var elements = document.getElementsByClassName("class"); elements.forEach(e => { alert(e.name) });
For alle browsere, der ikke understøtter ES6 (inklusive alle versioner af IE):
var elements = document.getElementsByClassName("class"); elements.forEach(function(e) { alert(e.name); });
Hvis IE8-understøttelse er påkrævet:
var elements = document.querySelectorAll(".class"); for (var i = 0; i < elements.length; i++) { alert(elements[i].name); }
Hvilket vil være en smule hurtigere sammenlignet med jQuery . Dog vil jQuery stadig være den korteste kode:
$(".class").each(e => { alert(e.name); });
Kommentarer
- Tak. Jeg har måske at gøre med 100+ elementer, da dette vil blive brugt i en kommentarsektion. Jeg ' Jeg foretager nogle benchmarking med begge koder og giver feedback, når alt er gjort. Jeg spekulerede på, om det ville være muligt at bruge
document.getElementsByClassName()
og en for-loop i stedet. Jeg prøvede, men kunne ikke ' ikke få det til at fungere.Jeg brugte det samme til loop ogdocument.getElementsByClassName('class')[i].name
Svar
Du kan bruge document.querySelectorAll
til at hente de ønskede elementer:
var namedEls = document.querySelectorAll("input.class"); for (var i=0;i<namedEls.length;i+=1){ console.log(namedEls[i].name); } //=> 1, 3
Eller som en liner for at hente navne som Array
:
var names = [].slice.call(document.querySelectorAll("input.class")) .map(function(el){return el.name}); //=> names is now [1,3]
Kommentarer
- Hvorfor
input[class="class"]
og ikkeinput.class
? (Medmindre du specifikt vil ekskludere elementer med flere klasser.) - Ingen særlig grund, så ændrede svaret. Ændrer ' ikke resultaterne.
Svar
parent.querySelectorAll([name="value"]);
Afhængigt af din viden om din Dom kan være super effektiv; Du kan vælge den overordnede node, der skal søges i, eller bare gå til dokumentet, hvis du ikke har nogen specifik Dom-viden.
Hvis du bruger brugerdefinerede elementer eller brugerdefineret navneplads, kan det være meget effektivt og kræver ingen tilføjelser til biblioteket. Fungerer i alle moderne browsere.
Platformen vokser og kan nu gøre fantastiske ting.