Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Skrypt] Sorotwanie tabeli html
slash^
post 22.04.2016, 10:51:56
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

Ostrzeżenie: (0%)
-----


Proszę o podpowiedź co można zmienić w tym sortowaniu tabeli html aby je usprawnić:

https://jsfiddle.net/qlash/wk2zbepz/


--------------------
d(^^)b
Go to the top of the page
+Quote Post
Beniooo
post 22.04.2016, 20:59:30
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 26
Dołączył: 26.01.2012
Skąd: Ci to przyszło do głowy?

Ostrzeżenie: (0%)
-----


Na pewno zmień kursor przy najechaniu na nagłówek tabeli, no i aby nie zaznaczało tekstu przy podwójnym kliknięciu


--------------------
Mój post rozwiązał Twój problem? Naciśnij co Ci szkodzi? ;-)
Go to the top of the page
+Quote Post
SHiP
post 25.04.2016, 09:29:10
Post #3





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Ogólnie spoko, ale kilka uwag, tak na szybko:

1. "use strict"
2. Wszystkie var na początek funkcji. To tam powinna się odbywać deklaracja zmiennych aby uniknąć problemów w skrajnych przypadkach.
3. Skoro przekazujesz w parametrze obiekt jQuery to nie do końca wiem po co wszędzie $(table) nie lepiej nazwać parametr $table i wszędzie używać $table zamiast $(table) ?
4. Zamiast wrzucać do struktury DOM nowe elementy zawsze lepiej jest dodać/usunąć klasę i ewentualnie te elementy ugrać za pomocą :before/:after. W Twoim wypadku klasa w zupełności wystarczy :-). [dotyczy strzałek w nagłówkach]
5. Szczególnie w pętlach warto taki kod:

$(v).find('td:eq('+col+')').html();

Zamienić na:

// przed pętlą:
$cells = $(v).find('td');

// i w pętli jedynie:
$cells.eq(col).html();

Ten post edytował SHiP 25.04.2016, 09:33:10


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Comandeer
post 25.04.2016, 16:41:38
Post #4





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


a11y i UX:
Klikalne nagłówki powinny albo mieć w sobie przyciski, albo zachowywać się jak przyciski → https://www.paciellogroup.com/blog/2016/04/...ment-semantics/ – dzięki temu całą tabelkę będzie dało się obsłużyć przy pomocy klawiatury, co jest podstawowym wymogiem dostępności
Kod:
Powinieneś to zamknąć w kodzie plugina jQuery.

Kod
$(this).parent().parent().parent()

jQuery ma $.fn.parents, które pozwala uniknąć takich potworów w kodzie. Co więcej: dobrze zrobione event delegation też ten problem rozwiązuje – wystarczy przypiąć kliki na tabelę i sprawdzać, czy przypadkiem nie klikamy w th.sortable.

Cache'uj zapytania do DOM, bo one są jednak kosztowne.

Zamiast bawić się w dostawianie ikonki i jej usuwanie, rozważylbym zmienianie stanu elementu (czyli $.fn.toggleClass).


--------------------
Go to the top of the page
+Quote Post
slash^
post 26.04.2016, 09:01:00
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

Ostrzeżenie: (0%)
-----


Dzięki za podpowiedzi. Mam kilka pytań:

@SHiP
Ad 3: Rozumiem, że jquery ma jakiś mechanizm, że jak w nazwe funkcji dałem zamiast table $table to faktycznie mogę tak używać (zamisat $(table)) ?
Ad 5: Przed pętlą nie mam wartości $(v) ... Możesz podać przykład jakby to miało działać?

@Comandeer
Dzięki za sugestię z parents, w ten sposób rozumiem, że jest już ok:
$(this).parent().parent().parent() ---> $(this).parents().find('table')

