Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z dodaniem zdarzeń w skrypcie JS
Forum PHP.pl > Forum > Po stronie przeglądarki
sebap123
Witam,

Mam pewien problem ze skryptem który aktualnie piszę. Posiadam takie oto dwie "uniwersalne funkcje:
Kod
function addEventSimple(obj,evt,fn) {
    if (obj.addEventListener)
        obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
        obj.attachEvent('on'+evt,fn);
}

function removeEventSimple(obj,evt,fn) {
    if (obj.removeEventListener)
        obj.removeEventListener(evt,fn,false);
    else if (obj.detachEvent)
        obj.detachEvent('on'+evt,fn);

Jak widać, jedna dodaje zdarzenie w zależności od tego czy przeglądarka obsługuje on coś tam czy bez on. Druga to usuwa.
I właśnie z tymi funkcjami, a raczej z ich wykorzystaniem mam problem. Chodzi o to, że w niektórych momentach gdy je dodam do kodu to nie działają (albo nie zupełnie, albo w ogóle).
Oto parę przykładów - nie wklejam całego kodu bo jest on dosyć długi i nie chcę zaśmiecać postu):
Kod
//1
//addEventSimple(el,'mousedown',DD.startDragMouse);
                el.onmousedown = DD.startDragMouse;
//2
var links = el.getElementsByTagName('a');
        var keyLink = links[links.length-1];
        keyLink.relatedElement = el;
        addEventSimple(keyLink,'click',DD.startDragKeys);
//3
var markerLink = links[links.length-2];
                markerLink.relatedElement = element;
                addEventSimple(markerLink,'click',DD.editMarkers);
//4
removeEventSimple(markerLink,'cick',DD.editMarkers);
addEventSimple(markerLink,'click',DD.endEditMarkers);
//5
removeEventSimple(markerLink,'click',DD.endEditMarkers);
addEventSimple(markerLink,'click',DD.editMarkers);
DD.deleteMarkers();

To jest parę przykładów. W takiej kolejności w jakiej zostały przedstawione występują w skrypcie, jednak najczęściej nie w tych samych metodach. Teraz opiszę każdy z elementów, bo tego tutaj brakuje:
1. W momencie gdy używam opcji, która jest aktualnie skomentowana wtedy nie działa mi jeden ze styli obiektu - wygląd kursora. Jeśli użyję wersji która jest aktualnie używam wszystko jest ok.
2. Jest to link na obiekcie, który uruchamia poruszanie klawiaturą - ta opcja działa (w obu przypadkach).
3. Również dodaję do obiektu link który uruchamia opcje związana z markerami - działają obie opcje *ten fragment jest bezpośrednio po zawartości 2)
4. Doszedłem do wniosku, że najpierw muszę usnąć jedną akcję, żeby dodać drugą (w sumie jest to logiczne) - nie jestem jednak pewien czy przypadkiem nie tutaj jest błąd gdzieś, bo bo wszystko niby działa, ale...
5. W tym fragmencie już nie usuwa markerów (czyli nie uruchamia całej funkcji deleteMarkers - co gorsza nie wyświetla mi żadnego błędu): funkcja ta wygląda tak:
Kod
deleteMarkers: function() {
            var marker;
            for(i=1;i<=8;i++)
            {
                marker = document.getElementById('m'+i+DD.El.id);
                if(marker != null)
                {
                    DD.El.removeChild(marker);
                }
            }
        },

Jeśli natomiast zrobię coś takiego:
Kod
deleteMarkers: function() {
            var marker;
            for(i=1;i<=8;i++)
            {
                marker = document.getElementById('m'+i+DD.El.id);
                if(marker != null)
                {
                    info.innerHTML = marker;
                }
            }
        },

Zgodnie z założeniem wyświetla mi ostatni marker.
Ma ktoś może jakiś pomysł co robię źle w tym skrypcie? Dodam tylko, że to nie są wszystkie przypadki, ale wydaje mi się, że jak rozwiążę problem tego, że funkcja raz działa a raz nie to resztę już zrobię sam.
kamil4u
Te funkcje "addEventListener" i "attachEvent" dodają zdarzenie, a nie nadpisują - dlatego czasem musisz usunąć zdarzenie.

Zobacz co pokazuje konsola błędów. Te funkcje działają zawsze, więc raczej gdzieś Ty popełniłeś błąd. Jak możesz to daj tu( http://jsfiddle.net/ ) proste przykłady, w których coś Ci nie działa - myślę, że wtedy łatwiej będzie Tobie pomóc( na krótkim kodzie )
sebap123
Ok, dzięki za nakierowanie. Tak właśnie coś przeczuwałem, że może gdzieś "zakrywam" jakieś zdarzenie. Popróbuję na kodzie który mam, bo aktualnie może być trudno go rozbić, a jak znowu zabraknie mi pomysłów to zrobię tak jak mówisz i zobaczę co się dzieje.

Cytat(sebap123 @ 22.09.2011, 12:54:24 ) *
(...)
Kod
deleteMarkers: function() {
            var marker;
            for(i=1;i<=8;i++)
            {
                marker = document.getElementById('m'+i+DD.El.id);
                if(marker != null)
                {
                    DD.El.removeChild(marker);
                }
            }
        },

Jeśli natomiast zrobię coś takiego:
Kod
deleteMarkers: function() {
            var marker;
            for(i=1;i<=8;i++)
            {
                marker = document.getElementById('m'+i+DD.El.id);
                if(marker != null)
                {
                    info.innerHTML = marker;
                }
            }
        },

Zgodnie z założeniem wyświetla mi ostatni marker.(...)

Mam jeszcze pytanie o jedną rzecz związaną z tym problemem. Wydaje mi się, że musi ona mieć coś wspólnego z resztą, tyle tylko, że nie wiem jakim cudem. Chodzi mi o opisanym wyżej przypadek.Jaki może być powód czegoś takiego?
kamil4u
Nie wiem co to może być...
Zobacz konsolę błędów i/lub daj jakiś przykład live.
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.