Szükségem van egy függvényre, hogy megkapjam az egyes class =” class “nevű elemek névattribútumának értékét. Arra gondoltam, hogy erre hogyan lehet a legjobban, teljesítmény szerint.
Jelenleg a jQuery-t használom, és így csinálom:
$("#Button").click(function() { var myElements = $(".class"); for (var i=0;i<myElements.length;i++) { alert(myElements.eq(i).attr("name")); } });
Az Alert természetesen csak annak bemutatására szolgál, hogy mit csinál. A következő HTML-hez:
<input type="checkbox" class="class" name="1"> <input type="checkbox" class="nope" name="2"> <input type="checkbox" class="class" name="3">
Kiadná:
alert("1") alert("3")
Arra gondoltam, hogy a tiszta Javascript használata gyorsabb-e, vagy van-e más (jobb) módja ennek. Elnézést, ha ez a kérdés nem szerepel ezen a weboldalon hatókör, kérjük, helyezze át a Stackoverflow-ba, ha ez a helyzet.
Megjegyzések
- Kérjük, mindig cserélje le az értesítést a console.log-ra. Az Alert blokkolja a kódot végrehajtása, és arra kényszeríti, hogy az ok gombra kattintva vagy az Enter billentyűt annyiszor nyomja meg, aminek eredményeként megtalálható.
Válasz
Tiszta JS vs jQuery
A tiszta JavaScript lényegesen gyorsabb lesz, amint e jsPerf alapján láthatja, amely a document.getElementByClassName
vs jQuery választó. Itt a Chrome 25 eredményei:
-
$(".class")
– 4355 műveletek másodpercenként -
getElementsByClassName("class")
– 94636 műveletek másodpercenként
Mint láthatja, ehhez az egyszerű művelethez a jQuery opció körülbelül 22-szer lassabb, mint a pure-JavaScript megfelelője. A jQuery fejlesztési forrás áttekintésével könnyedén megtudhatja, miért van ez így, mivel a jQuery “választó funkció” olyan általános, hogy sok mindent meg kell tennie. megnézi, mi az a bemenet, mielőtt cselekedhetne rajta.
Tiszta JS megvalósítás
Kiléptem a jQuery click
eseményből mivel úgy tűnik, hogy már függ a jQuery-től, így nincs értelme megváltoztatni az események összekapcsolásának módját.
$("#Button").click(function() { var items = document.getElementsByClassName("class"); for (var i = 0; i < items.length; i++) alert(items[i].name); });
getElementsByClassName
Ne feledje, hogy a getElementsByClassName
-t is használtam. Nagyon fontos kiválasztani az ideális választót, ha érdekel a teljesítmény. Mivel minden elemnek fontos egy bizonyos osztálya, azonnal elvethetjük a többit, például a getElementsByTagName
és a querySelectorAll
elemeket, és választhatjuk az épített funkciót egy adott osztály elemeinek megtalálásához.
jQuery implementáció
Ez lenne az én jQuery-t használó megvalósításom, vegye figyelembe, hogy nem zavartam magam a jQuery objektum megszerzésével a (azaz. $(this)
), mert a sima JavaScript attribútum ebben az esetben sokkal könnyebb.
$("#Button").click(function() { $(".class").each(function() { alert(this.name); }); });
Megjegyzések
- Tökéletes. Bár szeretem a jQuery I-t kerülje el, amikor tiszta Javascript segítségével könnyen meg lehet csinálni. Valamilyen oknál fogva nem tudtam ' t korábban működésbe hozni, valószínűleg néma szintaxis hiba.
- Ugyanez. Beletelik egy kis időbe, mire körbejárja az összes JS-funkciót. Győződjön meg arról, hogy ' átnézi-e a böngésző hibáit a hibakeresés érdekében.
- Attól függően, hogy mit szeretne csinálni a
name
s-kel, használhatja a jQuery ' s.map()
tömb megszerzéséhez. - @RoToRa szerintem ugyanolyan hasznos lenne, mint a
$(".class").each( function() {//stuff});
ebben az esetben, de köszönöm!
Válasz
Ahelyett, hogy tárolná őket egy tömb, használhatja az $.each
függvényt a hurok áthidalásához. Így:
$("#Button").click(function() { $(".class").each( function() { alert( $(this).attr("name") ); } });
Válasz
Ehhez “tiszta” JavaScript, ilyesmit csinál, ha ES6 szintaxist használ:
var elements = document.getElementsByClassName("class"); elements.forEach(e => { alert(e.name) });
Minden olyan böngésző számára, amely nem támogatja az ES6-ot (beleértve az IE összes verzióját is):
var elements = document.getElementsByClassName("class"); elements.forEach(function(e) { alert(e.name); });
Ha IE8 támogatás szükséges:
var elements = document.querySelectorAll(".class"); for (var i = 0; i < elements.length; i++) { alert(elements[i].name); }
Ez valamivel gyorsabb lesz a jQuery használatához képest . A jQuery azonban továbbra is a legrövidebb kód lesz:
$(".class").each(e => { alert(e.name); });
Megjegyzések
- Köszönöm. Lehet, hogy 100+ elemmel foglalkozom, mivel ezt egy megjegyzés részben használjuk fel. ' Végzek néhány benchmark-ot mindkét kóddal, és visszajelzést adok, ha minden kész. Arra gondoltam, hogy lehetséges-e helyette használni a
document.getElementsByClassName()
és egy for ciklust. Megpróbáltam, de nem sikerült ' elérni.Ugyanezt használtam a hurokhoz és adocument.getElementsByClassName('class')[i].name
Válasz
A document.querySelectorAll
segítségével megkeresheti a kívánt elemeket:
var namedEls = document.querySelectorAll("input.class"); for (var i=0;i<namedEls.length;i+=1){ console.log(namedEls[i].name); } //=> 1, 3
Vagy egy vonalként a nevek lekéréséhez Array
:
var names = [].slice.call(document.querySelectorAll("input.class")) .map(function(el){return el.name}); //=> names is now [1,3]
megjegyzések
- miért
input[class="class"]
és neminput.class
? (Hacsak nem kifejezetten több osztályú elemeket szeretne kizárni.) - Nincs különösebb ok, ezért változtassa meg a választ. Nem változtatja meg az eredményeket '.
Válasz
parent.querySelectorAll([name="value"]);
Attól függően, hogy ismeri Dom-ját, szuper hatékony lehet; kiválaszthatja a szülőcsomópontot a kereséshez, vagy egyszerűen csak megy a dokumentumba, ha nincs konkrét Dom ismerete.
Ha egyedi elemeket vagy egyéni névteret használ, az nagyon hatékony lehet, és nem igényel könyvtár hozzáadását. Minden modern böngészőben működik.
A platform növekszik, és most elképesztő dolgokra képes.