Opera przestaje wykonywać skrypt po załadowaniu strony

w dziale Strony WWW w Operze
Azrael Valedhel napisał(a):

css:

.showoffOpera {
 z-index: 15000;
 display: block;
 border-style: inset;
 border-color: #d29865;
 border: 0px;
 text-align: center;
 visibility: hidden;
 position: absolute;
 width: 0px;
 height: 0px;
 left: -510px;
 top: -267px;
 background-color: #220000;
 padding: 10px;
 padding-top:15px;
 font: normal verdana,sans-serif;
}


js:
function Show(T,t){
   T.title='';

      T.parentNode.lastChild.style.visibility=t?'visible':'hidden';
      T.parentNode.lastChild.style.height=t?'auto':'0px';
      T.parentNode.lastChild.style.width=t?'140px':'0px';
      T.parentNode.lastChild.style.border=t?'1px':'0px'; 
}


html:
<span style='position:relative;'><a href="view.php?view=1656" onmouseover='Show(this,1); return false;' onmouseout='Show(this,0); return false;' style='position:relative; '>Imie</a> <span style="color:#B0B0B0;font-size:9px;">(1111)</span>
<div class='showoffOpera'><img src="avatar.jpg" style="width:100px" title="" alt=""/>

<b style="padding-top: 10px;">Imie </b>

Dana, Dana.


Dana.</div></span> 
<- CODE interpretuje
miast je wyświetlić... Czy to nie dziwne? Hm, w ogóle br jest interpretowane... No dobra ;P

Chodzi o to, że jest to seria linków, na które najeżdżając "pojawiamy" obok nich diva z paroma danymi. Pod FF zrobiłem to najprościej jak się dało - przez display:none i podmieniając go na display:block przy onmouseover. Jednak Opera nie chciała współpracować z display:none i nie ładowała grafiki dopóki się nie najechało na link - ale wtedy i tak nic się nie pojawiało. No więc dla Opery zrobiłem osobny kod - który tak czy tak nie działa. Albo inaczej - działa mniej więcej zadowalająco - dopóki Opera ładuje stronę, kiedy przestaje ładować, nagle obsługa skryptu umiera.

Być może błąd leży po mojej stronie, nie przeczę... Jeśli tak, prosiłbym, aby ktoś kompetentny przynajmniej wyjaśnił mi dlaczego to nie działa na Operze (możliwe, że to inne przeglądarki interpretują niepoprawny kod... tak czy tak FF, IE, Safari - pod nimi kod z display:none działa bez zarzutu...), a gdyby jeszcze rzekł słówko jak to zrobić, aby zadziałało... Byłbym wdzięczny wink

Pozdrawiam

daroc napisał(a):

Myślę, że dużo łatwiej by się cokolwiek testowało, gdybyś podał po prostu adres do strony testowej albo wrzucił css, js i html do jednego pliku - aby można było łatwo zapisać i od razu rozpocząć testowanie.

U mnie zdaje się jak najbardziej działać.
Jedyne co przeszkadzało mi w zauważeniu efektu najechania na link to to...

 left: -510px;
 top: -267px;

Azrael Valedhel napisał(a):

Problem w tym, że to wszystko jest na grze, aby się dostać to tego efektu trzeba by się rejestrować... Hm, tak czy siak, konto testowe miałem zrobić, więc mogę je równie dobrze zrobić dzisiaj wink
konto@testowe:Test32
to login do

www.cyrodiil.iq.pl


Spójrz i oceń. uwaga - tam jest to ździebko inaczej z uwagi na rozdzielenie działającego kodu na display:none dla FF i reszty, od kodu dla Opery.

daroc napisał(a):

Bardzo trudno połapać się w tym kodzie. Szczególnie że zawiera mnóstwo błędów, np. zamknięcia divów, które nie są otwarte. Nie mogę znaleźć nawet elementu, do którego odnosi się parentNode.lastChild. Nie jestem w stanie pomóc pracując na tak dużym kodzie. Musisz wyodrębnić konkretną rzecz, która w Operze nie działa.
Wydaje mnie się, że jest to prosta funkcja, która powinna działać tak samo we wszystkich przeglądarkach, dlatego już na starcie niepotrzebnie wprowadzasz zamieszanie tworząc odrębne fragmenty strony dla poszczególnych przeglądarek. Jeśli znajdziesz metodę w JS, która w jakiejś przeglądarce nawet działa inaczej, to wykrywanie i stosowanie innej metody stosuj tylko w tym jednym miejscu, zamiast tworzyć cały segment dla innych przeglądarek.
Widzę jedynie, że po najechaniu jednak coś się dzieje - bo pojawia się poziomy pasek przewijania, który przy ruszaniu nad linkiem zmienia swoją długość.


