online: 3; azi: 1523; total: 51978 Webdesign - Javascript - 22

Obiectul image - 2


Aceasta lectie continua prezentarea modului de utilizare a obiectului image, cu exemple ajutatoare si un script complet.

1. Preincarcarea imaginilor

In lectia precedenta a fost explicat modul de incarcare a unei imagini noi in locul altei imagini folosind JavaScript.
In exemplul prezentat in Lectia 19 la punctul "Incarcarea unei imagini noi", browserul trebuie sa astepte afisare noi imagini pana cand aceasta este incarcata iar in cazul unor imagini mari asteptarea poate dura prea mult. Acest lucru poate fi evitat prin "preincarcarea imaginilor", toate imaginile folosite in pagina vor fi incarcate la deschiderea acesteia (printr-un script JS) si vor fi afisate doar atunci cand este executata o comanda de afisare.
Iata un exemplu prin care puteti intelege cum se face aceast lucru:

<script type="text/javascript">
<!--
var hiddenImg = new Image();
hiddenImg.src = "img2.jpg";
//-->
</script>
<img name="imagine" src="img1.jpg" width="155" height="155">
<form>
<input type="button" onclick="document.imagine.src=hiddenImg.src" value="Schimba imaginea">
</form>
- In interiorul scriptului, prima linie creaza un nou obiect "Image".
A doua linie defineste adresa imaginii noi care va fi incarcata si reprezentata prin obiectul "hiddenImg". Astfel imaginea "img2.jpg" este incarcata (dar nu afisata) cand este executata aceasta linie de cod (la deschiderea paginii). Imaginea este pastrata in memorie pentru folosire ulterioara, si anume cand este apasat butonul "Schimba imaginea", care prin codul "document.imagine.src=hiddenImg.src" va afisa imaginea "img2.jpg" in locul celei actuale (img1.jpg). Afisarea se face imediat, fara a mai astepta incarcarea acesteia.
Daca numarul si marimea imaginilor este mare va dura mai mult incarcarea initiala a paginii, de aceea e bine sa aveti in vedere viteza conexiunii pentru a sti ce metoda este mai indicata.
In pagina web exemplul acesta va afisa urmatorul rezultat:
Exemplu preincarcare imagini cu JS

2. Efecte mouse-over (sau rollover)

Cu mouse-over ("MouseOver" si "MouseOut") se pot crea efecte (precum schimbarea unei poze) care apar la simpla trecere cu mouse-ul deasupra unei zone.
Iata un exemplu foarte simplu:

<a href="#"
    onMouseOver="document.Imgs.src='img1.jpg'"
    onMouseOut="document.Imgs.src='img2.jpg'">
<img src="img3.jpg" name="Imgs" width="155" height="155" border="0"></a>
- Dupa cum observati, "onMouseOver" si "onMouseOut" au fost adaugate in interiorul etichetei <a>, e gresit daca le adaugati in eticheta <img>. Imaginile nu pot reactiona la evenimentele "MouseOver" si "MouseOut", trebuie sa punem o eticheta de legatura (link) langa imagini.
Acest exemplu va afisa in browser urmatorul rezultat:
Exemplu mouse-over imagini cu JS
- Initial este afisata imaginea "img3.jpg", cand pozitionati mouse-ul deasupra imaginii va fi afisata "img1.jpg" iar dupa ce departati mouse-ul, va apare imaginea "img2.jpg".
Daca doriti ca efectul de schimbare a imaginii sa apara cand pozitionati mouse-ul pe un link si nu pe imagine, puteti modifica exemplul astfel (<img> va fi adaugat in afara etichetei "<a>...</a>"):
<a href="#"
    onMouseOver="document.Imgs.src='img1.jpg'"
    onMouseOut="document.Imgs.src='img2.jpg'">Legatura</a><br>
<img src="img3.jpg" name="Imgs" width="155" height="155" border="0">
- Acest exemplu este mai mult de studiu pentru a intelege procedeul de utilizare a efectelor "mouse-over". Nu este potrivit pentru adaugarea intr-o pagina web profesionala deoarece cauzeaza unele probleme:
  • Imaginile "img1.jpg" si "img2.jpg" nu au fost preincarcate si astfel apar intarzieri in afisarea lor.
  • Daca vom folosi mai multe seturi de imagini trebuie scris codul JavaScripty pentru fiecare separat.
  • Pentru folosirea modelului si in alte pagini, poate necesita modificari substantiale.

