To doprowadza mnie do szału ... Mam pętlę, która dodaje detektor zdarzeń do obiektu SVG. Obiekt jest, na potrzeby argumentacji, małym kółkiem i muszę dodać zdarzenia mouseover i mouseout dla każdego z 10 okręgów.Nie można przekazać zdarzenia do addEventListener: problem zamknięcia
Mój pierwszy problem to standardowa rzecz zamknięcia - ponieważ wszystkie słuchacze są dodawane w tej samej pętli, wszystkie widzą tę samą nieprawidłową wartość zmiennej pętli. Mogę to naprawić, jak sądzę, ale drugim problemem jest to, że muszę przekazać "wydarzenie" słuchaczom i nie mogę znaleźć żadnego sposobu, aby rozwiązać oba te problemy jednocześnie.
Próbowałem różne wersje tego:
for(month = 0; month < nMonths; month++) {
...
shape.addEventListener(
"mouseover",
(function(event, index) { popup_on(event, foo, index); })(event, month),
false);
group.appendChild(shape);
}
Ta szczególna wersja daje mi „nie jest zdefiniowane zdarzenie”. popup_on
to prawdziwy program obsługi, który musi uzyskać event
i aktualną wartość month
. Jakiś pomysł, jak powinienem to robić? Dzięki.
Niestety być tak głupi, ale gdzie właściwie umieściłem tę funkcję? "kształt" jest tworzony w pętli, może 10 lub 20 razy, a każde nowe wystąpienie "kształtu" (od "createElementNS") musi mieć dołączony do niego przewodnik. Więc nie wydaje się, że gdziekolwiek mogę umieścić tę anonimową funkcję, gdzie obecny "kształt" jest w kontekście? Biorąc to pod uwagę, nie muszę umieszczać wszystkiego w samym wywołaniu "addEventListener"? Co, jak sądzę, pozostawia problem, w jaki sposób mogę uzyskać zarówno "e", jak i "miesiąc" jako parametry ...? – EML
@ user785194 Myślę, że kod, który umieściłem powyżej, będzie działał poprawnie. Za każdym razem, gdy ponownie tworzy się kształt, wystarczy umieścić kod powyżej, aby dodać detektor zdarzeń do tej konkretnej instancji. –
Genialny - to się udało. Dzięki. – EML