Co do dostawiania/zmiany ikonki, dzięki takiej opcji jak teraz pominąłem wymóg wstawiania do tabeli tej ikonki "od razu" w templatce html.
Plugin jquery, tak próbowałem ale jeszcze nie do końca ogarniam, Czy jest możliwość aby raz na początku skryptu "uruchomić" plugin tak aby działał do później dodanych elementów na stronie, czy po update html trzeba jeszce raz wywołać $el.plugin() ?


--------------------
d(^^)b
Go to the top of the page
+Quote Post
Comandeer
post 26.04.2016, 17:48:17
Post #6





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Raczej
Kod
$( this ).parents( 'table' )


Co do plugina: jeśli zrobisz event delegation, np.
Kod
$( 'body' ).on( 'click', selektorPodanyDoPluginu

to powinno działać.


--------------------
Go to the top of the page
+Quote Post
SHiP
post 27.04.2016, 09:09:16
Post #7





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


1. Mój błąd. Rzeczywiście v nie ma przed pętlą. :-). Co więcej masz obj który robi to o czym pisałem. Jest ok.
2. To jest tylko konwencja nazewnicza używana w niektórych kręgach jQuerowców :-). Dzięki $ na początku nazwy zmiennej wiadomo od razu, że to obiekt jQuery i możemy wykonywać na nim wszystkie operacje typowe dla jQuery. A zmienną się wprowadza po to aby ograniczyć użycie $() bo to bardzo czasochłonna funkcja.

Zamiast
  1. $('.counter').cos();
  2. $('.counter').cos2();
  3. $('.counter').cos3();

bardzo często można spotkać:
  1. $counter = $('.counter');

i potem:
  1. $counter.cos();
  2. $counter.cos2();
  3. $counter.cos3();

Jeżeli później w kodzie ktoś zobaczy $counter to nie zastanawia się czy to integer, jakiś iterator, czy coś innego, bo widać od razu, że to obiekt jQuery. U Ciebie jest zastosowana inna sztuczka tj. za każdym razem używasz funkcji $(), ale jest to rozwiązanie moim zdaniem nieeleganckie.
  1. var column = $(table).find('thead th:eq(' +col+ ')');
  2. var sortBy = $(column).attr('data-sort') || 'length';

można byłoby wymienić na:
  1. var column = $(table).find('thead th:eq(' +col+ ')');
  2. var sortBy = column.attr('data-sort') || 'length';

lub wg. konwencji nazewniczej, o której piszę:
  1. var $column = $(table).find('thead th:eq(' +col+ ')');
  2. var sortBy = $column.attr('data-sort') || 'length';


Ten post edytował SHiP 27.04.2016, 09:11:20


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Pyton_000
post 27.04.2016, 10:11:26
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Lub zamiast:
Kod
$('.counter').cos();
$('.counter').cos2();
$('.counter').cos3();

tak
Kod
$('.counter')
        .cos()
        .cos2()
        .cos3();
Go to the top of the page
+Quote Post
slash^
post 29.04.2016, 09:11:36
Post #9





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedzi.

@Comandeer
Metodę z on() znam, dzięki. Chodzi mi o jakąś metodę której mogłbym uzyć raz np, na początku, któraby wykrywała dodanie elementu z odpowiednim znacznikiem i wywoływała odpowiedni event/metodę.


--------------------
d(^^)b
Go to the top of the page
+Quote Post
Comandeer
post 29.04.2016, 14:40:58
Post #10





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Mutation Observers? Hack z animationstarthttps://davidwalsh.name/detect-node-insertion ?


--------------------
Go to the top of the page
+Quote Post
LowiczakPL
post 6.05.2016, 14:36:33
Post #11





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


Aby usprawnić kod to

parenty dałbym w funkcji sortTable aby został taki kod wywołania,

sortTable( $(this), 'thead th');

dopiero w sortable parentujesz aż znajdziesz szczyt tabeli ale nie na sztywno a rekurencyjnie

bo co w przypadku kiedy ktoś nie da <thead> albo sortowanie będzie wywoływane nie na nagłówku a po kliknięciu w zawartego w nim DIVa.

Dzięki temu funkcja staje się bardziej uniwersalna.



--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 03:50