2009-08-13 5 views
35

Можно создать дубликат:
Javascript Object.Watch for all browsers?Часы для свойств объекта изменений в JavaScript

Я только что прочитал документацию Mozilla, для watch() method. Это выглядит очень полезно.

Однако я не могу найти что-то подобное для Safari. Ни обозреватель Internet Explorer.

Как вы управляете переносимостью между браузерами?

+1

Dup: http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers –

+0

Вот родственный обсуждение: [http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers](http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all -browsers) –

ответ

65

Я создал для этого небольшой object.watch shim. Он работает в IE8, Safari, Chrome, Firefox, Opera и т.д.

/* 
* object.watch v0.0.1: Cross-browser object.watch 
* 
* By Elijah Grey, http://eligrey.com 
* 
* A shim that partially implements object.watch and object.unwatch 
* in browsers that have accessor support. 
* 
* Public Domain. 
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 
*/ 

// object.watch 
if (!Object.prototype.watch) 
    Object.prototype.watch = function (prop, handler) { 
     var oldval = this[prop], newval = oldval, 
     getter = function() { 
      return newval; 
     }, 
     setter = function (val) { 
      oldval = newval; 
      return newval = handler.call(this, prop, oldval, val); 
     }; 
     if (delete this[prop]) { // can't watch constants 
      if (Object.defineProperty) // ECMAScript 5 
       Object.defineProperty(this, prop, { 
        get: getter, 
        set: setter 
       }); 
      else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { // legacy 
       Object.prototype.__defineGetter__.call(this, prop, getter); 
       Object.prototype.__defineSetter__.call(this, prop, setter); 
      } 
     } 
    }; 

// object.unwatch 
if (!Object.prototype.unwatch) 
    Object.prototype.unwatch = function (prop) { 
     var val = this[prop]; 
     delete this[prop]; // remove accessors 
     this[prop] = val; 
    }; 
+0

Любые причины, почему вы удалили его из Github? Лучшее решение? Не работает? Как насчет IE7? – keyle

+5

Это все еще на Github, я просто переместил его в gist (https://gist.github.com/384583) из-за того, что он не был достаточно значительным для репо imo. –

+0

как мы используем это для мониторинга innerHTML на объектах DOM? – jchook

1

К сожалению, это не переносное решение. IE не имеет ничего подобного, насколько мне известно, хотя было бы замечательно, если бы было

-4

Возможно, вы могли бы реализовать свою собственную систему опознавания, путем перезаписи методов и переменных. Я не считаю это критическим, хотя, но я не знаю, что вы планируете делать с такой системой.