Avatar billede learner Praktikant
15. november 2004 - 17:57 Der er 28 kommentarer og
2 løsninger

Undgå at folk klikker dobbelt på submit knapper.

Hej, jeg har submit knapper nogle steder som folk sommetider trykker to gange på eller dobbeltklikker.

Nogen der kander et lille smart script, som kan deaktivere knappen i feks 10 sekunder når den bliver trykket på.

Vi kender det alle :o)
dobbeltgængere i databasen :o)
Avatar billede olebole Juniormester
15. november 2004 - 18:20 #1
<ole>

Det er nok bedre at sikre sig, der ikke sker nogen skade ved, der klikkes to gange. Har du også problemer, hvis siden opdateres efter submit?
Prøv at fortælle lidt mere om, hvad det er, du laver - og hvornår/hvorfor problemerne opstår  :)

/mvh
</bole>
Avatar billede learner Praktikant
15. november 2004 - 18:32 #2
Hej ole :o)
Jeg har sikret mig vedr opdater så godt som jeg lige kunne finde på. Det er en længere historie med noget iframes osv. Så det er ok.

Problemet er mest ved dobbeltklik på submit knappen eller hvis folk klikker fordi de er utålmodige mens den arbejder.
Så jeg tænkte om man kan lave et javascript som deaktiverer knappen i feks 8 sekunder når man trykker på den.
Så kan de ikke klikke igen... :o) Bare et lille script som kan 'sættes ind i knappen'
Avatar billede olebole Juniormester
15. november 2004 - 18:52 #3
Ja, det kan man godt - men jeg ville gerne give dig den helt rigtige løsning  :)
Hvis det er noget data, der skal opdateres - som her på siden - er der nemlig en anden måde at gøre det på. Her får du lige et lille script, der kan disable/enable en knap:

<form name="myForm" ....... >
... en hel masse felter ...

<button type="submit" name="myBtn"
  onclick="this.disabled=true;setTimeout('document.myForm.myBtn.disabled=false', 8000)">Send</button>
</form>
Avatar billede learner Praktikant
16. november 2004 - 12:12 #4
Hej igen. Tak for scriptet :o)

Kan det ikke gøres lidt enklere?
feks
onclick="this.disabled=true;setTimeout('this.disabled=false', 8000)"
eller noget?  :o)

Jeg bruger nemlig ikke altid form name...


Har du lyst at fortælle kort om den anden måde? Det kan jo være jeg kan bruge den fremover...

Takker
Avatar billede olebole Juniormester
16. november 2004 - 13:24 #5
Nej, sådan kan du ikke referere til knappen. Referencen er tabt, når timeout'en skal til at afvikle scriptet. I stedet kan du bruge en variabel og en anonym funktion til at bevare referencen over tid:
  onclick="this.disabled=true;var Me=this;setTimeout(function(){Me.disabled=false}, 8000)"

På siden her, postes kommentar formen mod dokumentet 'response.php'. I formen kunne du så have et felt:
  <input type="hidden" name="return_page" value="<?=$_SERVER["PHP_SELF"]?">

I 'response.php' kunne der stå:

<?

/*
  En masse kode til at identificere brugeren
  og opdatere databasen, m.m.
*/

Header("Location: ".$_POST["return_page"]);
exit;

?>

Efter DB'en er opdateret, sendes brugeren således tilbage til siden med formen og han kan trykke F5 ligeså tosset, han vil  :)
Avatar billede learner Praktikant
17. november 2004 - 12:25 #6
Mange tak olebole. :o)

Næsten det samme jeg har lavet :o)
Jeg er nok ved at lære det :o)
Dejligt!

Og tak for det andet script, det er lettere at sætte ind :o)

Mange tak, du skal have point :o) så send et svar
Avatar billede learner Praktikant
17. november 2004 - 12:58 #7
Ahh, shit, det virker ik helt som det skal.
Den disabler fint nok, men der bliver ikke submittet. Hvordan kan det være?
Det virkede fint før.
Her er det hele

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    var Dont_evaluate = false;
    function CheckThirdSite(){
        if(Dont_evaluate){return true;}
        return confirm('<?php echo $lng_alert ?>');
    }
</script>


