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 (IMG:style_emoticons/default/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?
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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował zegarek84 17.09.2010, 00:46:18
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 19:27