Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Opera + magic function dla metod prywatnych obiektów
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
erix
Najgorsza część kampanii wrześniowej za mną, więc można trochę pokodzić dla siebie.

Mianowicie, piszę takiego UserJS dla Blipa do Opery.

I cały czas mnie daje się we znaki jeden problem: czy można w jakiś sposób podmienić funkcję zdefiniowaną jako prywatną? Lub chociaż wywołać cokolwiek przed "fabrycznymi"?

Mam coś takiego:
[JAVASCRIPT] pobierz, plaintext
  1. BLIP.dashboardInputWidget = function (f) {
  2. //...
  3. var s = function (a) {
  4. textArea.switchRecipient(o.selectedRecipientName() || null);
  5. textArea.htmlElement.focus()
  6. };
[JAVASCRIPT] pobierz, plaintext


I jak wywołać moją funkcję przed tą zdefiniowaną w powyższej zmiennej? Callback jest wywoływany przez Event.observe w Prototype.

Jak się nie da, to chociaż w jaki sposób wepchnąć swoje zdarzenie na początek kolejki handlerów dla zdarzeń danego obiektu? unobserve tylko zdejmuje, ale już nie zwraca uchwytu do poprzedniego callbacka sad.gif

Bez sensu jest zdejmowanie całego zdarzenia i wsadzanie fabrycznego kodu do swojego UserJS-a tylko z tego powodu, że chcę przed nim jedną linijkę wykonać...

Any ideas?
wookieb
[JAVASCRIPT] pobierz, plaintext
  1. BLIP = {};
  2. BLIP.dashboardInputWidget = function (f) {
  3. alert('cos');
  4. }
  5.  
  6. BLIP.oldDashboardInputWidget = BLIP.dashboardInputWidget;
  7.  
  8. BLIP.dashboardInputWidget = function(f) {
  9. alert('ziomek');
  10. BLIP.oldDashboardInputWidget(f);
  11. }
  12.  
  13. BLIP.dashboardInputWidget('g');
[JAVASCRIPT] pobierz, plaintext
vokiel
A przez prototyp?
[JAVASCRIPT] pobierz, plaintext
  1. BLIP.prototype.dashboardInputWidget = function (f) {
  2. //Twój kod
  3. }
[JAVASCRIPT] pobierz, plaintext
zegarek84
Cytat(vokiel @ 16.09.2010, 16:06:15 ) *
A przez prototyp?
[JAVASCRIPT] pobierz, plaintext
  1. BLIP.prototype.dashboardInputWidget = function (f) {
  2. //Twój kod
  3. }
[JAVASCRIPT] pobierz, plaintext

luknij na przykładowy kodzik winksmiley.jpg - zmienna definiowana {} - nie ma typowego konstruktora... a prototype służy do predefiniowania zmiennych i metod - jeśli Ci się podoba to w konstruktorze można nadpisać metodę... lub można nadpisać na żywca [a.nierusz = function(){alert('wylotka');};] po utworzeniu instancji obiektu -> wtedy oczywiście każdy obiekt ma inną metodę o tej nazwie
Cytat(erix @ 16.09.2010, 15:43:32 ) *
I cały czas mnie daje się we znaki jeden problem: czy można w jakiś sposób podmienić funkcję zdefiniowaną jako prywatną?

można to zrobić tylko za pomocą metod definiowanych w tym samym konstruktorze [zmienna prywatna w obiekcie do której mają zasięg metody - jednak w metodach nie nadpisywać definicji zmiennej] - metody definiowane w prototypie funkcji [a.prototype={metody} lub a.prototype.metoda=fn] nie mają do nich dostępu...

w podanym przez Ciebie przykładzie jest to zmienna prywatna ale funkcji a nie obiektu - więc musisz zrobić raczej tak jak radzi @wookieb

skoro napisałeś z dużej litery Prototype to raczej miałeś na myśli bibliotekę - akurat jej nie znam więc nie wiem jak to rozwiązali [ale obiekt nasłuchujący powinien mieć publiczne metody - u siebie gdy mam wiele zdarzeń to jest kolejna numeracja i metody mają nazwy generowane typu '_.!*[]-+=_numer-kolejny_typ-zdarzenia' - oczywiście nasłuchuje jedna metoda o nazwie 'nazwa-zdarzenia' przypięta z listenera gdzie jest dostęp do zmiennych listenera - ale prywatnych gdyż this jest potem w innym kontekście - a te inne dziwne metody o tych nazwach tak są przypisywane by móc definiować funkcje w ewent_listenerze z użyciem this]... jeśli nie i korzystasz z jakichś "magicznych" metod opery to rozwiązaniem byłby raczej własny prototyp funkcji eventDispatcher oraz eventDelegate

trochu się rozpisałem - ale znając zasadę w jaki sposób przypisywane są zdarzenia na 90% istnieje sposób ingerencji w nie...
[EDIT]
----------------------------------------------------------------
Cytat(erix @ 16.09.2010, 15:43:32 ) *
I jak wywołać moją funkcję przed tą zdefiniowaną w powyższej zmiennej? Callback jest wywoływany przez Event.observe w Prototype.

Jak się nie da, to chociaż w jaki sposób wepchnąć swoje zdarzenie na początek kolejki handlerów dla zdarzeń danego obiektu? unobserve tylko zdejmuje, ale już nie zwraca uchwytu do poprzedniego callbacka sad.gif

teraz sobie zajrzałem do kodu biblioteki Prototype - po mojemu listę uchwytów zdarzeń możesz pobrać przez:
Element.retrieve(element, 'prototype_event_registry').get(eventName);

co się pokrywa z tym co znalazłem w google wpisując niekture nazwy z metody observe
Update: How to find event listeners on a DOM node in prototype? - więc masz 2 drogi do wyboru...

swojego kodu nie sprawdzałem ale funkcja _createResponder także potwierdza to co widzę w kodzie winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.