Acest articol este adresat celor care inca mai folosesc cod JavaScript simplu (fara jQuery, Prototype, etc.). Am lucrat la un moment dat la un proiect, unde aveam nevoie sa folosesc o functie JavaScript care nu justifica includerea a 26k de jQuery.
Sunt de parere ca nu trebuie sa folosesc solutii mai complexe decat e cazul (mai ales daca asta inseamna sa adaug librarii suplimentare). Prin urmare m-am apucat batraneste de JavaScript. Functia urma sa fie chemata prin intermediul unui link si arata ceva de genul asta:
<script type="text/javascript">
function doSomething(obj)
{
var href = obj.getAttribute('href');
var title = obj.getAttribute('title');
// do somethig with these...
}
</script>
Iar apelul era de genul asta:
<a href='javascript:doSomething(this)'>Click me!</a>
Scopul era ca atunci cand apelez functia doSomething(), sa trimit elementul <a> ca parametru. Problema era ca de fiecare data cand inceram sa apelez getAttribute() pe parametrul obj, primeam o erorare care imi spunea atributul pe care-l caut nu exista.
Am folosit console.log() pentru a inspecta elementul care ajungea in functia mea si am facut o constatare surprinzatoare: Prin this, browser-ul intelegea sa trimita obiectul window ca parametru la functia mea.
Cum am rezolvat problema? Am schimbat apelul functiei. Se pare ca daca folosesc atributul onclick pentru a apela functia, browser-ul intelege ca this este elementul curent. Asa ca am modificat apelul sa arate astfel:
<a href='#' onclick='doSomething(this)'>Click me!</a>
Din acel moment totul a mers de minune. Nu stiu sa explic exact de ce apare acest comportament, dar m-am gandit sa-l mentionez aici pentru cei care se lovesc, poate, de aceeasi problema.