+ Antworten
Ergebnis 1 bis 12 von 12

Thema: Submit-Event bei Formularen

  1. #1
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137

    Submit-Event bei Formularen

    Hallo Javascriptler,

    bei einigen Browsern führt das Drücken der Return-Taste in Inputfeldern dazu, dass das Formular direkt übertragen wird.
    Weiß jemand wie ich das verhindern kann?

    Es soll einfach nichts passieren wenn man Enter drückt.
    Dabei soll in einer Textarea die Enter-Taste natürlich normal funktionieren.
    Ich habe irgenwie keine Idee wo ich da ansetzen kann.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  2. #2
    TP-Moderator Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Avatar von Malleus
    Registriert seit
    Aug 2004
    Ort
    Homburg / Saarland
    Beiträge
    711
    Meinst Du so etwas ?
    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
    <
    html>
    <
    head>
    <
    title>"RETURN" sendet kein "FORM"-Submit</title>
    <
    script type="text/javascript">
    function 
    initPage()
    {
        
    noReturn true;
        
    document.myForm.myText.focus();
    };

    function 
    check4Return(evt)
    {
    noReturn = ( evt.keyCode != 13 )
    };

    </script>

    </head>

    <body onload="initPage()">
    <form name="myForm" action="test.php" onsubmit="return noReturn" onkeydown="check4Return(event)">
    <input type="text" name="myText" >
    <textarea name="myTextArea"></textarea>
    </form>

    </body>
    </html> 
    tschau

    Frank

  3. #3
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Hallo Frank,

    danke für Dein Listing.
    Ich möchte das aber mit etwas mehr Luxus verbinden und allgemeingültig machen. Bei der Lösung gefällt mir nicht, dass man bei jedem Inputfeld die Events angeben muss. das kann man doch sicherlich auch automatisieren.

    Ich bin jetzt so weit, dass beim Start der Seite dynamisch jedem Input-Feld vom Typ Text und Password ein eigener Eventhandler zugewiesen wird.

    In der aufgerufenen Funktion ist allerdings der Wert KeyCode immer "undefined".
    Wie kann ich denn ermitteln welche Taste gedrückt wurde?

    Code:
    t=document.getElementsByTagName('input');
    var anzahl_felder=t.length;
    for (i=0;i<anzahl_felder;i++)
    {
    	if (t[i].type=="text" || t[i].type=="password")
    	{
    		if(document.addEventListener)
    		{   //code für Mozilla
    			t[i].addEventListener("keypress", submitonenter, false);
    		}
    		else
    		{   //IE
    			t[i].attachEvent("onkeypress", submitonenter);
    		}
    	}
    }
    
    //funktion die beim Druecken einer Taste im Inputfeld aufgerufen wird
    function submitonenter(e)
    {
     alert(e.type+' '+e.KeyCode);
     ... Jetzt pruefen, ob KeyCode den Wert 13 (Enter) hat.
    }
    Geändert von DSB (28.08.2006 um 13:07 Uhr)
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  4. #4
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Oh mann, Javascript.
    Das k von keyCode muss klein geschrieben werden.
    Das wars - dann mal weiter im Text.

    Und hier das fertige Script (getestet in FF1.5, IE 6 und Opera 8.52.
    Man muss es einfach einmal nach dem oder den Formularen in den Quelltext einfügen. Es werden automatisch alle Inputfelder ermittelt und das automatische Absenden durch Drücken der Enter-Taste wird verhindert.

    Code:
    <script type="text/javascript" language="javascript">
    t=document.getElementsByTagName('input');
    var anzahl_felder=t.length;
    for (i=0;i<anzahl_felder;i++)
    {
    	if (t[i].type=="text" || t[i].type=="password")
    	{
    		if(document.addEventListener)
    		{   //non IE
    			t[i].addEventListener("keypress", submitonenter, false);
    		}
    		else
    		{   //IE
    			t[i].attachEvent("onkeypress", submitonenter);
    		}
    	}
    }
    
    function submitonenter(e)
    {
    	if(typeof window.event!="undefined") e=window.event;//code for IE
    	if(e.type=="keypress" && e.keyCode == 13)
    	{
    		if (typeof e.preventDefault != 'undefined') e.preventDefault();
    		return false;
    	}
    }
    </script>
    Geändert von DSB (28.08.2006 um 13:16 Uhr)
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  5. #5
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Jetzt wollte ih noch etwas mehr Luxus einbauen und erreichen, dass beim Drücken der Enter-Taste in das nächste Inputfeld gesprungen wird.
    So funktioniert es leider nicht:
    Code:
    	if (e.keyCode==13) { e.keyCode=9;return true; }
    Weiß jemand welchen Handler ich wie aufrufen muss, damit die Standardfunktion von Tab ausgeführt wird?
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  6. #6
    TP-Moderator Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Avatar von Malleus
    Registriert seit
    Aug 2004
    Ort
    Homburg / Saarland
    Beiträge
    711
    Hi,
    Bei Deiner Lösung gefällt mir nicht, dass man bei jedem Inputfeld die Events angeben muss. das kann man doch sicherlich auch automatisieren.
    Ich glaub', Du hast mein Script nicht richtig verstanden ;-)
    Mein "onkeydown"-Event mußt Du nur ans FORM "attachen", nicht an alle INPUT-Controls.

    Trotzdem hab' ich das Script noch etwas verändert. Hier ist eine neue Version, die auch TAB berücksichtigt.

    Den "Keycode" des Events kannst Du nicht verändern: Stell' Dir mal vor, Du gibst "5" ein und intern werden 6 bestellt ;-)

    Meine Lösung geht die Elemente des Formulars durch und springt dann auch den nächsten "geeigneten".

    PHP-Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
    <
    html>
    <
    head>
    <
    title>"RETURN" sendet kein "FORM"-Submit und wird zu "TAB"</title>
    <
    script type="text/javascript">
    function 
    initPage()
    {
        
    document.myForm.myText1.focus();
    };

    function 
    check4Returnevt )
    {
        var 
    obj evt.target || evt.srcElement;
            
        if (
    obj.type == "submit")
            return 
    true;
            
        if ( 
    obj.type != "textarea" && evt.keyCode == 13 )
        {
            if ( 
    evt.preventDefault )
                
    evt.preventDefault()
            else 
    evt.returnValue false;
            
            var 
    myElements document.myForm.elements,
            
    newIndex 0;
            
            for (var 
    0myElements.lengthi++ )
            if ( 
    myElements] == obj )
            {
                for (var 
    1myElements.lengthj++ )
                    if ( 
    "input,textarea,submit".indexOfmyElements].type ) != -)
                    {
                        
    newIndex j;
                        break;
                    };
                
    myElementsnewIndex ].focus();
            };
        };
        
        return 
    true;
    };

    </script>

    </head>

    <body onload="initPage()">
    <form name="myForm" action="disableFormReturn.html" onkeypress="check4Return(event)">
    <input type="text" name="myText1" ><br>
    <input type="text" name="myText2" ><br>
    <textarea name="myTextArea"></textarea><br>
    <input type="text" name="myText3" >
    <br>
    <input type="submit"/>
    </form>

    </body>
    </html> 
    Jetzt noch etwas zu Deinem Scriptinclude:
    Man muss es einfach einmal nach dem oder den Formularen in den Quelltext einfügen.
    Dieses Einbetten von Script direkt in den HTML-Bereich find' ich eigentlich nicht so toll. Oft paßt man hier nicht auf und man greift auf Objekte zu, die noch nicht richtig "geparsed" wurden. Verwende besser am "BODY"-Element ein "onload"-Event, das z.B. eine Funktion "initPage" aufruft, in der dann "alles" erledigt wird.

    Tschau

    Frank

  7. #7
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Hallo Frank,

    Zitat Zitat von Malleus
    Ich glaub', Du hast mein Script nicht richtig verstanden ;-)
    Mein "onkeydown"-Event mußt Du nur ans FORM "attachen", nicht an alle INPUT-Controls.
    Ups, wie recht Du hast.
    Da habe ich nicht richtig geguckt.
    Ich gelobe trotz meiner regelmäßigen JS-Aufgeregtheit nächstes Mal genauer hinzugucken.

    Trotzdem hab' ich das Script noch etwas verändert. Hier ist eine neue Version, die auch TAB berücksichtigt.
    Super!
    Vielen herzlichen Dank für Deine Lösung.
    Das "Problem" taucht auch recht häufig bei Google auf. Mach Dich also auf entsprechenden Zulauf gefasst.


    Jetzt noch etwas zu Deinem Scriptinclude:

    Dieses Einbetten von Script direkt in den HTML-Bereich find' ich eigentlich nicht so toll. Oft paßt man hier nicht auf und man greift auf Objekte zu, die noch nicht richtig "geparsed" wurden. Verwende besser am "BODY"-Element ein "onload"-Event, das z.B. eine Funktion "initPage" aufruft, in der dann "alles" erledigt wird.
    Danke sehr.
    Da ich nicht so der Javascript-Freak bin, nehme ich den Tipp dankend an.
    Das Script soll allerdings in eine Forensoftware integriert werden, wo der Body-Tag nicht im Zugriff steht, da er in einer anderen Templatedatei definiert wird.
    Meinst Du, man kann davon ausgehen dass die Hauptseite geladen ist wenn man das Script extern auslagert?

    Auf die Idee mit dem Focus statt Tab-Event bin ich gar nicht gekommen.
    Klasse gelöst.

    Edit2: Man lernt doch nie aus. Ich hätte nicht gedacht, dass man ein onkeypress-Event an ein Formular knüpfen kann und sich dieses dann automatisch auch auf alle Kindelemente auswirkt. Eigentlich mag ich JS nicht. Aber je mehr ich mich damit beschäftige, umso klarer wird mir wie mächtig das sein kann.
    Geändert von DSB (28.08.2006 um 22:10 Uhr)
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  8. #8
    TP-Specialist Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108
    Zitat Zitat von Malleus
    Den "Keycode" des Events kannst Du nicht verändern: Stell' Dir mal vor, Du gibst "5" ein und intern werden 6 bestellt ;-)
    Also der IE kann das tatsächlich! Dort ist die property read/write. Ich habe das einmal für ein ähnliches Verhalten genutzt (also Enter2Tab und ich meine auch dass ich die Pfeiltasten in Tabs und Shift-Tabs "gedreht" hatte). Des Weitere habe ich dieses "Feature" dazu genutzt um auf dem NUM-Block den Punkt in ein Komma zu wandeln - zwecks Eingabe von Kommazahlen (oder wars andersherum? ...hab gerade nur ne Notitastatur da ) Das klappt also definitv (im IE zumindest )

    Gruß
    Jan

  9. #9
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    Daniel - das onload muss ja nicht im body-tag stehen, es reicht ja auch ein
    window.onload
    im JS-Bereich


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  10. #10
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Ah, gute Idee.
    Danke Steffen.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  11. #11
    TP-Moderator Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Malleus ist ein richtiges Arbeitstier - DANKE Avatar von Malleus
    Registriert seit
    Aug 2004
    Ort
    Homburg / Saarland
    Beiträge
    711
    Hi,
    Steffens Vorschlag
    Zitat Zitat von St@eff.en
    Daniel - das onload muss ja nicht im body-tag stehen, es reicht ja auch ein
    window.onload
    im JS-Bereich
    kann "gefährlich" sein: Ihr überschreibst damit einen vielleicht existierende "onload"-Event Handler.
    Besser wäre es, "addEventListener" bzw. "attachEvent" (MSIE) aufzurufen: Damit wird ein zusätzlicher Eventhandler hinzugefügt.

    Hier hab' ich mal etwas vorbereitet ;-)

    PHP-Code:
    <html>
    <
    head>
    <
    title>Zwei Window Onloads</title>
    <
    script type="text/javascript">
    function 
    initPage()
    {
        
    document.getElementById"myDiv" ).innerHTML+="Text aus der HTML-Seite<br>";
    };
    </script>
    <script type="text/javascript" src="twoWindowOnLoads.js"></script>
    </head>

    <body onload="initPage()">
    <div id="myDiv"></div>
    </body>
    </html> 
    JS-Datei: twoWindowOnLoads.js
    PHP-Code:
    if ( window.addEventListener )
        
    window.addEventListener"load" doIt true );
    else if ( 
    window.attachEvent )
        
    window.attachEvent"onload" doIt );

    function 
    doIt()
    {
        
    document.getElementById("myDiv").innerHTML += "Text aus der JS-Seite<br>";

    Wenn Du ( Ihr ) window.load benutzt, wird nur ein Text ausgegeben.


    @Stuck Mojo: Ich hab' dieses MSIE-Feature damals mißbraucht, um "," in "." umzuwandeln ;-)


    @DSB:
    Edit2: Man lernt doch nie aus. Ich hätte nicht gedacht, dass man ein onkeypress-Event an ein Formular knüpfen kann und sich dieses dann automatisch auch auf alle Kindelemente auswirkt.
    Dieses Verhalten ist auch bei vielen anderen Events (onmousedown,onmouseup, usw) so und nennt sich "Bubbeln", d.h. es wird überprüft, ob das Element, das den Event feuert einen entsprechenden Eventhandler besitzt. Wenn ja, wird dieser ausgeführt. Je nach Ausgang dieser Routine wird überprüft, ob das Elternelement auch einen solchen Eventhandler besitzt und er wird ausgeführt. Dies geschieht bis das window-Element erreicht wird oder "irgendwo" in der Reihe das Bubbln gecanceld ( event.cancelBubble=true) wird.
    ...Das war jetzt nur die Kurzfassung ;-) Mehr und vor allem genauere Infos gibt's hier
    Danny Goodman: Dynamic HTML: The Definitive Reference.

    Übrigens das Buch meiner Wahl bzgl. Crossbrowser-Programmierung!

    tschau

    Frank

  12. #12
    TP-Member meyerzwo ist auf einem guten Weg
    Registriert seit
    Apr 2006
    Beiträge
    68
    Hallo,
    ich finde dieses Script sehr sinnvoll um Funktionen aufzurufen.
    Es ist klein, universell einsetzbar und funktioniert in jedem Browser.

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51