<form method="post" onSubmit="return CheckThirdSite()"...
<input type="submit" name="next_from_site_three" value="<?php echo $lng_efterlys_nu; ?>" onclick="this.disabled=true;var button=this;setTimeout(function(){button.disabled=false}, 10000)">

æv æv æv :o)
Avatar billede learner Praktikant
17. november 2004 - 13:04 #8
Har os prøvet det her:


<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    var button = false;
    var Dont_evaluate = false;
    function CheckThirdSite(){
        if(Dont_evaluate){return true;}
        if (confirm('<?php echo $lng_alert ?>')){
            button.disabled=true;
            return true;
        } else {
            button.disabled=false;
            return false;
        }
    }
</script>

<form method="post" onSubmit="return CheckThirdSite()"...
<input type="submit" name="next_from_site_three" value="send" onclick="button=this;">


og det virker heller ik?...

Hvad er der dog galt? Hvorfor submitter/post'er den ikke dataene?
Avatar billede olebole Juniormester
17. november 2004 - 13:05 #9
Ehhhh .... ved submit reloades siden jo ... så kan du ikke bruge et JavaScript. Der er jo tale om 'en ny side' efter submit  ;o)

Submitter du derimod mod en iframe, kan du skrive:

onclick="var button=this;setTimeout(function(){button.disabled=true}, 20);setTimeout(function(){button.disabled=false}, 10000)" ondblclick="return false">

... meeeen ... det bliver efterhånden en lidt skoddet løsning  :)
Avatar billede learner Praktikant
17. november 2004 - 13:08 #10
Ja, men det virker sådan set fint, bortset fra at den ikke sender dataene.

Er det pga den confirm()?
Jeg forstår ik helt?
Avatar billede olebole Juniormester
17. november 2004 - 13:31 #11
Har du prøvet det seneste eksempel?
Avatar billede learner Praktikant
17. november 2004 - 14:57 #12
Ja, det virker fint, men dataene bliver bare ikke sendt med af en eller anden grund. Fatter ik hvorfor....

Det skulle da virke!
Avatar billede olebole Juniormester
17. november 2004 - 15:28 #13
Du må lægge en URL, ellers kan jeg ikke komme det nærmere
Avatar billede learner Praktikant
17. november 2004 - 15:36 #14
vil helst ikke smide en url til min testside. skriv til learner(snabela)hjulskov.dk
Så skriver jeg tilbage :O)
Avatar billede olebole Juniormester
17. november 2004 - 15:46 #15
Nej, det gider jeg ikke. Vi kan løse det her ... eller lade være  :)
Avatar billede learner Praktikant
17. november 2004 - 16:04 #16
okay det i orden :o)
Avatar billede dennismp Nybegynder
17. november 2004 - 16:54 #17
Så vidt jeg ved så bruger du php - så jeg vil tillade mig at være offtopic og løse problemet med php. (Jeg er ikke så glad for clientside løsninger på den type problemer).

Mit forslag: Lav et ID for hver form. Tjek om ID'et er gyldigt, før du gemmer informationerne (eller hvad du nu gør). Rent praktisk kan det gøres ret nemt.

Øverst i dit script har du en id (i session eller cookie) som du tæller op. I din form har du så det gamle id. Ved submit tester du så om tallet i formen er een mindre end den du har i session. Hvis det er, så er alt ok. Hvis det ikke er sandt, er det enten een der har pillet i formen (og rettet det gamle id) eller der mangler det gamle id. Men i langt de fleste tilfælde, bør det virke.

Et eksempel:
http://dennis.moellegaard.dk/php/submit_once.php

(try reload - så burde den brokke sig).
kilden:
http://dennis.moellegaard.dk/php/submit_once.php?source=1
Avatar billede olebole Juniormester
17. november 2004 - 17:27 #18
Så er det vist lettere, bare at sætte en loaction-header, når der er opdateret ... og mere effektivt, da serveren ikke skal checke sessions/cookies  :)
Avatar billede dennismp Nybegynder
17. november 2004 - 18:43 #19
Og så håbe på at folk ikke trykker back :-)
Avatar billede learner Praktikant
17. november 2004 - 19:17 #20
Dennismp
Hvorfor virker det her ikke:


