Autor Zpráva
mimochodec
Profil
Mám formulář se submitem a nechci, aby se odesílal hned, ale až po nějaké kontrole.
Takže:

<form class="forms" name="regform" id="regform" action="index.php" method="post" onsubmit='return verifyreg()'>

a v JS potom po provedení nějakých kontrol

    if (ret==0) {
      alert ("xx");
      document.regform.submit();
    }

alert proběhne, ale submit nikoliv. Co dělám špatně?
Dan Charousek
Profil
mimochodec:
Stačí vrátit true:

    if (ret==0) {
      alert ("xx");
      return true;
    }
juriad
Profil
Zrušení odesílání formuláře
mimochodec
Profil
Pardon, já už to řeším poněkolikáté, už si připadám jako idiot. Popíšu to celé.

function verifyreg() {

  var login=document.getElementById("reglogin").value;
  var pw1=document.getElementById("regpass").value;
  var pw2=document.getElementById("regpass2").value;
  var err="";

  if (login=="") {
    err = err + "Email musí být zadaný\n";
  };  

  if (pw1=="") {
    err = err + "Heslo musí být zadané\n";
  };  

  if (pw1!=pw2) {
    err = err + "Hesla se musí shodovat\n";
  };  


  if (err) {
    alert (err);
    return false;
  } else {

    var addr="ax.php?verifyeml="+login; 
   
    xmlhttp=GetXmlHttpObject();
    if (xmlhttp==null) {
      alert ("Browser does not support HTTP Request");
      return;
    }
   
    xmlhttp.onreadystatechange=verifyregdone;
    xmlhttp.open("GET",addr,true);
    xmlhttp.send(null);
  
    return false;
  }

};



 
function verifyregdone() {
 
  if (xmlhttp.readyState==4) {
    var ret = (xmlhttp.responseText).trim();

    if (ret==0) {
      alert ("xx");
      document.regform.submit();
      return true;
    } else {
      return false;
    }
  
  } else {
 
  }
}

Ani takhle to nefunguje.
Na té stránce co píše juriad, jsem byl a myslím, že to není úplně můj případ, protože formulář provede nějakou JS funkci, ta ale nevrátí true, protože volá ajax a až jeho výsledek mě zajímá. Myslím, že aby to fungovalo, muselo by se to true prokousat až do toho formu. To by předpokládám šlo z toho verifyreg, z verifyregdone nikoliv.
_es
Profil
mimochodec:
Vôbec nepoužívaj metódu submit formulára. Ak sa formulár odoslať nemá, tak z funkcie verifyreg vráť false, ak sa odoslať má, tak vráť z funkcie true.
Dan Charousek
Profil
_es:
To přeci nemůže, když (ne)odeslání formuláře je závislé na ajaxovém volání.
juriad
Profil
mimochodec:
V době, kdy se provádí verifyregdone už dávno verifyreg skončila. Z callbacku nemá cenu něco vracet returnem. V tvém případě chceš vždy z funkce verifyreg vždy vrátit false (což už děláš) a ve funkci verifyregdone formulář odeslat manuálně (což už děláš).
To, co máš by mělo fungovat. Ten alert ti to ukáže? Jak máš pojmenované odesílací tlačítko? Pokud se jmenuje submit, tak ho přejmenuj, dochází ti ke kolizi s názvem metody formuláře.

Nějak nechápu, k čemu je dvojí odeslání. Přece samotný index.php může při úspěchu data zpracovat a přesměrovat a při neúspěchu vrátí chybovou hlášku v takové podobě, že ji pak dokážeš v JS přiřadit konkrétnímu políčku ve formuáři.
Chamurappi
Profil
Reaguji na _es:
Ak sa formulár odoslať nemá, tak z funkcie verifyreg vráť false
Jestli správně rozumím mimochodcovu kódu v příspěvku #4, tak se při stisku odesílacího tlačítka nikdy odeslat nemá. Provede pár kontrol v JS a pokud je vše v pořádku, ještě nechá ověřit jedno z políček AJAXem… a teprve když AJAX potvrdí, že je vše v pořádku, chce vyvolat odeslání. V rámci tohoto postupu tedy je na místě volat metodu submit.

