125 votes

Javascript Object.Watch pour tous les navigateurs?

Salut à tous, je cherchais un moyen facile de contrôler un objet ou variable de changements, et j'ai trouvé l'Objet.La montre qui est pris en charge dans les navigateurs Mozilla, mais pas IE. J'ai donc commencé à chercher autour pour voir si quelqu'un avait écrit une sorte d'équivalent.

La seule chose que j'ai trouvé a été un plugin jQuery (http://plugins.jquery.com/files/jquery-watch.js.txt), mais je ne suis pas sûr si c'est la meilleure façon d'aller. Je n'ai certainement utiliser jQuery dans la plupart de mes projets, donc je ne suis pas inquiet à propos de l'jQuery aspect...

De toute façon, la question: quelqu'un peut-il me montrer un exemple de fonctionnement de ce plugin jQuery? Je vais avoir des problèmes pour le faire fonctionner...

Ou, quelqu'un sait-il de meilleures solutions de rechange qui permettraient de travail de la croix-navigateur? Merci!

Mise à jour après les réponses:

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

Mais je n'arrivais pas à le faire fonctionner avec IE. Le code ci-dessous fonctionne très bien sous FireFox, mais ne fait rien dans IE. Dans Firefox, à chaque fois que l'observateur.le statut est modifié, le document.écrire à l'observateur.la montre est appelé et vous pouvez voir le résultat sur la page. Dans IE, cela n'arrive pas, mais je peux voir qu'observateur.statut de la mise à jour de la valeur, parce que le dernier document.écrire affiche la bonne valeur (dans IE et FF). Mais, si la fonction de rappel n'est pas appelé, alors que c'est un peu inutile... :)

Ai-je raté 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>");

116voto

Eli Grey Points 17553

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

J'ai créé un petit objet. Regardez Shim pour cela il y a quelque temps. Cela fonctionne dans IE8, Safari, Chrome, Firefox, Opera, etc.

20voto

Crescent Fresh Points 54070

Ce plugin utilise simplement un timer/intervalle de vérifier à plusieurs reprises pour des modifications sur un objet. Peut-être assez bon, mais personnellement, je voudrais plus d'immédiateté comme un observateur.

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

Il change la syntaxe à partir de Firefox pour l'ajout d'observateurs. Au lieu de :

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

Vous n':

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

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

14voto

mikemaccana Points 7470

Mise à jour pour 2013

Watch.JS s’occupe de cela dans la plupart des navigateurs, en utilisant Object.defineProperty () à partir de ES5 (c’est-à-dire, le javaScript standard et actuel) pour la surveillance.

https://github.com/melanke/Watch.JS

Daily JS a également examiné le code de watch.js pour les personnes intéressées.

7voto

Husky Points 2221

Notez que dans google Chrome 36 et plus vous pouvez utiliser Object.observe . C'est en fait une partie d'un futur standard ECMAScript, et pas un navigateur spécifique à la fonction, comme Mozilla Object.watch.

Object.observe fonctionne uniquement sur les propriétés de l'objet, mais elle est beaucoup plus performantes qu' Object.watch (ce qui est destinée à des fins de débogage, de ne pas l'utiliser en production).

var options = {};

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

options.foo = 'bar';

1voto

jitter Points 35805

J'ai trouvé deux personnes qui prétendent avoir résolu ce problème:

Surveillance d'objets Crossbrowser (prise en charge d'IE, Opera, Safari)

watch () Fonction JS manquante dans IE avec utilisation de prototype.js pour IE (? Opera, Safari?)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X