Javascript: Comment faire en sorte qu'un contrôle s'envoie dans une méthode
-
03-07-2019 - |
Question
<a href="" id="someId" onclick="SomeMethod(self);"></a>
Où SomeMethod pourrait avoir:
function SomeMethod(item)
{
item.setAttribute('name', item.id);
}
Au lieu de:
function SomeMethod(itemId)
{
var someItem;
someItem = document.getElementById(itemId);
someItem .setAttribute('name', someItem .id);
}
Exemple idiot, mais l’idée n’est pas d’envoyer l’id lui-même, mais le contrôle qui appelle la méthode. Je jure que cela peut être fait, mais je n'ai pas eu la chance de chercher ... en partie parce que je ne sais même pas sur quoi chercher.
Je pensais que c'était moi-même, mais le moi ne semble pas être ce que je veux quand le script que j'ai est exécuté.
La solution
Utilisez le this
Keyword.
<a href="" id="someId" onclick="SomeMethod(this);"></a>
Autres conseils
En réalité, vous n'avez pas besoin de passer this en tant qu'argument pour votre fonction, car vous disposez d'un objet événement click auquel vous pouvez accéder. Donc:
<a href="" id="someId" onclick="clickEventHandler()"></a>
<script>
function clickEventHandler(event) {
if (!event) {
event = window.event; // Older versions of IE use
// a global reference
// and not an argument.
};
var el = (event.target || event.srcElement); // DOM uses 'target';
// older versions of
// IE use 'srcElement'
el.setAttribute('name', el.id);
}
</script>
J'ai tendance à utiliser cette approche dans tous les appels de fonction à partir d'attributs HTML: -
onclick="SomeMethod.call(this)"
Puis dans le javascript faire: -
function SomeMethod()
{
this.setAttribute('name', this.id);
}
Cela présente un avantage certain lorsque vous pouvez également affecter directement des propriétés de gestionnaire d'événements au code Javascript: -
document.getElementById("someID").onclick = SomeMethod
Si SomeMethod prenait l'élément context en tant que paramètre, il serait très difficile de configurer: -
function(id) {
var elem = document.getElementById(id)
elem.onclick = function() { SomeMethod(elem); }
}("someID");
Pire encore, ce serait une fermeture avec une fuite de mémoire.
À ce stade: SomeMethod (this)
- this
renvoie l'objet window, ne l'utilisez pas. La bonne façon d'utiliser ce mot-clé
est de rendre le contexte pertinent; utilisez donc SomeMethod.call (this)
.