Otázka je, jestli sám tento postup je vhodný.


Reaguji na mimochodce:
Máš dobrý důvod, proč nechceš serverovou kontrolu vstupu provést až při normálním odeslání? Vlastně posíláš serveru hodnoty a ptáš se ho, jestli mu můžeš poslat hodnoty… není to trochu krkolomné?
Chceš-li uživateli opravdu zpříjemnit vyplňování (nezadaného) přihlašovacího jména, kontroluj stav obsazenosti průběžně při vyplňování, ne až při odeslání.
Tak či tak by mě ale zajímalo, čím to je, že ti uvedený kód nefunguje, chybu v něm na první pohled nevidím.


Reaguji na juriada:
Pokud se jmenuje submit, tak ho přejmenuj
Á, to zní jako dobrý tip. Odkážu na podrobnější popis.
mimochodec
Profil
Chamurappi:
Jestli správně rozumím mimochodcovu kódu v příspěvku #4, tak se při stisku odesílacího tlačítka nikdy odeslat nemá. Provede pár kontrol v JS a pokud je vše v pořádku, ještě nechá ověřit jedno z políček AJAXem… a teprve když AJAX potvrdí, že je vše v pořádku, chce vyvolat odeslání. V rámci tohoto postupu tedy je na místě volat metodu submit.

Přesně tak.

Reaguji na mimochodce:
Máš dobrý důvod, proč nechceš serverovou kontrolu vstupu provést až při normálním odeslání? Vlastně posíláš serveru hodnoty a ptáš se ho, jestli mu můžeš poslat hodnoty… není to trochu krkolomné?
Chceš-li uživateli opravdu zpříjemnit vyplňování (nezadaného) přihlašovacího jména, kontroluj stav obsazenosti průběžně při vyplňování, ne až při odeslání.

Mně naopak průběžné posílání připadá jako zbytečná zátěž pro server (malá, ale zbytečná) a možná i pro uživatele. Ještě mě napadlo, že bych to mohl ověřit už v momentu, kdy ten input ztratí fokus. Můžu to zkusit.

Jinak k tomu postupu. Jde mi jen o uživatelský komfort. Chci neumožnit odeslání formu, který nesplňuje podmínky. Část chytí JS, na část používám ajax. Jestli byste to řešili jinak, zkuste naznačit jak, dík. Chamurappi už naznačil průběžnou kontrolu během psaní.


juriad:
To, co máš by mělo fungovat. Ten alert ti to ukáže?

Ano, alert "xx" proběhne.
Ten submit jsem přejmenoval, nezabralo to.

Prozatím díky za rady, možná tam přehlížím nějakou banalitu, dám zítra vědět.
mimochodec
Profil
Tak mám vyřešeno.
Nejdřím tam byla chyba v tom name="submit". V mezičase, než si toho juriad všiml, jsem si ten form zkopíroval a udělal z něj druhý, který bude sloužit pro reset hesla. Když jsem v tom prvním potom name změnil, druhý zůstal beze změny a skript pracoval s ním. Takže už to funguje, děkuju. Udělám to ale jinak. Přesvědčili jste mě, že ajax v tomto případě nemá smysl. Případů, kdy by se majitel jednoho a téhož mailu pokusil omylem registrovat dvakrát, bude minimum a není důvod ho rozmazlovat ajaxovým ověřením. Naopak konkrétně na tomto webu lze očekávat ve zvýšené míře snahu škodit, což bude obnášet i pokusy zjistit, jestli majitel toho nebo onoho mailu je tady registrován jako uživatel. Těm pokusům nezabráním, ale nemusím jim zrovna vycházet vstříc.
Dan Charousek
Profil
mimochodec:
Nikdo se tě nesnažil přesvědčit, že AJAX nemá cenu. Nebo alepsoň to nebylo prioritní. Hlavní myšlenka tkvěla v tom, co psal juriad:
Nějak nechápu, k čemu je dvojí odeslání. Přece samotný index.php může při úspěchu data zpracovat a přesměrovat a při neúspěchu vrátí chybovou hlášku v takové podobě, že ji pak dokážeš v JS přiřadit konkrétnímu políčku ve formuáři.

