2009-06-22 26 views
102

Estaba buscando una manera fácil de monitorear un objeto o una variable en busca de cambios, y encontré Object.watch(), que es compatible con los navegadores Mozilla, pero no con IE. Entonces comencé a buscar para ver si alguien había escrito algún tipo de equivalente.Object.watch() para todos los navegadores?

Lo único que he encontrado ha sido a jQuery plugin, pero no estoy seguro de si es la mejor manera de hacerlo. Ciertamente utilizo jQuery en la mayoría de mis proyectos, así que no me preocupa el aspecto jQuery ...

De todos modos, la pregunta: ¿alguien me puede mostrar un ejemplo de ese plugin de jQuery? Estoy teniendo problemas para hacerlo funcionar ...

O, ¿Alguien sabe de alguna alternativa mejor que funcione en el navegador?

Update después de respuestas:

Gracias a todos por las respuestas! Probé el código publicado aquí: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Pero no pude hacer que funcione con IE. El siguiente código funciona bien en Firefox, pero no hace nada en IE. En Firefox, cada vez que se cambia watcher.status, se llama al document.write() en watcher.watch() y puede ver el resultado en la página. En IE, eso no sucede, pero puedo ver que watcher.status está actualizando el valor, porque la última llamada document.write() muestra el valor correcto (en IE y FF). Pero, si la función de devolución de llamada no se llama, entonces eso es un poco inútil ... :)

¿Echo de menos algo?

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>"); 
+2

IIRC puede utilizar onPropertyChange en IE – scunliffe

+1

Reemplazar document.write() con alerta(). debería funcionar bien. –

Respuesta

110

(Lo siento por la publicación cruzada, pero esta respuesta que he dado a una pregunta similar funciona bien aquí)

He creado un pequeño object.watch shim para este hace un tiempo. Funciona en IE8, Safari, Chrome, Firefox, Opera, etc.

+1

Una versión más reciente de esta secuencia de comandos de Eli es https://gist.github.com/175649 –

+9

Una explicación sobre cómo usarlo y cómo esto funciona internamente sería bueno para aquellos de nosotros que no somos maestros de JS, gracias. – maraujop

+3

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch –

1

me encontré con dos personas que afirman haber resuelto este problema:

Crossbrowser Object watch (reclamaciones soporte para IE, Opera, Safari)

watch() Missing JS Function in IE con el uso de prototype.js para IE (Opera? , Safari?)

+0

Gracias por los enlaces ... Probé el primero y todavía tenía algunos problemas con IE. He actualizado mi publicación inicial anterior con más información. Todavía no he tenido la oportunidad de probar el código en el segundo enlace, pero me aseguraré de hacerlo hoy. – SeanW

19

Ese complemento simplemente usa un temporizador/intervalo para verificar repetidamente los cambios en un objeto. Quizás sea lo suficientemente bueno pero personalmente me gustaría tener más inmediatez como observador.

Aquí hay un intento de traer watch/unwatch a IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.

Cambia la sintaxis de la forma de Firefox de agregar observadores. En lugar de:

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

lo hace:

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

No es tan dulce, pero en calidad de observador se le notifica inmediatamente.

+1

Ya mencionado anteriormente. –

+11

@SleepyCod: ¿por qué rechazarías una respuesta útil? Mira las marcas de tiempo. Publicamos en 2 segundos el uno del otro (literalmente, recuerdo). Así es cómo funciona: rechazar respuestas incorrectas o irrelevantes. –

+0

Sí, mira esas marcas de tiempo ... no hay necesidad de rechazar, también crescentfresh agregó más información a la publicación, incluso si era el mismo enlace. Mientras tanto, probé el código que se encuentra en esa página y todavía veo un problema. Sin embargo, puedo estar pasando por alto algo. He actualizado mi publicación original con más información ... – SeanW

13

Actualización para finales de 2015

Object.observe() se ha cancelado. Lo siento gente!

Actualización para 2015

Uso Object.observe() from ES7.

Here's a polyfill.

+0

Hm, no pude hacer que este polyfill funcione en ios safari. Aparece el error: undefined no es una función (evaluando 'Object.observe (a.imgTouch, function (a) {console.debug ("lastX:" + a)})') – infomofo

+0

@infomofo Hola, te gustaría abrir un problema en la página del proyecto, con todos los detalles que puede dar? No lo he probado en iOS, pero analizaré el problema. – MaxArt

7

Tenga en cuenta que en Chrome 36 y más alto se puede utilizar Object.observe también. Esto es en realidad parte de un futuro estándar ECMAScript, y no una característica específica del navegador como el Object.watch de Mozilla.

Object.observe solo funciona en las propiedades del objeto, pero es mucho más eficaz que Object.watch (que está destinado a la depuración, no a la producción).

var options = {}; 

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

options.foo = 'bar'; 
2

puede usar Object.defineProperty.

Ver la propiedad bar en foo

Object.defineProperty(foo, "bar", { 
    get: function (val){ 
     //some code to watch the getter function 
    }, 

    set: function (val) { 
     //some code to watch the setter function 
    } 
}) 
Cuestiones relacionadas