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...
Edit: to mój 100. (setny) post
Nie pomogę, ale kalendarz fajny.
Originally posted by pieknusi:
Gdyby ktoś znał rozwiązanie tego problemu, to prosiłbym o pomoc...
Ale jakiego problemu...? 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...?
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...
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ć...
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...
6. Reszta tabeli nie wypełniała się z powodu wspomnianego już problemu IE z append()... po zamianie na appendTo() wszystko gra i buczy i dzięki zastosowaniu łańcuchowania zrobiło się 3 razy krótsze... BTW, takich tworów nie tworzymy: t.children("tr:last-child").children("td:last-child").addClass("brak"); 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...
Teraz działa
Bardzo dziękuję za tak szczegółową pomoc 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 . Wezmę pod uwagę wszystkie twoje propozycje - przebuduję kod, by był jak najmniejszy, ale skuteczny 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 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) 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ę Pozdrawiam