Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]addEventListener funckja z parametrem
Forum PHP.pl > Forum > Przedszkole
neo1986kk
Witam, pomogliście mi użyć addEventListener i jestem za to bardzo wdzięczny, ale mam z tym jeszcze jeden problem ponieważ chciałbym wysłać ajaxem dane

funkcja save(dane)
{
// i tutaj wysylanie ajaxem
}

ale o co chodzi

addEventListener daje nam możliwość wpisania jedynie:
  1. addEventListener('click',save, false);


no to nie wszystko bo do swojego buttona podczepiam
  1. <button onclick="save('parametr1','parametr2');">aaaa</button>
  2.  


i działa jak należy...

więc w czym problem, a no problem w tym że jednym z parametrów musi być

  1. document.getElementById('textarea').value;


przecież tego nie podczepię (chyba?) pod buttona, a już napewno nie do
  1. addEventListener('click',save, false);


Chyba że coś źle robię...
askone
A nie możesz sobie pobrać zawartości tego textarea już wewnątrz funkcji save??
neo1986kk
no niby moge ale chciałem zrobic save(response, value)
zeby mieć już do kilku zdarzen, ale jak sie nie da to musze to w ten sposób zrobić
everth
Możesz użyć anonimowej funkcji (czy jak się to tam zwie)
[JAVASCRIPT] pobierz, plaintext
  1. addEventListener('click',function() {save(response,value);}, false);
[JAVASCRIPT] pobierz, plaintext
askone
Cytat(everth @ 21.02.2011, 14:09:57 ) *
Możesz użyć anonimowej funkcji (czy jak się to tam zwie)
[JAVASCRIPT] pobierz, plaintext
  1. addEventListener('click',function() {save(response,value);}, false);
[JAVASCRIPT] pobierz, plaintext


Rozwiązanie powyższe zadziała, ale musisz pamiętać o:
Cytat
Memory issues
[JAVASCRIPT] pobierz, plaintext
  1. document.addEventListener("load", function(event) { obj.func(event); }, false);
[JAVASCRIPT] pobierz, plaintext

Calling addEventListener to an anonymous function creates a new listener each time. Calling removeEventListener to an anonymous function has no effect. An anonymous function creates a unique object each time is is called, it is not a reference to an existing object though it may call one. When adding an event listener in this manner be sure it is added only once, it is permanent (can not be removed) until the object it was added to is destroyed.


Pozdrawiam
neo1986kk
  1. document.addEventListener("load", function(event) { obj.func(event); }, false);


zrobiłem to w sposób jaki pokazał mi everth i działa, rouzmiem że tu chodzi o inną ideę, kliknąłem pomógł, ale chciiałbym jednak żeby ktoś mi powiedział co autor miał na myśli, bo z opisu wynika że za każdym razem funkcja tworzy nowy listener, który może ale nie musi się odwoływać do obiektu tak? cos w tym stylu?
askone
Mówiąc "po naszemu" to sprawa dotyczy sytuacji o jakiej właśni Ty pisałeś. Mianowicie chcesz podpinać swoją funkcję "save" do kilku obiektów na stronie. Gdybyś podpinał je bezpośrednio to wszystkie zdarzenia odwoływałyby się do jednego egzemplarza tej funkcji. Natomiast gdy w wywołaniu .addEventListener korzystasz z funkcji anonimowej to z każdym przypisaniem tworzysz nowy obiekt w pamięci przeglądarki. Dlatego takie rozwiązanie nie jest polecane do wielokrotnego zastosowania...

Pozdrawiam
neo1986kk
czyli za każdym razem muszę użyć removeListener...
askone
Nie do końca gdyż
Cytat
Calling removeEventListener to an anonymous function has no effect.

Niestety taki to już urok funkcji anonimowych.


Z tego co pamiętam funkcja anonimowa jest niszczona po przeładowaniu strony lub też po zamknięciu przeglądarki dopiero - tutaj zaznaczę iż nie jestem aż takim ekspertem w js aby być tego pewnym na 100% wink.gif
erix
Cytat
Nie do końca gdyż

A nie wystarczyło wtedy tej funkcji przypisać do zmiennej i zmienną podstawiać jako argument?

Cytat
lub też po zamknięciu przeglądarki dopiero - tutaj zaznaczę iż nie jestem aż takim ekspertem w js aby być tego pewnym na 100%

Nie sądzę; same molochy w stylu facebooka by zeżarły całą dostępną pamięć. biggrin.gif
askone
Cytat(erix @ 21.02.2011, 15:09:51 ) *
A nie wystarczyło wtedy tej funkcji przypisać do zmiennej i zmienną podstawiać jako argument?


Według mnie to by nic nie zmieniło bo dodatkowa pamięć byłaby nadal alokowana. Jedyną zmianą byłby fakt iż w programie byłaby zmienna która by na tę funkcję wskazywała. No chyba, że dałoby się wtedy poprzez tę zmienną wywołać .removeEventListener i usunąć obiekt funkcji...
everth
Ewentualnie dopisać własnego zarządcę - obiekt który który będzie wywoływany w addEventListener i na podstawie Event.target wywoływał przypisane do obiektu zdarzenia. Przeglądam źródła jQuery i tam chyba jest to w ten sposób rozwiązane.
neo1986kk
za wysokie progi...
zegarek84
Cytat(askone @ 21.02.2011, 15:14:34 ) *
Według mnie to by nic nie zmieniło bo dodatkowa pamięć byłaby nadal alokowana. Jedyną zmianą byłby fakt iż w programie byłaby zmienna która by na tę funkcję wskazywała. No chyba, że dałoby się wtedy poprzez tę zmienną wywołać .removeEventListener i usunąć obiekt funkcji...

[JAVASCRIPT] pobierz, plaintext
  1. var zmienna = function(){
  2. // ciało funkcji ze zmiennymi będącymi w jej zasięgu
  3. }, i;
  4. for(i = 0; i<100; ++i) arrayElements[i].addEventListener("click", zmienna, false);
[JAVASCRIPT] pobierz, plaintext

tym sposobem podepnie się jedną funkcję a nie 100 anonimowych - przypisując gdzieś referencję do funkcji ona już nie do końca jest anonimowa... poza tym należy pamiętać, że w IE to jest bodajże atachEvent czy jakoś tak - mało istotne...

do przykładu powyżej jeśli wszystkie elementy to np. komórki tabeli optymalniej by było podpiąć listenera pod samą tabelę jednego i sprawdzać co zostało kliknięte w tej tabeli... jeszcze jeśli chcemy być pewni, że zmienne z danego kontekstu nie zostaną usunięte i ich nie będzie lub inne będą a miały być te same można stosować potworki w stylu:
zmienna = (function(arg1, arg2...){return function(){...}})(arg1, arg2...);
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.