Problem z działaniem js na IE

w dziale Po godzinach
pieknusi napisał(a):

Witam, wiem, że to nie jest forum o IE tylko Operze, ale chciałbym prosić o pomoc...
Mianowicie, pracuję w wolnym czasie nad stronką (PHP + MySQL + HTML + CSS + JS) i napotykam pewne problemy, które jedna kdaję radę rozwiązać, ale tego który przedstawię nie potrafię. Sprawa dotyczy generowania tabelki w JavaScript (przy pomocy biblioteki jQuery) z kalendarzem pod IE (testowałem pod IE8 i testową 9)... (Miałem także problem pod Firefoksem, gdzie z powodu zwracania przez FF błędnej wartości niektóre pętle nie mogły się zakończyć, ale sobie poradziłem dzięki Firebugowi) Nie będę wklejał tu, żadnych kodów - podam link do działającej strony(a raczej jej części, czyli samego kalendarza): http://files.myopera.com/pieknusi/kalendarz/kalendarz.html
Gdyby ktoś znał rozwiązanie tego problemu, to prosiłbym o pomoc... smile

Edit: to mój 100. (setny) post jester

Ryszard napisał(a):

Nie pomogę, ale kalendarz fajny.

nowotny napisał(a):

Originally posted by pieknusi:

Gdyby ktoś znał rozwiązanie tego problemu, to prosiłbym o pomoc...


Ale jakiego problemu...? smile Ja tu widzę multum różnic w wyglądzie i bugów w działaniu na IE więc o który ci konkretnie chodzi...? smile

pieknusi napisał(a):

Wiem, różnic jest bardzo dużo - niektóre poprawiłem stylami CSS...
W "normalnych przeglądarkach" gdy przełączę miesiące to dzieje się to "normalnie". W IE za to niby tworzy się tabela kalendarza, ale jej pola nie wypełniają się zawartością. Linki do zmiany miesięcy nie zmieniają swojej wartości . Podobnie w IE nie tworzy się przycisk "Zwiń/Rozwiń". W sumie to tylko o to mi chodzi, ale znając życie pewnie chodzi tylko o jedną rzecz, która powoduje te wszystkie błędy...

nowotny napisał(a):

Witam... przyjrzałem się twojemu skryptowi i mam parę uwag... ale najpierw załączam poprawiony przeze mnie sam skrypt: kalendarz.js

1. Zamiast metody append() polecam raczej używanie appendTo()... zwraca ono nowo utworzony element i nie trzeba się gimnastykować żeby go potem znaleźć w celu ostylowania lub edytowania atrybutów... Zauważysz że wszystkie twoje appendy zamieniłem na appendTo... to powoduje że możemy też łatwo skorzystać z łańcuchowania metod co znacznie skraca kod i zmniejsza jego komplikacje...
To między innymi było powodem niedodawania się spana "zwiń/rozwiń"... trudno powiedzieć z czym IE tam miał problem ale po zamianie zaczęło działać... smile

2. Jeśli przypisujesz obiekt jQuery do zmiennej (np. var zm = $('h2');) to potem najlepiej jest się do niego odwoływać również za pomocą składni jQuery (np. $(zm).attr('title');)... nie jest to aż tak absolutnie konieczne ale możesz przez to uniknąć pomieszania obiektów kiedy na niejQuerowym obiekcie będziesz chciał przez pomyłkę zastosować jQuerową metodę...

3. Masz tam strasznie gołego HTMLa... na twoim miejscu poddawałbym trochę atrybutów ID... Wtedy niepotrzebne byłoby aż tak intensywne trawersowanie drzewa DOM w stylu: $(this).parent("h2").next("div");... BTW, przy tak niewielkim skomplikowaniu HTMLa można by pominąć dodatkowe filtrowanie znalezionych elementów (.parent() zamiast .parent("h2"))...

4. Jeśli chodzi o sposób w jaki pobierasz i ustawiasz miesiąc i rok w adresie linku przy kliknięciu na "<" i ">"... na twoim miejscu darowałbym sobie ciachanie hrefa substringiem i tą informacje (rok i miesiąc) najpierw umieściłbym w jakimś atrybucie (ID, name, etc. lub po prostu wypluł odpowiedniego javaskrypta PeHaPem) a z poziomu javaskryptu przechowywałbym ją w samym obiekcie za pomocą metody data();... Korzystanie z samego adresu może się po prostu okazać zawodne...

5. Nigdy, ale to przenigdy nie robimy czegoś takiego: if ($(this).text() == " < ")... właśnie ten warunek w IE nigdy nie był spełniony/niespełniony więc dlatego nie zmieniały ci się miesiące... tutaj również należałoby użyć atrybutu elementu (tak jak ja to zrobiłem; musisz ustawić dla linków zmieniających miesiąc atrybuty: id="le" dla linku do poprzedniego miesiąca i id="pr" dla linku do następnego miesiąca żeby mój poprawiony skrypt ci zadziałał) w celu poprawnej identyfikacji czy został kliknięty link odpowiadający za poprzedni/następny miesiąc... BTW, te dwa warunki można odchudzić... niepotrzebnie wykonujesz 2 razy takie same operacje dla dwóch różnych zmiennych lecz przechowujących takie same informacje... jak - to już pozostawiam tobie... wink

6. Reszta tabeli nie wypełniała się z powodu wspomnianego już problemu IE z append()... po zamianie na appendTo() wszystko gra i buczy wink i dzięki zastosowaniu łańcuchowania zrobiło się 3 razy krótsze... smile BTW, takich tworów nie tworzymy: t.children("tr:last-child").children("td:last-child").addClass("brak"); wink niepotrzebne to i ciężko się potem rozeznać o co chodzi... jeśli przeanalizujesz mój poprawiony kod zobaczysz że załatwiłem to jedną zmienną z obiektem wiersza i wszystko gra...

OT: jeśli chodzi o CSS, na przyszłość polecam konsolidowanie takich samych selektorów i w miarę ich chronologiczne uporządkowanie w pliku... znacznie łatwiej się to potem przegląda i edytuje...

pieknusi napisał(a):

Teraz działa smile
Bardzo dziękuję za tak szczegółową pomoc smile Twoje rady są dla mnie bardzo cenne - nie miałem pojęcia o metodzie "appendTo()", a teraz jQuery wydaje mi się jeszcze łatwiejsze, mimo że mam z nim do czynienia od dwóch tygodni smile . Wezmę pod uwagę wszystkie twoje propozycje - przebuduję kod, by był jak najmniejszy, ale skuteczny smile W sumie to gdyby nie problemy z IE to nie dostał bym tylu cennych rad:) A mój HTML jest taki "goły", bo to tylko kalendarz - jeden z wielu elementów na stronie, a ja mam problemy z wymyśleniem odpowiednich i krótkich nazw dla identyfikatorów wink No i te style CSS są takie pomieszane troszkę, bo złożyłem je z kilku innych plików - w tym fixy dla IE (szczególnie jeśli chodzi o RGBA) smile Jeszcze raz dziękuję i biorę się za poprawki, a jak skończę, to opublikuje na blogu cały kod tej mojej twórczości - aż boję się, jak ktoś zobaczy mój kod PHP - sam już się w nim gubię smile Pozdrawiam smile