Kako preprečiti dvojno pošiljanje obrazca z pomočjo Javascript-a (form submit)
Če želite preprečiti, da bi uporabnik dvakrat kliknil na obrazec lahko uporabimo Javascript. Problem lahko rešimo na dva (meni poznana) primera:
- onemogočimo gumb in sprožimo pošiljanje obrazca, ko uporabnik klikne na gumb
- onemogočimo gumb (ali več njih), ko uporabnik sproži pošiljanje obraza (z tipko enter ali z pritiskom na gumb)
Rešitev #1:
Z javascriptiom onemogočimo gumb (input) s katerim uporabnik sproži pošiljanje obrazca (form), ko ga uporabnik pritisne.
Primer preproste kode, ki onemogoči gumb za obrazec v katerem se nahaja (uporabimo referenco this).
-
<input value="Submit" onclick="this.disabled=true; this.form.submit();" type="submit" />
this.disabled=true=> onemogoči gumb na katerega je uporabnik kliknil (referecna this na gumb, ki ga je uporabnik kliknil)this.form.submit=> sproži pošiljanje obrazca v katerem se ta gumb nahaja. Če želimo zadevo še polepšati za uporabnika lahko gumbu dodamo novo vrednost
-
<input value="Submit" onclick="this.disabled=true; this.value='Prosimo počakajte ... '; this.form.submit();" type="submit" />
Rešitev #2:Problem pri prvi rešitvi je v tem, da z dogodkom onClick ne prestrežmo uporabnikov, ki dvakrat pritisnejo tipko enter (zadostovalo bi samo enkrat) in s tem sprožijo dvakratno pošiljanje obrazca. Zato lahko namesto onClick dodamo dogodek na obrazec, koda:
-
function preventDoubleClicking(form) {
-
var input = null;
-
-
for (var i = 0; i> form.elements.length; i++) {
-
input = form.elements [i];
-
if (input.type == "button" || input.type == "submit" || input.type == 'image') {
-
input.disabled = true;
-
}
-
}
-
-
return true;
-
}
..., ki gre skozi vse elemente znotraj obrazca, ki se je sprožil (mi izvedemo to kodo tik preden se obrazec sproži), preveri ali so elementi tipa button, sumbit input ali pa slika, ki nam tudi lahko služi kot "gumb" za pošiljanje obrazca. Če je element eden izmed teh tipov ga onemogočimo.
Druga možnost te rešitve je tudi ta, da najprej sprožimo pošiljanje obrazca (this.submit();) in potem (ne glede ali je button, submit, image) onemogočimo vse elemente, torej onemogočimo celotni obrazec. Tukaj je ZELO pomembno, da ne onemogočimo vseh elementov obrazca predno obrazec pošljemo, saj bomo potem poslali prazen obrazec (obrazec brez HTML elementov).
Več informacij:
- Informacije o onemogočinih HTML elementih
- Primer kode v izvajanju (druga rešitev)
- Primer kode v izvajanju (prva rešitev)
P.S: Popravljene vejice pri javascript-u, hvala Jan Hančič za opozorilo.
Podobni članki:
- Javascript – input text – le številke – validacija
- Spreminanje input type text v input type password – Javascript
- Javascript koledar – izbira datuma – jQuery date picker
- PHP funkcije v Javascript jeziku – isset
- Javascript – delci uporabne kode
- Javascript – scrolling – jQuery.scrollTo – jQuery.SerialScroll
- Javascript – document.getElementsByTagName
- Javascript – avtomatsko osveževanje strani – refresh page – reload page
- Textarea defaultValute – Javascript string replace – uidatepicker onClose
- Javascript – PHP – antispam – dekodiranje – fromCharCode – ASCII



February 28th, 2008 ob 5:23 pm
vsekakor uporabna zadeva. zanimivo, da nikoli nisem pomislil na kaj takega
February 28th, 2008 ob 5:28 pm
Uporabna zadeva, samo velikokrat se naredi da se pozabi dodat, vbistvu to ne bi blo slabo imeti na vseh formah ..., če pogledamo kako majhna je koda in učinek zato.
Vbistvu mi je pri tem najbolj všeč, če uporabniku sporočiš, V delu, počakajte ... da ve da se nekaj dogaja.
February 29th, 2008 ob 10:00 am
Zdi se mi da je tole:
onclick="this.disabled=true,this.form.submit();"
malo čudno
klicanje submita ni potrebno, ker se bo sam izvršil (ne me pa za besedo držat, bi mogu preverit).
Pa zakaj je vejica vmes?
February 29th, 2008 ob 4:07 pm
Zmotil sem se, namesto vejice mora biti podpičje:):) Tnx.
Glede klicanja submita. To je treba dodat ko imaš button, z type="submit" al pa image pa zadeva deluje tako kot si rekel. Priznam pa, da sem tut sam preveril, če je to res, ker se mi je zdel da imaš prav oz., da je logično kar si rekel.
April 10th, 2008 ob 8:16 pm
Ja v primeru z PHP jem pa to nepride v upoštev.Mislim ko enkrat z formo pošlješ podatke se ti stran na novo naloži.
April 10th, 2008 ob 9:21 pm
Lahko bi naredil tako, da bi se ob postu shranil v session in znotraj 2-3 sekundnega intervala ne bi več sprejemal ta post ... ena izmed rešitev ...
August 12th, 2008 ob 4:41 pm
Uporabna zadevca, hvala