Tarvitsen funktion saadaksesi arvon jokaiselle elementille, jolla on class =” class ”. Mietin, mikä on paras tapa tehdä tämä, suorituskykyisesti.
Tällä hetkellä käytän jQueryä ja teen sen näin:
$("#Button").click(function() { var myElements = $(".class"); for (var i=0;i<myElements.length;i++) { alert(myElements.eq(i).attr("name")); } });
Hälytys on tietysti vain osoitettava, mitä se tekee. Seuraavan HTML-koodin osalta:
<input type="checkbox" class="class" name="1"> <input type="checkbox" class="nope" name="2"> <input type="checkbox" class="class" name="3">
Se aiheuttaisi:
alert("1") alert("3")
Mietin, olisiko puhtaan Javascriptin käyttö nopeampaa vai onko jokin muu (parempi) tapa tehdä se. Pahoittelen, jos tätä kysymystä ei löydy tältä verkkosivustolta, s soveltamisalaan, siirrä se Stackoverflow-kansioon, jos näin on.
Kommentit
- Korvaa aina hälytys konsolilla. blogi hälytys estää koodin suorituksen ja pakottaa sinut napsauttamaan ok tai painamalla Enter niin monta kertaa, kuin tuloksena on.
Vastaa
Pure JS vs jQuery
Pure JavaScript on huomattavasti nopeampi, kuten voit nähdä tämän jsPerf -sivun kautta, joka lävistää document.getElementByClassName
vs. jQuery-valitsin. Täällä ovat tuloksia Chrome 25:
-
$(".class")
– 4355 operaatiot sekunnissa -
getElementsByClassName("class")
– 94636 operaatiota sekunnissa
Kuten näette, tälle yksinkertaiselle toiminnolle jQuery-vaihtoehto on noin 22 kertaa hitaampi kuin puhdas-JavaScript-vastaava. Voit helposti selvittää, miksi näin on, tutustumalla jQuery -kehityslähteeseen , koska jQuery ”valitsintoiminto” on niin yleinen, että sen täytyy tehdä paljon tarkistaa, mikä syöte on, ennen kuin se voi toimia sen mukaan.
Puhdas JS-toteutus
Olen poistunut jQuery click
-tapahtumasta koska näyttää siltä, että sinulla on jo riippuvuus jQuerystä, joten ei ole syytä muuttaa tapaa, jolla kytket tapahtumasi.
$("#Button").click(function() { var items = document.getElementsByClassName("class"); for (var i = 0; i < items.length; i++) alert(items[i].name); });
getElementsByClassName
Huomaa myös, että käytin getElementsByClassName
. On melko tärkeää valita ihanteellinen valitsin, jos välität suorituskyvystä. Koska välitämme kaikista elementeistä tietyllä luokalla, voimme välittömästi hylätä muut, kuten getElementsByTagName
ja querySelectorAll
, ja valita rakennetun toiminnon tietyn luokan elementtien etsimiseen.
jQuery-toteutus
Tämä olisi minun toteutukseni jQuery-sovelluksen avulla. ”>
(ts.$(this)
), koska tavallinen JavaScript-attribuutti on tässä tapauksessa paljon helpompaa.
$("#Button").click(function() { $(".class").each(function() { alert(this.name); }); });
Kommentit
- Täydellinen. Vaikka pidän jQuerystä, pidän siitä vältä sitä, kun se voidaan helposti tehdä puhtaalla Javascriptilla. Jostain syystä en voinut ’ tehdä sitä toimimaan aiemmin, luultavasti tyhmä syntaksivirhe.
- Sama. Vie jonkin aikaa päästäksesi JS-toimintojen ympärille, varmista, että ’ tarkastelet selaimesi virheitä virheen selvittämiseksi.
- Riippuen siitä, mitä haluat tehdä
name
s: llä, voit käyttää jQuery ’ s.map()
taulukon saamiseksi. - @RoToRa Mielestäni se olisi yhtä hyödyllinen kuin
$(".class").each( function() {//stuff});
tässä tapauksessa, mutta kiitos!
Vastaa
sen sijaan, että tallentaisit ne taulukkoa, voit käyttää $.each
-toimintoa silmukoitaaksesi niiden läpi. Näin:
$("#Button").click(function() { $(".class").each( function() { alert( $(this).attr("name") ); } });
Vastaa
Voit tehdä tämän ”puhtaana” JavaScript, teet jotain tällaista, jos käytät ES6-syntaksia:
var elements = document.getElementsByClassName("class"); elements.forEach(e => { alert(e.name) });
Kaikille selaimille, jotka eivät tue ES6: ta (mukaan lukien kaikki IE-versiot):
var elements = document.getElementsByClassName("class"); elements.forEach(function(e) { alert(e.name); });
Jos tarvitaan IE8-tuki:
var elements = document.querySelectorAll(".class"); for (var i = 0; i < elements.length; i++) { alert(elements[i].name); }
Mikä on vähän nopeampi verrattuna jQueryn käyttöön . JQuery on kuitenkin edelleen lyhin koodi:
$(".class").each(e => { alert(e.name); });
kommentit
- Kiitos. Voisin olla tekemisissä yli 100 elementin kanssa, koska sitä käytetään kommenttiosassa. Teen ’ vertailuanalyysin molemmilla koodeilla ja annan palautetta, kun kaikki on tehty. Mietin, voisiko sen sijaan käyttää
document.getElementsByClassName()
ja for for -silmukkaa. Yritin, mutta en voinut ’ saada sitä toimimaan.Käytin samaa silmukassa jadocument.getElementsByClassName('class')[i].name
vastaus
Voit hakea halutut elementit document.querySelectorAll
-toiminnolla:
var namedEls = document.querySelectorAll("input.class"); for (var i=0;i<namedEls.length;i+=1){ console.log(namedEls[i].name); } //=> 1, 3
Tai noutaa nimet yhtenä rivinä Array
:
var names = [].slice.call(document.querySelectorAll("input.class")) .map(function(el){return el.name}); //=> names is now [1,3]
kommentit
- miksi
input[class="class"]
eikäinput.class
? (Ellet halua nimenomaan sulkea pois elementtejä, joissa on useita luokkia.) - Ei erityistä syytä, joten vaihda vastausta. Ei muuta ’ tuloksia.
Vastaa
parent.querySelectorAll([name="value"]);
Dom-tietosi mukaan voi olla erittäin tehokas; Voit valita vanhemmasolmun etsittäväksi tai vain mennä asiakirjaan, jos sinulla ei ole erityistä Dom-tietoa.
Jos käytät mukautettuja elementtejä tai mukautettua nimiavaruutta, se voi olla erittäin tehokas eikä vaadi kirjaston lisäyksiä. Toimii kaikissa moderneissa selaimissa.
Alusta kasvaa ja voi nyt tehdä upeita asioita.