Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Opera + magic function dla metod prywatnych obiektów
erix
post
Post #1





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




[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


--------------------
Go to the top of the page
+Quote Post
vokiel
post
Post #3





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


A przez prototyp?
[JAVASCRIPT] pobierz, plaintext
  1. BLIP.prototype.dashboardInputWidget = function (f) {
  2. //Twój kod
  3. }
[JAVASCRIPT] pobierz, plaintext


--------------------
Go to the top of the page
+Quote Post
zegarek84
post
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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

Ten post edytował zegarek84 17.09.2010, 00:46:18


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:42