Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Rozw.][javascript] nietypowy rollover działa zbyt wolno
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
wujek_bogdan
Nie moge użyć typowego rollover, tzn podmiany obrazków, ani też podmiany background-image, ponieważ przyciski mam w png z przezroczystością, a żeby działało to w IE6 muszę stosować pngfix. pngfix działa tylko wtedy, gdy obrazki załaduje w HTML. Zamiast użyć klasycznego rollover stosuję zmianę atrybutu display: (none/block). Wszystko fajnie działa, ale gdy przejadę kursorem nad przyciskiem zbyt szybko, obrazek zmienia się, ale nie wraca do poprzedniego. Tak jakby przeglądarka nie zdążyła zareagować na zdarzenie onmouseout.

  1. window.onload = Rollover;
  2.  
  3. function Rollover() {
  4. var buttons = document.getElementById('menu');
  5. var links = buttons.getElementsByTagName('div');
  6. for (i=0; i<links.length; i++) {
  7.  
  8. if (links[i].getAttribute('alt') == "1") {
  9. links[i].onmouseover = roll;
  10. }
  11.  
  12. if (links[i].getAttribute('alt') == "0") {
  13. links[i].onmouseout = rollout;
  14. }
  15. }
  16. }
  17.  
  18. function roll() {
  19. var nextDiv = this.nextSibling;
  20.  
  21. while(nextDiv.nodeType != 1){
  22. nextDiv = nextDiv.nextSibling;
  23. }
  24. this.style.display = "none";
  25. nextDiv.style.display = "block";
  26. }
  27.  
  28. function rollout() {
  29. var previousDiv = this.previousSibling;
  30.  
  31. while(previousDiv.nodeType != 1){
  32. previousDiv = previousDiv.previousSibling;
  33. }
  34. this.style.display = "none";
  35. previousDiv.style.display = "block";
  36. }


  1. <div id="menu">
  2. <img class="slice" src="slices/menu_1.png" alt="menu_1.png">
  3. <img class="slice" src="slices/menu_2.png" alt="menu_2.png">
  4. <div class="button" style="background-image:url('slices/menu_3.png'); display:block;" alt="1"><a href="">Button1</a></div>
  5. <div class="button_r" style="background-image:url('slices/menu_3a.png'); display:none;" alt="0"><a href="">Button1</a></div>
  6. <div class="button" style="background-image:url('slices/menu_4.png'); display:block;" alt="1"><a href="">Button2</a></div>
  7. <div class="button_r" style="background-image:url('slices/menu_4a.png'); display:none;" alt="0"><a href="">Button2</a></div>
  8. <div class="button" style="background-image:url('slices/menu_5.png'); display:block;" alt="1"><a href="">Button3</a></div>
  9. <div class="button_r" style="background-image:url('slices/menu_5a.png'); display:none;" alt="0"><a href="">Button3</a></div>
  10. <div class="button" style="background-image:url('slices/menu_6.png'); display:block;" alt="1"> <a href="">Button4</a></div>
  11. <div class="button_r" style="background-image:url('slices/menu_6a.png'); display:none;" alt="0"><a href="">Button4</a></div>
  12. <div class="button" style="background-image:url('slices/menu_7.png'); display:block; width:162px;" alt="1"><a href="">Button5</a></div>
  13. <div class="button_r" style="background-image:url('slices/menu_7a.png'); display:none; width:162px;" alt="0"><a href="">Button5</a></div>
  14. <div class="button" style="background-image:url('slices/menu_8.png'); display:block; width:162px;" alt="1"><a href="">Button6</a></div>
  15. <div class="button_r" style="background-image:url('slices/menu_8a.png'); display:none;; width:162px;" alt="0"><a href="">Button6</a></div>
  16. <img class="slice" src="slices/menu_9.png" alt="menu_9.png">
  17. </div>


jako przykład podaję fragment strony.

//edit:
Problem rozwiązany na około: za pomocą CSS i pseudoklasy :hover. Jednak mimo wszystko zastanawia mnie czemu powyższe rozwiązanie się nie sprawdza.
mathijas
Jak byś zajrzał do wnętrza biblioteki iepngfix, to na samym dole masz skrypt wywołujący update obrazków podczas załadowania strony - konkretnie funkcja IEPNGFix.update. Na jej podstawie łatwo można stworzyć podobną funkcję, aktualizującą (inicjującą) jeden, konkretny obrazek.

Drugie rozwiązanie oferuje jQuery. Wystarczyłoby użyć wydarzeń "onmouseenter" oraz "onmouseleave" aby osiągnąć zamierzony efekt. Polecam to rozwiązanie.

Co do samego pytania o powód nie działania - mam niejasne wrażenie, że chodzi o użycie "onmouseover" oraz "onmouseout". Wydarzenia te następują nie tylko w momencie pojawienia się myszki na danym obszarze, ale także przy okazji przejścia z jednego elementu do innego w obrębie tego obszaru. Załóżmy, że mamy taką konstrukcję:

<div><p></p><span></span></div>

"Onmouseover" DIVa odpali się zarówno na wejściu do DIVa, jak i na przejściach pomiędzy DIVem i paragrafem, oraz między paragrafem i SPANem. "Onmouseout" za to odpali się dopiero po wyjściu z DIVa. Twoje hiperłącze wewnątrz buttonu może powodować taki efekt.

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.