Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jquery elementy z danym atrybutem
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
nospor
Hejka, jak przy pomocy jquery znaleźć komórki (td), które mają atrybut rowspan, niezależnie z jaką wartością.
pedro84
Kod
$('table').find('[rowspan]').each(function(index){
    $(this).text('znalazłem');
});


Zrobiłem Ci też demo wink.gif
nospor
Haha, a ja durny kombinowałem z podstawianiem tam różnych wartosci (* i tego typu podobnych smile.gif )
[name~="value"]
[name*="value"]
[name|="value"]
I takie tam z manuala smile.gif

Dzięki smile.gif
pedro84
Jak będziesz chciał podstawić sobie jakąś wartość, np. znaleźć wszystkie elementy o atrybucie o określonej wartości, to analogicznie"
Kod
$('table').find('[rowspan="2"]').each(function(index){
    $(this).text('znalazłem');
});
nospor
Nie no, to już wiem. Przecież mówie, że korzystałem z manuala smile.gif
Ino, że w manualu pokazywali jak znaleźć w zależnosci od wartosci, a nie pokazali jak znaleźć niezależnie od wartosci smile.gif
pedro84
Wolałem napisać, bo mi ostatnio jedna pierdoła w SF2 parę godzin zabrała wink.gif
kamil4u
Ja bym to zrobił trochę inaczej. Nie znam jQuery( znaczy znam, ale nie używam ), ale wydaje mi się, że mój sposób jest bardziej ekonomiczny smile.gif

Kod
$('td').each(function(index){
    if( $(this).get(0).hasAttribute( 'rowspan' ) )
        $(this).text('znalazłem');
});


W sumie pisząc tak jak ~pedro84 jQuery robi to samo co powyższe, ale na pewno przy okazji wykonuje masę niepotrzebnych operacji. np. wyrażenie regularne czy dwukrotne przejście pętlą po elementach( raz, żeby znaleźć dane elementy i drugi, żeby wykonać na nich operację, którą podasz w each ).
nospor
No nie wiem czy twój sposób jest ekonomiczniejszy. Lecisz po wszystkich td i sprawdzasz każdy pokolei czy ma atrybut. jQuery prawdopodobnie robi dokładnie tak samo.
kamil4u
Robi to samo, ale dwa razy. Raz musi przelecieć wszystkie elementy, żeby sprawdzić czy dany element ma ten atrybut. A drugi raz z Twojego polecenia, żeby wykonać jakąś operację na znalezionych elementach. Poza tym jQuery musi odpowiednio przygotować sobie dany element do wyszukiwania - np. wyrażeniem regularnym.

Kolejna wada to użycie find w table - przez to szukamy we wszystkich elementach(, a nie tylko w td ) - oczywiście to można szybko poprawić w kodzie, ale nie wiem czy byś się nad tym zastanawiał jak Ci działo.

Poza tym każda operacja wykonana w czystym JS jest szybsza, niż ta wykonana w jQuery( jQuery musi dużo rzeczy sprawdzić, zanim wykona żądaną operację ).

Operacje na DOM są zazwyczaj bardzo wolne. Sam kiedyś musiałem szukać oszczędności na każdym kroku, więc pewnie teraz mam takie "spaczenie" w szukaniu wszędzie optymalizacji smile.gif
pedro84
@kamil4u - prosty, banalny, łopatologiczny benchmark pokazuje praktycznie takie same rezultaty, z lekkim wskazaniem na funkcję pierwszą (przyznam, że jestem zaskoczony), aczkolwiek są to takie różnice, na które nie warto zwracać uwagi, a tym bardziej prowadzić dysput na forach, szkoda klawy wink.gif

Testowałem na 5 tysiącach wierszy w tabeli, HTML generowany przez PHP, nie JS.

Kod
var start = new Date().getTime();

/* operacja */

var end = new Date().getTime();
var time = end - start;
console.log('Execution time: ' + time);


Testowane lokalnie, jQuery 1.9.0 ładowane z dysku.
kamil4u
Mogłeś się pokusić o pokazanie całego testu wraz z kodem, który testowałeś i oczywiście dokładne wyniki.

Zapewne Twój testowany kod to:
Kod
<tr> <td></td> <td rowspan="2"></td> </tr>


Spróbuj dać w każdej komórce <td> jakieś inne elementy HTML + tekst + kilka tabel to mój przykład powinien "wygrać". Zdaję sobie sprawę, że nie będą to oszałamiające różnice.

Jak pisałem, mam pod tym względem pewną manię, bo jak kilka lat temu pisałem optymalizację operacji na DOM to udało mi się zejść z 4s do 2,5s. Teraz przeglądarki są dużo lepsze i różnice, rzeczywiście są niewielkie, ale szukanie optymalizacji zostało tongue.gif

Cytat
bardziej prowadzić dysput na forach

Tych nigdy nie za mało. Aczkolwiek moim zamiarem nie było mówienie, że Twój kod jest zły i wolny(, wcale tak nie uważam), a jedynie pokazanie:
- że nawet w tak prostym przykładzie da się zrobić coś lepiej
- można w prosty sposób mieszać jQuery z czystym JS - lubię to robić
- uważam, że mój kod jest czytelniejszy dla kogoś kto słabo zna jQuery - co akurat mi np. się przydaję. U mnie od razu widać co robi kawałek kodu, dzięki ".hasAttribute( 'rowspan' )"

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.