Autor Zpráva
Milan1236000
Profil
Ahoj,

už 2 hodiny zkoumám a různě zkouším, proč mi nefunguje naprosto banální kontola AJAXEM při kliknutí na submit a fakt to nechápu, kde může být chyba... Mám následující kus kódu:

$(document).ready(function () {
  $("#report_bug_form").on('submit', function (e) {
     var allowSubmit = checkBeforeSubmit();
     alert("submit - after function: " + allowSubmit);
  
     //return allowSubmit;
     return false;
  });
});

function checkBeforeSubmit() {
    var allowSubmit = true;
    var request = $.ajax({
        method : "GET",
        data : {eco : $("#eco").val()},
        dataType : "text",
        url : "plugin.php?page=ECOReport/checkECOBeforeSubmit",
        context : document.body
    });

    alert("value: " + $("#eco").val());
    alert("allow before: " + allowSubmit);

    request.done(function (msg) {
        alert("test1: " + msg);
        if (msg == "false") { // found duplication
            allowSubmit = false;
            alert("test2");
        }
    });

    alert("allow after: " + allowSubmit);

    return allowSubmit;
}

Když si přímo otevřu samostatnou URL adresu s parametrem "eco", co se přesně posílá AJAXEM, tak se vždy správně vrátí textový řetězec (ano, textový) true, nebo false. True se vrátí, když ještě hodnota v databázi neexistuje a false, když existuje.

Simuluju následující - otevřu si stránku s formulářem, kde je JS soubor s AJAXEM a odešlu formulář (zatím tam mám schválně fixně return false, aby se neodeslal a kontroluju, jestli se posílají/získávají správné hodnoty). Po odeslání mě jednak zaráží pořadí zobrazovaných hlášek:
value: 690
allow before: true
allow after: true
submit - after function: true
test1: true

A při ruční změně v databázi (simulace toho, že hodnotu formulářem odešle někdo třeba vteřinu přede mnou) to vypadá, že se pořád odesílá AJAX s tou původní hodnotou, protože se pořád vrací řetězec true i přes to, že se při přímém otevření API v URL zobrazuje správně řetězec "false".

Zapomněl jsem někde něco?

Díky.
Kajman
Profil
Funkce v request.done se nevykoná hned. Jen se nastaví, že se má vykonat, až přijdou data zpět.

Další řádky se vykonají bez čekání (pokud je nastavené asynchronní, což je to A z AJAXu).

Jsou dvě možnosti - horší - že nastavíte při volání metody ajax, že se má použí synchronní volání, tedy se prohlížeč zasekne, než se odpověď vrátí. Nebo odeslání formuláře či chybovou hlášku vypíše až funkce v request.done a necháte u submitu return false, aby se neposlal hned.
Milan1236000
Profil
Paráda, druhý způsob funguje skvěle. Díky moc. :)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0