2009-06-22 3 views
102

Я искал простой способ контролировать объект или переменную для изменений, и я нашел Object.watch(), что поддерживается в браузерах Mozilla, но не в IE. Поэтому я начал искать, чтобы увидеть, написал ли кто-нибудь какой-то эквивалент.Object.watch() для всех браузеров?

О единственном, что я нашел, было a jQuery plugin, но я не уверен, что это лучший способ пойти. Я, конечно, использую jQuery в большинстве своих проектов, поэтому я не беспокоюсь о аспекте jQuery ...

В любом случае вопрос: может ли кто-нибудь показать мне рабочий пример этого плагина jQuery? У меня проблемы с работой ...

Или кто-нибудь знает какие-либо лучшие альтернативы, которые будут работать в перекрестном браузере?

Update после ответов:

Спасибо всем за ответы! Я пробовал код, размещенный здесь: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Но я не мог заставить его работать с IE. Нижеприведенный код отлично работает в Firefox, но ничего не делает в IE. В Firefox каждый раз, когда изменяется watcher.status, вызывается document.write() в watcher.watch(), и вы можете видеть вывод на странице. В IE этого не происходит, но я вижу, что watcher.status обновляет значение, потому что последний вызов document.write() показывает правильное значение (как в IE, так и в FF). Но, если функция обратного вызова не вызывается, то это бесполезно ... :)

Я что-то упустил?

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 вы можете использовать onPropertyChange в IE – scunliffe

+1

Заменить document.write() с боевой готовности(). Он должен работать нормально. –

ответ

110

(Извините за кросс-постинг, но этот ответ я дал на подобный вопрос здесь работает отлично)

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

+1

Более поздняя версия этого скрипта от Eli - https://gist.github.com/175649 –

+9

Объяснение того, как его использовать и как это работает внутри, будет спасибо за те из нас, которые не являются мастерами JS, спасибо. – maraujop

+3

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

1

я нашел два людей, которые утверждают, что решить эту проблему:

Crossbrowser Object watch (требования поддержки для IE, Opera, Safari)

watch() Missing JS Function in IE с использованием prototype.js для IE (Opera? , Safari?)

+0

Спасибо за ссылки ... Я опробовал первый и еще несколько проблем с IE. Я обновил свой первый пост выше с дополнительной информацией. У меня еще не было возможности попробовать код во второй ссылке, но я обязательно сделаю это сегодня. – SeanW

19

Этот плагин просто использует таймер/интервал для многократной проверки изменений на объекте. Может быть, достаточно хорошо, но лично я хотел бы получить больше непосредственности в качестве наблюдателя.

Предъявляете watch/unwatch до IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.

Он меняет синтаксис на Firefox, добавляя наблюдателей. Вместо того, чтобы:

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

Вы делаете:

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

Не как сладкий, но в качестве наблюдателя вы немедленно уведомлен.

+1

Уже перечисленные выше. –

+11

@SleepyCod: зачем вы предлагаете полезный ответ? Посмотрите на отметки времени. Мы отправили в течение 2 секунд друг друга (буквально, я помню). Вот как это работает: downvote неправильные или другие нерелевантные ответы. –

+0

Да, смотрите эти временные метки ... нет необходимости в downvote, также crescentfresh добавил дополнительную информацию к сообщению, даже если это была такая же ссылка. Между тем, я пробовал код, найденный на этой странице, и все еще вижу проблему. Я могу кое-что обойти. Я обновил свое оригинальное сообщение с дополнительной информацией ... – SeanW

13

Обновление на конец 2015

Object.observe() теперь отменен. Извините, люди!

Обновление для 2015

Использование Object.observe() from ES7.

Here's a polyfill.

+0

Хм, я не мог получить этот полиполк для работы на сафари ios. Я получаю Error: undefined не является функцией (оценка «Object.observe (a.imgTouch, function (a) {console.debug (« lastX: »+ a)})) – infomofo

+0

@infomofo Привет, вы хотите открыть проблема на странице проекта, со всеми подробностями, которые вы можете дать? Я не тестировал его на iOS, но я рассмотрю проблему. – MaxArt

7

Обратите внимание, что в Chrome 36 и выше, вы можете использовать Object.observe, а также. Это фактически часть будущего стандарта ECMAScript, а не функция, специфичная для браузера, такая как Mozilla's Object.watch.

Object.observe работает только над свойствами объекта, но намного более совершенен, чем Object.watch (который предназначен для целей отладки, а не для использования в производстве).

var options = {}; 

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

options.foo = 'bar'; 
2

Вы можете использовать Object.defineProperty.

посмотреть недвижимость bar в 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 
    } 
}) 
Смежные вопросы