javascript - variable - watch js




Object.watch() pour tous les navigateurs? (5)

(Désolé pour la publication croisée, mais cette réponse que j'ai donnée à une question similaire fonctionne bien ici)

J'ai créé un petit object.watch shim pour ça il y a un moment. Il fonctionne dans IE8, Safari, Chrome, Firefox, Opera, etc.

Je cherchais un moyen facile de surveiller un objet ou une variable pour les changements, et j'ai trouvé Object.watch() , qui est supporté dans les navigateurs Mozilla, mais pas IE. J'ai donc commencé à chercher pour voir si quelqu'un avait écrit une sorte d'équivalent.

A propos de la seule chose que j'ai trouvé a été un plugin jQuery , mais je ne suis pas sûr que ce soit la meilleure voie à suivre. J'utilise certainement jQuery dans la plupart de mes projets, donc je ne suis pas inquiet pour l'aspect jQuery ...

Quoi qu'il en soit, la question: Quelqu'un peut-il me montrer un exemple de travail de ce plugin jQuery? J'ai des problèmes pour le faire fonctionner ...

Ou, quelqu'un sait-il de meilleures alternatives qui fonctionneraient par navigateur?

Mettre à jour après les réponses :

Merci à tous pour les réponses! J'ai essayé le code affiché ici: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Mais je ne pouvais pas sembler le faire fonctionner avec IE. Le code ci-dessous fonctionne bien dans Firefox, mais ne fait rien dans IE. Dans Firefox, chaque fois que watcher.status est changé, le document.write() dans watcher.watch() est appelé et vous pouvez voir la sortie sur la page. Dans IE, cela ne se produit pas, mais je peux voir que watcher.status met à jour la valeur, car le dernier appel document.write() affiche la valeur correcte (à la fois dans IE et FF). Mais, si la fonction de rappel n'est pas appelée, alors c'est inutile ... :)

Est-ce que je manque quelque chose?

var options = {'status': 'no status'},
watcher = createWatcher(options);

watcher.watch("status", function(prop, oldValue, newValue) {
  document.write("old: " + oldValue + ", new: " + newValue + "<br>");
  return newValue;
});

watcher.status = 'asdf';
watcher.status = '1234';

document.write(watcher.status + "<br>");

Ce plugin utilise simplement une minuterie / intervalle pour vérifier à plusieurs reprises les changements sur un objet. Peut-être assez bien mais personnellement je voudrais plus d'immédiateté en tant qu'observateur.

Voici une tentative d'amener watch / unwatch à IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html .

Cela change la syntaxe de la manière Firefox d'ajouter des observateurs. Au lieu de :

var obj = {foo:'bar'};
obj.watch('foo', fooChanged);

Tu fais:

var obj = {foo:'bar'};
var watcher = createWatcher(obj);
watcher.watch('foo', fooChanged);

Pas aussi doux, mais en tant qu'observateur, vous êtes averti immédiatement.



Notez que dans Chrome 36 et supérieur, vous pouvez également utiliser Object.observe . C'est en fait une partie d'un futur standard ECMAScript, et non une fonctionnalité spécifique au navigateur comme Object.watch de Mozilla.

Object.observe fonctionne uniquement sur les propriétés de l'objet, mais est beaucoup plus performant que Object.watch (qui est destiné à des fins de débogage, pas à l'utilisation en production).

var options = {};

Object.observe(options, function(changes) {
    console.log(changes);
});

options.foo = 'bar';





javascript-events