Edit: Aha, teraz dostrzegłem funkcję, która wyświetla rozpoczęcia odpowiednich divów.

Update: Alternatywne rozwiązanie problemu, które może się okazać dużo prostsze do zrealizowania.
Skoro tak naprawdę problem zaczął się od tego, że Opera nie ładuje obrazków w elementach z display:none, to polecam po prostu użyć JavaScript do preloadowania (wcześniejszego ładowania) tych obrazków.
Coś podobnego do tego:

obrazki=new Array();
prefetch=new Array();
obrazki[0]='avatar1.jpg';
obrazki[1]='avatar2.gif';
for (i=0; i<obrazki.length; i++) {
prefetch[i]=new Image();
prefetch[i].src=obrazki[i];
}

daroc napisał(a):

Originally posted by Azrael Valedhel:

teraz tylko jak użyć tej grafiki?


Na wszelki wypadek podpowiem - robisz zwyczajnie <img src="obrazek.jpg">
JavaScript powoduje, że Opera (i chyba każda popularna przeglądarka) po prostu pobiera obrazek i zapisuje go w cache. Wtedy jak przychodzi do wyświetlania obrazka jako zwykły img, to przeglądarka bierze ten plik z cache, a nie pobiera z Internetu.

Azrael Valedhel napisał(a):

To wszystko nie jest takie proste wink Walidator kodu nie połapie się w generowanych przez js częściach - wszystkie divy są na pewno domknięte - sprawdzałem nie raz, wierz mi na słowo wink (Otwarte też są^^)
Na dobrą sprawę nie tyle o to chodzi, bo jak mówiłem (przynajmniej ciągle jest tak u mnie na O 9.24) divy pokazują się z załadowanymi obrazkami i informacjami po najechaniu na linki DO MOMENTU zakończenia ładowania strony przez przeglądarkę. Po tym punkcie obsługa wydarzeń jakby nagle zniknęła. I to mnie trapi, właśnie to... A to że jest małych błędów (aczkolwiek nie przeszkadzających w obejrzeniu strony) w cholerę w składni (co zresztą będę chyba poprawiał, choć mam dużo ważniejsze rzeczy do zrobienia) to wiem - jednak nie to jest w tej chwili priorytetem.

edit:
Hmm... To ma chyba jakiś sens, wypróbuję wink

edit2:
Orłem z JS nie jestem... <div class='showoffOpera'> to będzie lastChild a parentem w takim razie będzie obejmujący diva span.
o ten: <span style='position:relative;'><a hr...

Wybacz, mogłem to uściślić na początku, tyle już siedzę nad tym kawałkiem kodu, że pewne rzeczy wydawały mi się oczywiste, i że dla kogoś kto w temacie nie od wczoraj siedzi - na pierwszy rzut oka będą takie. Ale wiem jak to jest patrzeć na cudzy kod - czasami ciężko się w nim dopatrzeć "własnej" logiki ^^

jeszcze jeden edit wink
Głupio spytam, ale jak powiedziałem, do orła mi daleko... Rozumiem całość niemal, w prefetch[] będą preloadowane grafiki... teraz tylko jak użyć tej grafiki? document.getElementById('img1').style.backgroundImage = prefetch[1]; ? Coś w ten deseń?^^"
Nevermind... wink Jak się za długo kawy nie pije, to się nie myśli, tylko szuka się info o rzeczach, które się teoretycznie wie x]
A błędy z noscriptem... no cóż, zależy mi, by gra była w miarę przyjazna, a przynajmniej działająca pod Lynx i innymi przeglądarkach tekstowych...

edit kolejny:
zaczynam się zastanawiać, czy nie popełniłem błędu interpretacji działania przeglądarki. Może to nie ona przestaje działać, tylko z-index w pewnym momencie się knoci i "popup" zamiast wyświetlać się nad - wyświetla się pod elementami strony?

Azrael Valedhel napisał(a):

Wiem, wiem, chwilowe (bosz...) zaćmienie. Naprawdę za mało śpię i za dużo kawy piję (a dziś jak na złość znów się skończyła! to spisek przeciwko kofeinomanom...) Zacząłem już wymyślać nowe teorie na temat keszowania kiedy nie dalej jak tydzień temu tłumaczyłem coś bardzo podobnego znajomemu... Ech, człowiek ma naprawdę sklerozę na stare lata.

Co myślicie o tym z-index? Nic nie zmieniałem i intensywnie na różne sposoby klikałem sobie na linki... I zauważyłem, że kiedy na linku kliknąć, przytrzymać i przeciągnąć - to div się pojawia! Ale znika kiedy link puścić (zadziałało opuźnione onmouseout zapewne) - tylko teraz - czemu to się tak dzieje dziko?^^ (mnie nigdy nie wystarczyły rozwiązania, zawsze chcę wiedzieć "dlaczego" i czemu właśnie tak a nie inaczej, taka mała przypadłość ^^)

