Autor Zpráva
jval
Profil
Zdravím mám funkci
function check_times() {
        $('.checked').html('');
        var nextdays = $('.nextdays_row :checkbox:checked').map(function () {
            return this.value;
        }).get();
        $('#times :checkbox:checked').each(function () {
            $.ajax({
                type: "GET",
                url: "ajax.php",
                data: "action=check_times&time=" + $(this).val() + "&repeats=" + $('#repeats').val() + "&repeat_type=" + $('#repeat_type').val() + "&nextdays=" + nextdays.toString()
            }).done(function (msg) {
                $('.checked').append(msg);
            });
        });
    }
která kontroluje zaškrtané časy jestli jsou volné.
Funkci spouštím při změně checkboxů.
Pak ji ale potřebuji spustit ještě při odeslání formu aby se zamezilo tomu, že někdo zaškrtá, pak si dá kafe a mezitím někdo některý čas obsadí.
Když ovšem použiji:
        $('#submit').click(function () {
            check_times();
            if ($('.checked').html().length > 0) {
                alert('Chyba: některé časy jsou již obsazené');
            }
            else {
                $('#createform').submit();
            }
        });
Tak skript nepočká na dokončení check_times() a form se odešle.
Mohu nějak skriptu říct aby na dokončení funce počkal?

Děkuji
Alphard
Profil
Metoda ajax() má parametr async, kterým můžete vypnout asynchronní průběh, ale tím zmrazíte prohlížeč i pro jiné akce.
Alternativně můžete formulář odeslat až po úspěšném ověření v callbacku, a v každém případě by mělo následovat ošetření na serveru, kdyby třeba nefungoval javascript.
_es
Profil
jval:
Tak skript nepočká na dokončení check_times() a form se odešle.
To nie je pravda, formulár sa odošle až po jej „dokončení“. Problém je v tom, že funkcia v argumente metódy done je zavolaná až po vrátení odpovede zo servera z URL "ajax.php" a to môže aj veľmi dlho potom, čo funkcia check_times skončí. Takže ak „Funkci spouštím při změně checkboxů.“, tak ani v tom prípade nemáš zaručené že 12. riadok prebehne. Musíš jednoducho s tou asynchrónnosťou rátať.
jval
Profil
Děkuji všem. Zatím to s async funguje, tak uvidíme. Je to jen do interního systému s proškoleným člověkem. Ošetření na straně serveru po odeslání je samozřejmost.

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