2013-04-15 3 views
20

Existe-t-il un moyen d'être informé lorsqu'un script modifie la valeur d'un texte de type d'entrée.Détecter les modifications programmatiques sur le texte du type d'entrée

J'ai

<input id='test' type='text' /> 

et un script

document.getElementById('test').value = 'bbb'; 

Je veux être informé de la modification du texte.

Je sais que je pourrais être averti par le clavier, le clavier, le module etc ... (ce qui fonctionne si je tente de suivre la saisie de l'utilisateur) mais qu'en est-il si la modification est effectuée par programmation?

Un grand merci

p.s. Non JQuery s'il vous plaît ou si jquery le fait quelqu'un peut-il expliquer comment il l'accomplit.

+0

dans le script où il appelle document.getElementById ('test').valeur = 'bbb'; y est-ce que vous n'appelez pas une fonction – 999k

+0

@ 555k pour quoi dois-je m'inscrire? Par exemple si je tapais document.getElementById ('test'). Onkeyup = function() {...} cela ne marcherait pas – Zo72

+0

Une idée serait de "hériter" du DOMElement, définir une propriété "value" avec getter et setter (comme proposé par @MaxArt) et à l'intérieur du getter et du setter utilisent l'attribut "value" d'origine du DOMElement. –

Répondre

12

Si vous avez affaire à un navigateur moderne, vous pouvez essayer quelque chose comme ceci:

var input = document.getElementById('test'); 
input._value = input.value; 
Object.defineProperty(input, "value", { 
    get: function() {return this._value;}, 
    set: function(v) { 
     // Do your stuff 
     this._value = v; 
    } 
}); 

Cette solution est bien si vous ne vous attendez pas réellement de entrée de l'utilisateur (c'est-à-dire, les champs de saisie de type caché), parce que c'est extrêmement destructeur de la fonctionnalité de base DOM. Garde cela à l'esprit.

+1

Il semble que lorsque vous redéfinissez l'attribut 'value', le champ de saisie ne soit plus" connecté "à l'attribut' value'. –

+1

@MaxArt c'est vraiment intelligent ... mais y a-t-il des effets secondaires? Je suis un peu inquiet de redéfinir la propriété 'value' – Zo72

+1

@ Zo72 Les effets secondaires c'est principalement celui que Jasd a mentionné, plus le problème que si l'utilisateur saisit une nouvelle valeur il n'y a * aucun moyen * de détecter ce qu'il a tapé, sauf vous allez capturer chaque événement clé et l'interpréter. C'est déjà un problème, mais si vous ajoutez des événements couper/copier/coller, ça va devenir énorme. – MaxArt

-1

La seule façon de suivre instantanément si un changement a été fait serait la suivante:

var value = document.getElementById('test').value; 

function trackChanges(oldVal) { 
    var newVal = document.getElementById('test').value; 

    if (newVal !== oldVal) { 
     alert('Changes occured!'); 
    } 

    var fn = function() { trackChanges(newVal); }; 

    setTimeout(fn(),100); 
} 

setTimeout(trackChanges(value), 100); 

cela signifie que vous appelez une fonction qui est appelée à chaque 100 milisecond par lui-même pour vérifier si un changement a été fait. Peut-être que vous cherchez quelque chose de mieux lorsque vous essayez de tester uniquement si quelque chose d'autre se produit, par exemple:

un clic sur un élément peut-être ...

+3

farina merci et oui, setTimeout fonctionnerait mais c'est une façon terrible de le faire. En outre, il y aura toujours une certaine latence (par exemple, 100 millisecondes) – Zo72

7

je trouve la façon la plus simple est de déclencher manuellement en fait l'événement:

document.getElementById('test').value = 'bbb'; 
var evt = new CustomEvent('change'); 
document.getElementById('test').dispatchEvent(evt); 

Juste écouter l'événement change est sujette à erreur lorsque la valeur est modifiée par le programme. Mais puisque vous changez la valeur, ajoutez deux lignes et lancez l'événement change, avec un CustomEvent.

alors vous serez en mesure de prendre cet événement change, que ce soit en ligne:

<input id="test" onchange="console.log(this)"> 

ou avec un auditeur:

document.getElementById('test').addEventListener('change',function(event) { 
    console.log(event.target); 
}); 

cela a l'avantage que si vous avez une entrée qui peut être modifié par l'utilisateur, vous pouvez capturer ces deux événements (de l'utilisateur ou le script)

cela dépend cependant du fait que vous êtes vous-même par programme changer la valeur de l'entrée. Si vous utilisez des bibliothèques (telles que datepickr) qui modifient les valeurs de vos entrées, vous devrez peut-être entrer le code et ajouter ces deux lignes au bon endroit.

Questions connexes