2008-11-20 9 views
6

wiem, co mogłem zrobić to z zamknięciem (var = to ja), jeśli obiekt był funkcją ...Czy obsługa zdarzeń zdefiniowana w samym dosłownym obiekcie javascript?

<a href="#" id="x">click here</a> 

<script type="text/javascript"> 
    var object = { 
     y : 1, 

     handle_click : function (e) { 
      alert('handling click'); 

      //want to access y here 

      return false; 
     }, 

     load : function() { 
      document.getElementById('x').onclick = this.handle_click; 
     } 
    }; 

    object.load(); 
</script> 

Odpowiedz

3

Więc, część drutów obsługi zdarzeń po prostu w porządku (testowałem to sam), ale jak Twój komentarz wskazuje, że nie masz dostępu do właściwości "y" obiektu, który właśnie zdefiniowałeś.

to działa:

var object = { 
    y : 1, 
    handle_click : function (e) { 
    alert('handling click'); 

    //want to access y here 
    alert(this.y); 

    return false; 
    }, 
    load : function() { 
    var that = this; 
    document.getElementById('x').onclick = function(e) { 
     that.handle_click(e); // pass-through the event object 
    }; 
    } 
}; 
object.load(); 

Są inne sposoby na zrobienie tego też, ale to działa.

+0

Jason, możesz zmienić alert (y); ostrzec (this.y) ;, a wyniki są takie same - już wywołujesz handler w kontekście obiektu, nie musisz podawać y jako argumentu. – Shog9

+0

Tak, widzę to. Muszę powstrzymać się od publikowania, gdy jestem pod wpływem środków przeciwbólowych. : P –

+0

Zaktualizowany w celu odzwierciedlenia tego ... –

3

Najprostszym sposobem, aby związać połączenie do handle_click do obiektu jest zdefiniowany w byłoby coś takiego:

 var self=this; 
     document.getElementById('x').onclick = 
      function(e) { return self.handle_click(e) }; 

Jeśli trzeba przejść w parametrach lub chcesz dokonać czystsze kod wygląd (dla Przykładowo, jeśli jesteś konfigurowania wiele podobnych programów obsługi zdarzeń), można użyć techniki currying aby osiągnąć ten sam:

bind : function(fn) 
{ 
    var self = this; 
    // copy arguments into local array 
    var args = Array.prototype.slice.call(arguments, 0); 
    // returned function replaces first argument with event arg, 
    // calls fn with composite arguments 
    return function(e) { args[0] = e; return fn.apply(self, args); }; 
}, 

...

 document.getElementById('x').onclick = this.bind(this.handle_click, 
      "this parameter is passed to handle_click()", 
      "as is this one"); 
+0

Problem nie jest ustawieniem procedury obsługi onclick, która działa poprawnie. Problem polega na tym, że gdy wykonywany jest handle_click, nie ma dostępu do wartości zmiennej "y". –

+0

@Jason: co jest nie tak z tym. – Shog9

+0

To nie działa - przetestowałem to i wraca ono niezdefiniowane z powodu działania programu obsługi zdarzeń, "to" staje się elementem, który wystrzelił zdarzenie click (przynajmniej robi to w FF3). –

0

Widzę, jak to zrobić z najnowszym Jasonem. Jakikolwiek sposób to zrobić bez anonimowej funkcji?

+0

Utkniesz z zamknięciem lub zmienną globalną. Dlaczego miałbyś odwrócić nos w momencie zamknięcia? Są jedną z najlepszych funkcji JavaScript ... – Shog9