Je viens de commencer à utiliser javascript et il me manque quelque chose d'important à ma connaissance. J'espérais que vous pourriez m'aider à combler le vide. Par conséquent, le script que j'essaie d'exécuter suppose de compter les caractères dans un champ de texte et de mettre à jour un paragraphe pour indiquer à l'utilisateur le nombre de caractères qu'il a tapés. J'ai un objet appelé charCounter. sourceId est l'identifiant de la zone de texte pour compter les caractères. statusId est l'identifiant du paragraphe à mettre à jour chaque fois qu'une touche est enfoncée.Comment exécuter la méthode onEvent d'un objet en javascript?
function charCounter(sourceId, statusId) {
this.sourceId = sourceId;
this.statusId = statusId;
this.count = 0;
}
Il existe une méthode appelée updateAll. Il met à jour le nombre de caractères et met à jour le paragraphe.
charCounter.prototype.updateAll = function() {
//get the character count;
//change the paragraph;
}
J'ai une fonction de démarrage qui est appelée lorsque la fenêtre se charge.
function start() {
//This is the problem
document.getElementbyId('mytextfield').onkeydown = myCounter.updateAll;
document.getElementbyId('mytextfield').onkeyup = myCounter.updateAll;
}
myCounter = new charCounter("mytextfield","charcount");
window.onload = start;
Le code ci-dessus est le problème. Pourquoi dans le monde ne puis-je pas appeler la méthode myCounter.updateAll lorsque l'événement est déclenché? C'est vraiment déroutant pour moi. Je comprends que si vous appelez une méthode likeThis() vous obtiendrez une valeur de la fonction. Si vous l'appelez comme ceci vous obtenez un pointeur vers une fonction. Je pointe mon événement vers une fonction. J'ai également essayé d'appeler la fonction directement et cela fonctionne très bien, mais cela ne fonctionnera pas quand l'événement est déclenché.
Qu'est-ce qui me manque?
Merci pour toutes les réponses. Voici trois implémentations différentes.
Application 1
function CharCounter(sourceId, statusId) {
this.sourceId = sourceId;
this.statusId = statusId;
this.count = 0;
};
CharCounter.prototype.updateAll = function() {
this.count = document.getElementById(this.sourceId).value.length;
document.getElementById(this.statusId).innerHTML = "There are "+this.count+" charactors";
};
function start() {
myCharCounter.updateAll();
document.getElementById('mytextfield').onkeyup = function() { myCharCounter.updateAll(); };
document.getElementById('mytextfield').onkeydown = function() { myCharCounter.updateAll(); };
};
myCharCounter = new CharCounter('mytextfield','charcount');
window.onload = start;
Application 2
function CharCounter(sourceId, statusId) {
this.sourceId = sourceId;
this.statusId = statusId;
this.count = 0;
};
CharCounter.prototype.updateAll = function() {
this.count = document.getElementById(this.sourceId).value.length;
document.getElementById(this.statusId).innerHTML = "There are "+ this.count+" charactors";
};
CharCounter.prototype.start = function() {
var instance = this;
instance.updateAll();
document.getElementById(this.sourceId).onkeyup = function() {
instance.updateAll();
};
document.getElementById(this.sourceId).onkeydown = function() {
instance.updateAll();
};
};
window.onload = function() {
var myCounter = new CharCounter("mytextfield","charcount");
myCounter.start();
};
Mise en œuvre 3
function CharCounter(sourceId, statusId) {
this.sourceId = sourceId;
this.statusId = statusId;
this.count = 0;
};
CharCounter.prototype.updateAll = function() {
this.count = document.getElementById(this.sourceId).value.length;
document.getElementById(this.statusId).innerHTML = "There are "+this.count+" charactors";
};
function bind(funcToCall, desiredThisValue) {
return function() { funcToCall.apply(desiredThisValue); };
};
function start() {
myCharCounter.updateAll();
document.getElementById('mytextfield').onkeyup = bind(myCharCounter.updateAll, myCharCounter);
document.getElementById('mytextfield').onkeydown = bind(myCharCounter.updateAll, myCharCounter);
};
myCharCounter = new CharCounter('mytextfield','charcount');
window.onload = start;
Merci! Cela jette beaucoup de lumière sur mon problème! – user182666
De rien @dgendill! – CMS