Jde o to, že jednou odešleš data na server (tedy jen to jméno - zbytečně) a potom (jestliže jméno není použito) je na server odesíláš znovu k uložení. To co se ti juriad sanžil říct je to, že to můžeš vše udělat v rámci toho jednoho ajaxového volání a na základě toho jestli to proběhlo v pořádku nebo neproběhlo - kvůli obsazenemé jménu vrátit nějaké info tomu callbecku a to zpracovat.

Zkusím nastínit situaci:

formulář:
<form onsubmit="return sendForm(this);">

    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" name="signUserIn" value="Registrovat se">

</form>

sendForm:

    sendForm(form) {
    
        var username = form.username.value;
        var password = form.password.value;

        // nějaká validace
        
        // ajaxový požadavek na server - !ale se všemi daty!
        /*
            ...
            ...
        */
        
        xmlhttp.onreadystatechange = function() {
        
            // zde zpracuješ požadavek a podle nějakého kódu třeba v JSONu oznámíš, že je jménu už zadané
            if(/* v pořádku */)
                // document.getElementById("infoBox").innerHTML = "Byl jste úspěšně zaregistrován";
            else
              // document.getElementById("infoBox").innerHTML = "Uživatelské jméno je již zabrané."
        
        };
        
    
    }

Při tom tvém (jen) kontrolovacím požadavku pošli všechna data. Odpověď může být JSON, XML, plaintext jak si to navrhneš.

PHP soubor, který to zpracovává pak můžeš použít pro ajaxové volání i pro nejavascriptové uživatele:

registruj.php

    if(isset($_GET['ajax'])) { // parametr ajax si můžeš přidat v javascriptovém volání tohoto souboru
    
    
        nejdřív zjistíš jestli je jméno zabrané:
        if(usernameExists($_GET['username'])) {
            echo json_encode([
                "status" => "error",
                "error_code" => "name_taken"
                "message" => "Username already taken"
            ]); // tento JSON si v javascriptu zpracuješ, zjistíš, že jméno existuje a informuješ o tom uživatele
            exit();
        }
        
        // jinak uživatele registruješ a dáš vědět hláškou o úspěšné registraci
        
        echo json_encode([
            "status" => "ok",
            "message" => "U've been signed in successfully"
        ]);
    
    
    } else {
    
        // jinak zpracuj klasicky jako když se formulář odeslal neajaxově
    
    }

Jedná se pouze o koncept řešení, je dost možné, že jsem tam nasekal dost chyb. Ještě podotknu, že registrační formulář by se měl odesílat POSTem, ale pro jednoduchost jsem tam nafrkal GET.
mimochodec
Profil
Dan Charousek: díky.
Já ještě dodám, že jsem se chtěl mj. vyhnout nutnosti dělat pro zobrazení chybové hlášky další stránku, resp. na stránce s formulářem zobrazovat další hlášku (kromě těch chyb, které vyhodnotím a upozorním na ně javascriptem hned). Dodatečně mi došlo, že tomu se stejně nevyhnu, protože na JS se nemůžu spolehnout a existenci onoho mailu musím ověřit nezávisle na něm.
Myšlenka, že bych tím ajaxem v případě úspěchu rovnou registroval, mě nenapadla a na první pohled se mi to docela líbí. Ještě se zamyslím, jestli v tom není nějaké riziko. Napadá mě jen odstavený JS, ale ten asi zohledňovat nebudu.
Dan Charousek
Profil
mimochodec:
Napadá mě jen odstavený JS, ale ten asi zohledňovat nebudu.

Jestliže má uživatel vypnutý javascript, tak se formulář odešle klasicky. To soubor registruj.php zouhledňuje - na řádcích 22 - 25 si data zpracuj jakoby žádný AJAX nebyl. Samozřejmě mu musíš nastavit atribut action na soubor registruj.php (tomu formulář).
Chamurappi
Profil
Reaguji na Dana Charouska:
můžeš vše udělat v rámci toho jednoho ajaxového volání
Já bych na to tedy šel obráceně – nechal bych formulář odeslat vždy. Klidně třeba do skrytého rámu (<form>target).
Prohlížeče při standardním odeslání ochotněji nabízejí uložení hesla, ukládají hodnoty pro našeptání apod.

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: