• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JS za dużo akcji

Object Storage Arubacloud
0 głosów
175 wizyt
pytanie zadane 28 sierpnia 2019 w JavaScript przez michal_php Stary wyjadacz (13,700 p.)

Cześć 

Mam pewien problem z kodem js. Stworzyłem własne okno confirm ale mam pewien z nim problem.Otóż po pierwszym kliknięciu wszystko zachowuje się normalnie , ale po drugim kliknięciu wykonują się aż 4 na raz zapytania do serwera.Problem leży z moim oknem confirm a Mianowice ze zdarzeniem potwierdzanie.Tylko nie za bardzo wiem jak to naprawić ?

js

function deletSubstance(val,name,url) {
    let change = document.getElementById("importantinfo");
    let status = document.getElementById("accesRemove");
    console.log(url);
    if(status !== true){
        document.getElementById("NameToDelete").innerHTML = name;
        change.style.display = "block";
    }
    status.addEventListener('click', function() {
        viewComunicat();
        $(document).ready(function(){
            $.ajax({
                url: url,
                type: 'POST',
                success: function (data) {
                    if(data != null){
                        change.style.display = "block";
                        document.getElementById("SubstancjonExist").innerHTML = data;
                    }else {
                        $('#'+val+'').parent().parent().remove();
                    }
                },
            });
        });
    }, true);
}

okno confirm

<div id="importantinfo" style="display: none" class='dominationInfo'>
    <div>
        <div>
            <i onclick="viewComunicat()" class="icon-cancel-1 ikonaDelete"></i>
            <div id="SubstancjonExist">
                <h4>Czy chcesz usunąć: <b id="NameToDelete"></b> </h4>
                <div class="importantinfo__button">
                    <div class="importantinfo__button--danger">
                        <button id="accesRemove" class="btn btn-danger btn">Usuń</button>
                    </div>
                    <div class="importantinfo__button--primary">
                        <button onclick="viewComunicat()" class="btn btn-primary btn">Powrót</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

Z góry dziękuje za podpowiedź 

1 odpowiedź

0 głosów
odpowiedź 28 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)
Tak na oko: jeśli wielokrotnie wywołujesz deleteSubstance, to wielokrotnie wywołuje się status.addEventListener('click' - tak więc przycisk ma przypisanych wiele identycznych handlerów, więc wszystkie się wywołają.

Albo dodaj event handler raz przy otwieraniu strony, albo czyść handlery przy każdym pokazaniu modala (zakładam że to modal).

BTW, strasznie łamany ten angielsko-polski :(

I ten document.ready jest tam zupełnie niepotrzebny.
komentarz 28 sierpnia 2019 przez michal_php Stary wyjadacz (13,700 p.)

A jak mogę dodać czyszczenie do

addEventListener

łamany ten angielsko-polski ? masz na myśli ,że gdzie w niektórych miejscach są polskie słowa,czy błędy ?

komentarz 28 sierpnia 2019 przez michal_php Stary wyjadacz (13,700 p.)

zrobiłem coś takiego , i za drugim kliknięciem już nie wysyła 4 ,ale 2 zapytania 

let change = document.getElementById("importantinfo");
    let status = document.getElementById("accesRemove");
    console.log(url);
    if(status !== true){
        document.getElementById("NameToDelete").innerHTML = name;
        change.style.display = "block";
    }
    status.addEventListener('click', function() {
        viewComunicat();
        $('#'+val+'').parent().parent().remove();
            $.ajax({
                url: url,
                type: 'POST',
                success: function (data) {
                    if(data != null){
                        change.style.display = "block";
                        document.getElementById("SubstancjonExist").innerHTML = data;
                    }else {
                        status.removeEventListener('click',function () {},false);
                    }
                },
            });
    }, true);

 

komentarz 28 sierpnia 2019 przez Kamil Łydka Stary wyjadacz (13,600 p.)

Czyść zawsze Listener, choć osobiście szedłbym w stronę rozwiązania: 

dodaj event handler raz przy otwieraniu strony

komentarz 28 sierpnia 2019 przez michal_php Stary wyjadacz (13,700 p.)
A jak mogę wyczyścić tego linsera ? , event Handler czyli jak ?
komentarz 28 sierpnia 2019 przez Kamil Łydka Stary wyjadacz (13,600 p.)

Używasz funkcji anonimowej, więc trochę słabo (chyba że sztuczkami). Albo 'wyeksportuj' tą funkcję gdzieś na zewnątrz i potem podawaj jej tylko nazwę albo prostu nadaj jej nazwę lokalnie tak: 


    status.addEventListener('click', function _jakasNazwa() {
   

i wtedy wręcz wewnątrz tej funkcji możesz wrzucić:

status.removeEventListener("click", _jakasNazwa, true);

 

Podobne pytania

0 głosów
0 odpowiedzi 125 wizyt
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 10 grudnia 2019 w JavaScript przez michal_php Stary wyjadacz (13,700 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...