Używam jednego () obsługi zdarzeń, która powinna (jestem doprowadzony do uwierzenia) Ogień kod raz na kliknięcie, ale następnie nie wykonuję go ponownie po tym kliknięcie. Tutaj sprawdza, czy klasa jest widoczna i dodaje 10 do zmiennej, jeśli jest. Problem polega jednak na nim, mogę kliknąć na to wiele razy i utrzymuje 10 do zmiennej.

Czy robię coś źle?

$('.cme-confirm').one( "click", function(event) {

    if ($(".this-correct")[0]){
       case1Score = case1Score + 10;
    }
    event.stopImmediatePropagation();
    console.log(case1Score);
});

Z góry dziękuję.

Edytować

Dzięki Richard Cane, który wyjaśnił, że to dlatego, że mam więcej niż jeden element z nazwą klasy. Dlatego wystrzeliwuje więcej niż raz. Zamierzałem dać każdemu elementowi wyjątkową klasę, jednak Ruben Seratte naprawił mój problem poniżej. Wielkie dzięki za twoją pomoc.

2
user-a5567ffg 13 sierpień 2014, 20:05

3 odpowiedzi

Najlepsza odpowiedź

Teraz, dlaczego teraz, dlaczego się dzieje, zamiast podawać unikalne klasy elementów, możesz rozwiązać problem, jeśli przestaniesz słuchać wydarzenia po wystrzeleniu:

$('.cme-confirm').on( "click.myId", function(event) {
    jQuery('.cme-confirm').off("click.myId");

    if ($(".this-correct")[0]){
       case1Score = case1Score + 10;
    }
    event.stopImmediatePropagation();
    console.log(case1Score);
});
3
Ruben Serrate 13 sierpień 2014, 16:37

Dla jasności komentarzy:

Problem polega na tym, że () będzie wykonywać raz na każdy element klasy, jeśli selektor zawiera tylko klasę. Jest to opisane w API jQuery:

.One (zdarzenia [, dane], Handler)
Opis: Dołącz obsługę do zdarzenia dla elementów. Handler jest wykonywany w większości raz na element na typ zdarzenia.

W szczególności, jeśli masz 10 elementów na stronie tej samej klasy, .o () będzie wykonać 10 razy.

2
Inspector Squirrel 13 sierpień 2014, 16:20

Jeśli chcesz uruchomić funkcję, możesz spróbować czegoś takiego, nie jest to idealne, ale powinno działać:

Edytuj - Dodano skrzypce


http://jsfiddle.net/ctheels/p8u6apbs/


var runOnce = true;

$('.cme-confirm').on("click", function(event) {
    if(runOnce){
        if ($(".this-correct")[0]){
            case1Score = case1Score + 10;
        }
        event.stopImmediatePropagation();
        console.log(case1Score);
        runOnce = false;
    }
});

Z jQuery's .one ():

Obecnie Twoja funkcja działa raz na każdym elemencie klasowym. Więc jeśli masz 10 elementów o tej samej klasie, uruchomi się raz, dziesięć razy (raz na każdym elemencie). Więc innymi słowy:

{1} {2} {3}

Klikam {1}, {1} nie można ponownie kliknąć, funkcja nie uruchomi się

2
ctwheels 13 sierpień 2014, 16:31