<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    var button = false;
    var Dont_evaluate = false;
    function CheckThirdSite(){
        if(Dont_evaluate){return true;}
        if (confirm('<?php echo $lng_alert ?>')){
            button.disabled=true;
            return true;
        } else {
            button.disabled=false;
            return false;
        }
    }
</script>

<form method="post" onSubmit="return CheckThirdSite()"...
<input type="submit" name="next_from_site_three" value="send" onclick="button=this;">

Hvorfor bliver dataene ikke sendt?
Avatar billede olebole Juniormester
17. november 2004 - 19:17 #21
Ja, det må du såmænd gerne håbe på ... men der sker ikke en squid, hvis det sker.
Prøv at skrive et indlæg på Eksperten og tryk derefter på 'Back' ... og ...?  ;o)
Avatar billede olebole Juniormester
17. november 2004 - 19:29 #22
learner >> Hvad mener du? Den sender da fint data. Prøv:

<?
print "<xmp>";
var_dump($_POST);
print "</xmp>";

$lng_alert = "Sku\' du spørge fra no\'en?";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
body, html {
    height: 100%;
    margin: 0px;
}
</style>
</head>
<body>
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    var button = false;
    var Dont_evaluate = false;
    function CheckThirdSite(){
        if(Dont_evaluate){return true;}
        if (confirm('<?php echo $lng_alert ?>')){
            button.disabled=true;
            return true;
        } else {
            button.disabled=false;
            return false;
        }
    }
</script>

<form action="<?=$_SERVER["PHP_SELF"]?>" method="post" onSubmit="return CheckThirdSite()">
<input type="text" name="noget"><br>
<input type="submit" name="next_from_site_three" value="send" onclick="button=this;">
</form>

</body>
</html>
Avatar billede olebole Juniormester
17. november 2004 - 19:38 #23
... men da du har disabled din knap, bliver den ikke sendt med til serveren - så hvis du checker på den, så er det derfor, du tror, der ikke bliver sendt data med  ;o)

Lav altid et skjult felt:
  <input type="hidden" name="contxt" value="noget">

Så kan du altid spørge på serveren:

if (isset($_POST["contxt"])) {
  switch ($_POST["contxt"]) {
      case "noget":
        funktion_1();
      break;

      case "noget_andet":
        funktion_2();
      break;

      default:
        // Noget, der skal ske, hvis ikke 'contxt' er 'noget' eller 'noget_andet'
  }
}
Avatar billede olebole Juniormester
17. november 2004 - 19:41 #24
Hold K..., hvor kan jeg skrive dårligt dansk, når jeg tager mig sammen  :D
Avatar billede learner Praktikant
17. november 2004 - 19:48 #25
:o)

Jeg må lige læse dine indlæg nærmere...
Kigger på det og skriver tilbage.

Mange tak begge to
Avatar billede dennismp Nybegynder
17. november 2004 - 20:23 #26
learner; Husk, en anden gang, at jeg ikke har forstand på javascript. Jeg tyer til OleBole og venner hvis jeg ikke kan undgå at bruge det :)
Avatar billede dennismp Nybegynder
17. november 2004 - 20:26 #27
Ole; Når jeg trykker back, så får jeg min tekst igen. Derefter reloader den siden. Tror det er noget javascript (har dog ikke undersøgt det)
Avatar billede learner Praktikant
01. december 2004 - 17:30 #28
Jeg har fundet en løsning. Inspireret af olebole
Jeg skulle bare skjule knappen, ikke deaktiveret den :o)

her er det hele:
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
    var button = false;
    function CheckThirdSite(){
        if (confirm('<?php echo $lng_alert ?>')){
            button.style.display="none";
            return true;
        } else {
            button.style.display="inline";
            return false;
        }
    }
</script>

<form method="post" onSubmit="return CheckThirdSite()" action="fil.php">
<input.....osv...
<input type="submit" value="bla" onClick="button=this;">
</form>

og så virker det bare knaldgodt...

:o)

Men takker alligevel :o)

olebole smid et svar og få lidt point :o)
Avatar billede learner Praktikant
01. december 2004 - 17:30 #29
svar
Avatar billede olebole Juniormester
01. december 2004 - 20:10 #30
... s'gerne  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester