2011-07-14 19 views
9

DOM olmayan bir Javascript nesnesinin (veya de)giskeni) de changegistirilmesinde bir değişiklik (jQuery kullanarak veya başka bir şekilde) mümkün mü? Dolayısıyla, örneğin, var:Javascript nesne deği Listentirme için dinleme yapın

function MyObject() 
{ 
    this.myVar = 0; 
} 

var myObject = new MyObject(); 
myObject.myVar = 100; 

bir işlevi myVar değişikliklerin zaman değeri için dinlemek ve aramak için bir yolu var mı? Getter/setter kullanabileceğimi biliyorum, ancak IE'nin önceki sürümlerinde desteklenmiyorlar. IE önemli ise

+0

olası yinelenen [JavaScript - nesne özellikleri değişiklikler için İzleme] (http://stackoverflow.com/questions/1269633/javascript-watch-for-object-properties -Ağırlar) – mplungjan

cevap

4

, sana Watch

ilgilenmiyor Ama birisi bu soruyu kopyasını yapar bir dolgu yazdım görünüyor tahmin

Watch for object properties changes in JavaScript

+0

Bu muhtemelen en iyi çözümdür - hala IE7'yi hariç tutmaktadır, ancak IE ile bir dünyada, hiçbir şey mükemmel olmayabilir ... :) – redhotvengeance

+0

https://github.com/melanke/Watch.JS Sanırım – django

+0

kullanmanın en iyi yolu Yorum yapmadan indirme yapmak hiç kimseye yardım etmiyor – mplungjan

1

Temelde bu tür davranışı uygulayabilir

function MyObject(onMyVarChangedCallback) 
{ 
    this.myVar = 0; 

    this.setMyVar = function (val) { 
     this.MyVar = val; 

     if (onMyVarChangedCallback) { 
      onMyVarChangedCallback(); 
     } 
    } 
} 

function onChangeListener() { 
    alert('changed'); 
} 

var o = new MyObject(onChangeListener); 
+0

Bu, bir ayarlayıcı gibi bir değerin ayarlanması ile işe yaramaz, değil mi? 'o.myVar = 100' işe yaramazdı, 'o.setMyVar (100)' olmalıydı 'Bu kaçınmak için çalışıyorum - Ben bir setter gibi çalışmak isterdim, ama tüm tarayıcılarda destek tutarken bu mümkün olmayabilir. – redhotvengeance

+0

ohhh .. Şu anda daha yakın bir problem görüyorum .. –

9

Temelde iki seçeneğiniz

var Sadece Firefox'ta kullanılabilir
  • kullanımı standart dışı watch yöntemi eski IE sürümlerinde desteklenmez
  • kullanım Alıcılar ve ayarlayıcılar

üçüncü ve çapraz platform seçeneği yoklama kullanmaktır hangi yani büyük

Örnek taşımaktadır watch

var myObject = new MyObject(); 

// Works only in Firefox 
// Define *watch* for the property 
myObject.watch("myVar", function(id, oldval, newval){ 
    alert("New value: "+newval); 
}); 

myObject.myVar = 100; // should call the alert from *watch* 
arasında

Örnek ve setters

function MyObject(){ 
    // use cache variable for the actual value 
    this._myVar = undefined; 
} 

// define setter and getter methods for the property name 
Object.defineProperty(MyObject.prototype, "myVar",{ 
    set: function(val){ 
     // save the value to the cache variable 
     this._myVar = val; 
     // run_listener_function_here() 
     alert("New value: " + val); 
    }, 
    get: function(){ 
     // return value from the cache variable 
     return this._myVar; 
    } 
}); 

var m = new MyObject(); 
m.myVar = 123; // should call the alert from *setter* 
+0

"IE'nin daha eski sürümleri" derseniz IE8'i içeriyor mu? Biliyorum _is_ eski, ama getter ve ayarlayıcıları destekliyor mu? – evolutionxbox

+0

Bu cevap 2011'den. IE8 o zamanlar çok eski değildi. – Andris