javascript - como - Object.watch() para todos los navegadores?
como activar javascript en chrome (7)
(Perdón por la publicación cruzada, pero esta respuesta que di a una pregunta similar funciona bien aquí)
He creado un pequeño objeto. Revisar esto hace un tiempo. Funciona en IE8, Safari, Chrome, Firefox, Opera, etc.
Estaba buscando una manera fácil de monitorear un objeto o una variable para los 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.
Lo único que encontré fue un plugin jQuery , pero no estoy seguro de si es la mejor manera de hacerlo. Ciertamente uso jQuery en la mayoría de mis proyectos, así que no estoy preocupado por el aspecto jQuery ...
De todos modos, la pregunta: ¿alguien me puede mostrar un ejemplo de ese plugin jQuery? Tengo problemas para hacerlo funcionar ...
O, ¿alguien sabe de alguna alternativa mejor que funcione en el navegador cruzado?
Actualización después de las 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 parece que no puedo 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 watcher.status
document.write()
en watcher.watch()
y se 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 a document.write()
muestra el valor correcto (tanto en IE como en FF). Pero, si no se llama a la función de devolución de llamada, entonces eso no tiene sentido ... :)
¿Me estoy perdiendo de 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>");
Encontré dos personas que afirman haber resuelto este problema:
http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html (soporte de http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html para IE, Opera, Safari)
watch () Falta la función JS en IE con el uso de prototype.js para IE (? Opera, Safari?)
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 unwatch
/ watch
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);
Tú lo haces:
var obj = {foo:''bar''};
var watcher = createWatcher(obj);
watcher.watch(''foo'', fooChanged);
No tan dulce, pero como observador se te notifica inmediatamente.
También creo que en este momento la mejor solución es usar Watch.JS, encuentre un buen tutorial aquí: Escuche / Observe los cambios de objetos o matrices en Javascript (evento Property changed en objetos Javascript)
Tenga en cuenta que en Chrome 36 y superior también puede usar Object.observe
. Esto es en realidad una parte de un futuro estándar ECMAScript, y no una característica específica del navegador como Object.watch
de Mozilla.
Object.observe
solo funciona en las propiedades de los objetos, pero es mucho más Object.watch
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'';
puede usar Object.defineProperty .
mira el bar
la propiedad 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
}
})
Actualización para finales de 2015
Object.observe () ahora está cancelado. Lo siento gente!
Actualización para 2015
Use Object.observe () de ES7 .