setTimeout() poate fi utilizat pentru a apela o functie dupa un anumit timp, si pentru a executa o functie de mai multe ori (daca e adaugat in ea). Dar setTimeout() foloseste domeniul global in javascript, ceea ce poate fi o problema cand e adaugat in
functii dintr-o clasa, deoarece nu poate fi utilizat alaturi de cuvantul special
this.
De exemplu, in codul urmator, setTimeout() nu produce efectul pe care-l vrem.
<div id="swprop"></div>
<script type="text/javascript">
// se defineste o functie clasa
var numeClasa = function() {
// se defineste o proprietate si o metoda publica
var prop = 0;
this.method = function() {
document.getElementById('swprop').innerHTML = prop; // adauga valoarea lui prop in #swprop
// adauga o unitate la prop la fiecare apelare, si auto-apeleaza functia la fiecare 0.5 sec., pana prop e mai mic de 5
prop++;
if(prop < 5) setTimeout('this.method()', 500);
}
}
// se creaza un obiect la clasa numeClasa, si apeleaza method()
var objTest = new numeClasa();
objTest.method();
</script>
Daca testati codul de mai sus in navigatorul Chrome, in JavaScript Console va apare aceasta eroare:
TypeError: Object [object Window] has no method 'method'
Ceea ce inseamna ca scriptul cauta functia method() in domeniul global, obiectul window. Cuvantul "this" folosit in setTimeOut face referire la el insusi.
• Solutia in acest caz e crearea unei:
var nume_variabila = this; in functia clasa si utilizare nume_variabila in loc de "this", deoarece "nume_variabila" va retine obiectul continut in "this".
- Aplicand aceasta solutie in codul de mai sus, scriptul va functiona cum dorim.
<div id="swprop"></div>
<script type="text/javascript">
// se defineste o functie clasa
var numeClasa = function() {
var v_name = this; // retine obiectul continut in 'this'
// se defineste o proprietate si o metoda publica
var prop = 0;
this.method = function() {
document.getElementById('swprop').innerHTML = prop; // adauga valoarea lui prop in #swprop
// adauga o unitate la prop la fiecare apelare, si auto-apeleaza functia la fiecare 0.5 sec., folosind 'v_name'
prop++;
if(prop < 5) setTimeout(v_name.method, 500);
}
}
// se creaza un obiect la clasa numeClasa, si apeleaza method()
var objTest = new numeClasa();
objTest.method();
</script>
Clic pe butonul Demo ca sa vedeti rezultatul.
Un Test simplu in fiecare zi
HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care atribut face ca optiunea din <select> sa fie selectata?
checked="checked" selected="selected" disabled="disabled"<select name="a_name">
<option value="val1">Optiune 1</option>
<option value="val2" selected="selected">Optiune 2</option>
</select>
Care din aceste valori CSS creaza culoare gradient pentru fundal?
contain repeat-x linear-gradient#id {
background: linear-gradient(top left, #1f1, #fff, #11f);
}
Care cod creaza un array in JavaScript?
[] {} new Object()var arr = [1, "CoursesWeb.net", "MarPlo.net"];
alert(arr[2]);
Indicati functia PHP folosita pentru redirect la alta pagina.
function() header() switch()header("Location: http://coursesweb.net/");
exit;
Indicati articolul corect la cuvantul "garden" in propozitia: "... garden is a place with flowers".
An The AThe garden is a place with flowers.
- Gradina este un loc cu flori.
Indicati articolul corect pentru cuvantul: "jardín" (gradina)
la los elEl jardín es un lugar de flores.
- Gradina e un loc cu flori.