Iata un script complet care evita problemele de mai sus, desi este mai lung, o data scris poate fi folosit cu usurinta si pt. alte pagini web si cu un numar mai mare de imagini.
<html>
<head>

<script type="text/javascript">
<!--
// Daca browserul suporta JavaScript
// Creaza matricea care va stoca imaginile, in variabila pics

  browserOK = true;
  var pics = new Array();
// -->
</script>

<script type="text/javascript">
<!--
  var objCount = 0;           // numarul imaginilor care se modifica in pagina web

// Functia pentru preancarcarea imaginilor, le introduce intr-o matrice
  function preload(name, first, second) {
  if (browserOK) {
    pics[objCount] = new Array(3);
    pics[objCount][0] = new Image();
    pics[objCount][0].src = first;
    pics[objCount][1] = new Image();
    pics[objCount][1].src = second;
    pics[objCount][2] = name;
    objCount++;
  }
}
function on(name) {
  if (browserOK) {
    for (i = 0; i < objCount; i++) {
      if (document.images[pics[i][2]] != null)
      if (name != pics[i][2]) {
        document.images[pics[i][2]].src = pics[i][0].src;
      } else {
      // afiseaza cea de-a doua imagine la pozitionarea cursorului deasupra acesteia
        document.images[pics[i][2]].src = pics[i][1].src;
      }
    }
  }
}
function off() {
  if (browserOK) {
    for (i = 0; i < objCount; i++) {
    // trimite in spate toate imaginile
      if (document.images[pics[i][2]] != null)
        document.images[pics[i][2]].src = pics[i][0].src;
    }
  }
}

// preancarca imaginile - trebuie sa specificati care imagini trebuie preancarcate
// si carui obiect Image apartin. Schimbati aceasta parte daca folositi imagini diferite sau daca adaugati mai multe
// (s-ar putea sa fie nevoie sa schimbati si in corpul documentului (body).
preload("link1", "img1.jpg", "img1t.jpg");
preload("link2", "img2.jpg", "img2t.jpg");
preload("link3", "img3.jpg", "img3t.jpg");
// -->
</script>
</head>
<body>
<a href="adresa1.htmll" onMouseOver="on('link1')" onMouseOut="off()">
  <img name="link1" src="link1.gif" width="100" height="100" border="0"></a> &nbsp;
<a href="adresa2.html" onMouseOver="on('link2')" onMouseOut="off()">
  <img name="link2" src="link2.gif" width="100" height="100" border="0"></a> &nbsp;
<a href="adresa2.html" onMouseOver="on('link3')" onMouseOut="off()">
  <img name="link3" src="link3.gif" width="100" height="100" border="0"></a>
</body>
</html>
Acest exemplu foloseste 3 imagini (respectiv 3 link-uri in BODY), dar puteti adauga si 100.
Scriptul pune toate imaginile intr-o matrice "pics" a carei elemente sunt construite de functia "preload()", care este apelata la inceput.
Apelul functiei "preload()" se face in felul urmator: "preload("link1", "img1.jpg", "img1t.jpg");", ceea ce inseamna ca scriptul trebuie sa incarce doua imagini "img1.jpg" si "img1t.jpg" pentru "link1". Prima imagine este imaginea care va fi afisata cand cursorul mouse-ului este în exteriorul imaginii. Iar atunci cand cursorul este pozitionat deasupra imaginii, va fi afisata cea de-a doua imagine. Cu primul argument "name" ("link1") al functiei "preload()" specificam carui obiect Image de pe pagina web apartin imaginile. In corpul ( <body> ) al exemplului veti gasi o imagine cu numele "link1".
Cele doua functii "on()" si "off()" sunt apelate prin evenimentele "onMouseOver" si "onMouseOut". Puteti observa ca functia "on()" trimite in spate toate celelalte imagini afisate initial (care sunt adaugate direct in eticheta <img>). Aceasta este necesar deoarece se poate intampla ca mai multe imagini sa fie afisate accentuat (de exemplu, evenimentul "MouseOut" nu are loc atunci cand utilizatorul muta cursorul de deasupra imaginii direct în afara ferestrei).
Incercati sa testati si sa studiati acest script, astfel veti intelegeti modul lui de functionare.