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 meta tag se foloseste pentru scurta descriere a paginii?
<meta content="..."> <meta description="..."> <meta http-equiv="..."><meta name="description" content="70-160 caractere ce descriu continutul paginii" />
Ce proprietate CSS opreste efectul dat de "float"?
clear text-align position#some_id {
clear: both;
}
Clic pe metoda ce creaza un array cu toate elementele din pagina cu un anumit nume de tag.
getElementsByName() getElementById() getElementsByTagName()var divs = document.getElementsByTagName("div");
var nr_divs = divs.length;
alert(nr_divs);
Indicati functia PHP ce returneaza numarul de elemente dintr-un array.
is_[) count() strlen()$arr =[7, 8, "abc", 10);
$nri = count($arr);
echo $nri; // 4
Indicati adverbul corespunzator adjectivului din paranteza in propozitia: "I live (happy)".
happly happily hapilyI live happily.
- Traiesc fericit (in mod fericit).
Indicati adverbul corespunzator adjectivului din paranteza in propozitia: "Vivo (feliz)".
felizamente felizmente felicesVivo felizmente.
- Traiesc fericit (cu fericire).