edit: Tobie tez się wydaje, ze edytowanie kilkanaście razy tego samego postu jest oznaką, że najwyższa pora w tym tygodniu pójść już spać? Hmm... Nieee... Twardym trzeba być. A wyśpię się po śmierci ;]

"chyba każda popularna" - choć co do IE miałbym wątpliwości. Jakieś pomysły co do odkrycia? Ciekawi mnie to, jak to jest, że nie ma - a jest ;]

daroc napisał(a):

A możesz wyjaśnić, dlaczego tam jest ujemna pozycja elementu? Po zmianie na left i top na 0 i wywaleniu wszystkich z-index pojawia się jakiś fragment okienka...
Z-index chyba nie jest tutaj potrzebne. Spróbuj przemyśleć jeszcze raz zagnieżdżenie wszystkich elementów.

Azrael Valedhel napisał(a):

Dla FF i reszty to jest left: -200px; top: 0px; - ale Opera (kiedy ustawiłem visibility:visible na wstępie) tak daleko w dolny prawy róg wywaliła tego diva, że musiałem go mocno przesunąć w minusy, żeby był widoczny tam gdzie być powinien...

Myślę, myślę^^ Wywaliłem index-z - póki co żadnej różnicy - a tego fragmentu nie za bardzo widzę^^"

edit: wziąłem pod uwagę moją rozdziałkę (16x12) i zmniejszyłem okno przeglądarki - rzeczywiście, w okolicach 1024 można zobaczyć diva kawałek... I jest on wyświetlany pod innymi elementami. Czyli trzeba jednak użyć z-index, aby wymusić, dobrze mówię? Gdybym dobrze mówił, to by to zadziałało - a nie działa...

edit2:
No dobra, na teraz kaniac... Trzeba oczy zmrużyć. Może tak jak Mendelejewowi przyśni mi się wszystko co potrzebne i wstanę z gotowym kodem czekającym na koniuszkach palców momentu przelania go na cyfrową postać za pomocą klawiatury... Lecz wątpię ;]

Ach, zapomniał bym - pięknie dziękuję za zainteresowanie i pomoc smile Choć problem ciągle czeka na rozwiązanie... A nie chciałbym (choć niewielu ich jest - to jednak) użytkowników gry na Operze - dyskryminować i serwować grę mniej przyjemną... Choć hołdując zasadzie "jeśli coś dajesz, daj też wybór" - ten cały bajer można w ogóle wyłączyć wink Szczególnie przydatne to na O. gdzie póki co nie działa za bardzo ^^
No nic, rozgadałem się jak zwykle... Dobranoc smile

daroc napisał(a):

Originally posted by Azrael Valedhel:

Czyli trzeba jednak użyć z-index, aby wymusić, dobrze mówię?


Jeśli tylko ten pojawiający się i znikający element ma właściwość position:relative/absolute i top oraz left, to powinien znajdować się na wierzchu (wg moich krótkich testów). Chyba że za dużo już się bawiłeś pozycjonowaniem. Wtedy musisz zacząć mieszać tym z-index...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Probonuję używać deklaracji strict - często pozwala zaoszczędzić sobie wiele nerwów związanych z różnym zachowywaniem się elementów w różnych przeglądarkach.


Originally posted by Azrael Valedhel:

Dla FF i reszty to jest left: -200px; top: 0px; - ale Opera


A to akurat jest bardzo dziwne... Atrybuty left i top powinny w każdej przeglądarce działać tak samo. Chyba że element zamiast position:absolute ma position:relative i jest źle zagnieżdżony.

Edit:
Jeszcze jedna rzecz... Zauważyłem, że jeśli jeden element ma position:relative, a drugi nie ma jej podanej, to ten pierwszy może wyskakiwać na wierzch mimo podania dowolnych z-index dla obu elementów (które teoretycznie powinny powodować, że ten drugi będzie na wierzchu).

Azrael Valedhel napisał(a):

Też to zauważyłem, dałem wreszcie spokój próbom i wziąłem na warsztat bibliotekę overlib, zdała egzamin. Jednak z pluginem "Anchor" jest już różnie i co zabawne, to tym razem w Firefox'ie div jest baaardzo przesuwany w lewo, a w Operze działa to tak jak powinno wink (z jedną tylko wadą, ale to już wina overlib - nie przeglądarki)

W każdym razie dzięki wielkie za pomoc, temat jak najbardziej do zamknięcia.
Pozdrawiam smile