Funktionsaufruf wenn User seine Eingabe länger als halbe Sekunde unterbricht.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Funktionsaufruf wenn User seine Eingabe länger als halbe Sekunde unterbricht.

    Hallo liebes Team,

    ich habe ja hier so eine schönes Ajax Script mit dem man Passwörter auf die Sicherheit gewichten kann und dann grafisch darstellen.

    Nun ist der Eventhandler auf onkeyup eingestellt, wie kann man das so machen, dass die Funktion immer dann aufgerufen wird, wenn der User seine Eingabe für länger als eine halbe sekunde unterbricht?

    Hier der jetzige Code:

    Quellcode

    1. <html><head>
    2. <script type="text/javascript">
    3. function isSecure(digit) {
    4. try {
    5. req = window.XMLHttpRequest?new XMLHttpRequest():
    6. new ActiveXObject("Microsoft.XMLHTTP");
    7. } catch (e) {
    8. //Kein AJAX Support
    9. }
    10. req.onreadystatechange = function () {
    11. if ((req.readyState == 4) && (req.status == 200)) {
    12. //getreu dem fall, dass das element einen integerwert liefert
    13. var val = eval(req.responseText);
    14. document.getElementById('row').style.width = val;
    15. if(val == 0)
    16. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    17. else if((val >= 1) && (val <= 24))
    18. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    19. else if((val >= 25) && (val <= 49))
    20. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    21. else if((val >= 50) && (val <= 74))
    22. document.getElementById('row').style.backgroundImage = 'url(safeyel.png)';
    23. else
    24. document.getElementById('row').style.backgroundImage = 'url(safegreen.png)';
    25. }};
    26. req.open("GET", 'func.php?s='+ digit);
    27. req.send(null);
    28. }
    29. </script>
    30. </head>
    31. <body>
    32. <!- blank.gif = beliebiges transparentes bild //-->
    33. <form method="post" action="">
    34. <table width="240" border="0" cellpadding="0" cellspacing="0" id="row" class="style.backgroundImage='url(leer.png)';height:8px;width:240px;">
    35. <tr>
    36. <td><img src="trans1x1.gif" height="8" width="240"></td>
    37. </tr>
    38. </table>
    39. <p>
    40. <input type="text" id="val" onKeyUp="isSecure(this.value)" />
    41. </p>
    42. </form>
    43. </body></html>
    Alles anzeigen


    Für eine elegante Hilfe wäre ich sehr dankbar.

    Mit freundlichen Grüßen

    kingluui
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • @Gnex, vielen Dank für die schnelle Hilfe,

    also der Sinn ist, es soll nicht immer ein Request an den Server abgesetzt werden wenn eine Taste losgelassen wurde, sonder nur dann, wenn der User über einen längeren Zeitraum keine weite Taste losgelassen hat. Na ja, eine halbe Sekunde ist vielleicht ein wenig kurz, kann ich ja auf 2 Sekunden oder so stellen.

    Aber Dein Vorschlag würde die Funktion erst nach einer halben Sekunde aufrufen, auch wenn ich drei Tasten kurz nacheinander gedrückt habe wird die Funktion erst nach der letzten losgelassenen Taste aufgerufen? Oder wird jetzt nach jedem Tastenloslassen doch jedesmal die Funktion aufgerufen nur halt ne halbe Sekunde später?

    Also

    1.) drei Tasten = drei mal ne halbe Sekunde später?

    oder

    2.) drei Tasten = einmal ne halbe Sekunde später? (Das wäre mein wunsch)

    Liebe Grüße

    kingluui
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Drei Tasten = Drei funktionsaufrufe. Somit macht Gnex methode keinen Sinn.


    Was du machen könntest. Du Definierst auserhalb deiner Funktion eine variable.
    z.B. var time=0;
    Innerhalb der funktion lässt du diese variable mit der Aktuellen Zeit (timestamp) aktualisieren.

    Dann kannst du in deiner Funktion eine Abfrage erstellen
    var aktuellezeit=//aktuelle zeit bestimmen
    var abfragezeit=parseInt(aktuellezeit-time);

    if( abfragezeit > x) => dann darf die funktion weiter ausgeführt werden
  • BennyBunny schrieb:

    Meinst du irgednwie nicht, dass es wenig Sinn macht die Stärke des Passworts vom Server prüfen zu lassen? Wenn du sowieso mit Javascript arbeitest, kannst du die PRüfung doch auch genausogut in JS machen...


    Das hatte ich mir auch schon gedacht. Wobei er ja ein riesen vorteil hätte weil das ganze nicht mehr Serverabhängig läuft und keine Serverlast mehr verursacht.
    Wobei es auch noch auf ajaxrain.com solche Scripte bereits gibt.
  • Hallo liebe Leute,

    ihr habt vollkommen Recht, das oben angegebene Script ist tatsächlich nicht das worum es eigendlich geht, ich habe das jetzt einfach als Beispiel genommen um den Ablauf zu illustrieren. Aber es geht mir ja grundsätzlich nur darum eine Eingabe eines Users in der Datenbank einzutragen und das nicht nach einem onchange oder onblur oder eben onkeyup sondern nach dem der User die Eingabe gemacht hat.

    Meistens ist ein User nach seiner Eingabe ja fertig mit dem Feld, aber manchmal schreibt ein User halt noch weiter im Feld und dann möchte ich das aufnehmen, vor ein zwei Jahren habe ich die Idee mal in einer Zeitschrift aufgeschnappt, und das fand ich sehr elegant.

    @Snowflake: Ich habe das noch nicht so ganz geschnallt, hört sich aber gut an, ist es Dir möglich, wenn Du vielleicht 2 min. Zeit hast mir das irgendwie als Beispiel in meinen Code zu frickeln, wie Du das meinst, ich verspreche auch mir der Sache anzunehmen um das nachzuvollziehen.

    Als kleines Dankeschön an alle hier auch mal der Code zum Passwort checken, den hat mir d0nut freundlicher Weise auch irgendwann mal hier im Forum zur Verfügung gestellt, funktioniert einwandfrei mit dem u. a. Script:

    func.php

    Quellcode

    1. <?php
    2. $gbst = 0;
    3. $gbst1 = 0;
    4. $gbst2 = 0;
    5. $string = $_GET["s"];
    6. $string1 = $_GET["s"];
    7. $string2 = $_GET["s"];
    8. for ($i = 0; $i < strlen($string); $i++) {
    9. $ascii = ord($string[$i]);
    10. if ($ascii >= 65 && $ascii <= 90) {
    11. $gbst++;
    12. }
    13. }
    14. for ($i = 0; $i < strlen($string1); $i++) {
    15. $ascii = ord($string1[$i]);
    16. if ($ascii >= 97 && $ascii <= 122) {
    17. $gbst1++;
    18. }
    19. }
    20. for ($i = 0; $i < strlen($string2); $i++) {
    21. $ascii = ord($string2[$i]);
    22. if ($ascii >= 48 && $ascii <= 57) {
    23. $gbst2++;
    24. }
    25. }
    26. if($gbst >= 1) {
    27. $checkResult = 25;
    28. } else {
    29. $checkResult = 0;
    30. }
    31. if($gbst1 >= 1) {
    32. $checkResult = $checkResult+25;
    33. } else {
    34. $checkResult = $checkResult;
    35. }
    36. if($gbst2 >= 1) {
    37. $checkResult = $checkResult+25;
    38. } else {
    39. $checkResult = $checkResult;
    40. }
    41. echo $checkResult;
    42. ?>
    Alles anzeigen


    Liebe grüße

    kingluui
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Hey also wir machen das ganze in Javascript. Das ganze im PHP Code zu verankern wäre nicht sehr sinnvoll da man dann trotzdem ein Ajax Request startet.
    Hab dir mal was gemacht. Ist immerhin nur ein fertig funktionierender Code Schnippsel.
    Sollte aber wohl kein Problem sein dein Script damit anzu passen


    Quellcode

    1. <script>
    2. /*Zeit beim aufrufen der Seite speichern und das Timeout definieren*/
    3. var currentTime = new Date();
    4. var last=currentTime.getTime();
    5. var timeout=1500; //sekunden der unterbrechung 1000= 1sek 2000= 2sek...
    6. function xyz(){
    7. var TimeNow = new Date();
    8. var time=parseInt(TimeNow.getTime()-last); // zeit des funktionsaufruf - zeit des seitenaufrufes
    9. if(time > timeout){ // wenn var time groeßer als timeout in dem fall 1500 (1.5 sek) ist erlaube das weiter machen
    10. /*
    11. hier kommt dann dein Javascript code hinein der nach dem "timeout" ausgeführt werden soll
    12. */
    13. alert('juhu');
    14. last=TimeNow.getTime(); // var last updaten.
    15. }
    16. }
    17. </script>
    18. <button onclick="xyz()">xyz</button>
    Alles anzeigen



    Wenn du das ganze so Kopierst und ausführst, sollte immer erst nach 1,5 sekunden ein Fenster mit dem inhalt "juhu" sich öffnen.
  • :love: Hallo liebe Leute,

    der Vorschlag von Snowflake war schon echt klasse, und danke für Deinen Code, die Sache funktioniert leider noch nicht so ganz, weil die Funktion bereits dann schon ausgeführt wird wenn ich zum ersten mal eine Taste gedrückt habe, das würde noch nicht mal so stören,

    aber ich glaube die Lösung ist, das ich die Zeit vom letzten Funktionsaufruf als timeout für den nächsten Funktionsaufruf nehmen muss, allerdings ist mir das schon wieder zu hoch. Vielleicht kann ich ja nochmal geholfen werden. :love:

    Liebe Grüße

    kingluui
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Um nochmals auf deine Anfangsidee zurück zu kommen ...


    Du kannst "onchange" als Eventhandler nutzen.
    Dabei kann man davon ausgehen, dass der nutzer dann auch mit der Eingabe fertig ist.

    Das es zwingend notwendig ist, das ganze Serverseitig prüfen zu lassen halte ich nicht für notwendig.
    Das ganze soll ja der Usability dienen und nicht den Benutzer zwingen sich irre kombinationen auszudenken, welche er sich eh nicht merken kann und dann die Passwort Rememberfunktion zu nutzen.