2013-04-24 24 views
5

Ich hatte vor ein paar Jahren einen LOGO-ähnlichen Turtle-Grafik-Basic-Interpreter entwickelt, den ich nicht ins Internet stellen wollte (weil mich mein Cousin immer wieder nervt). Obwohl ich ziemlich neu in HTML bin, Javascript-Programmierung dachte ich, ich würde es versuchen & nehmen Sie dies als eine Lernerfahrung.Selbstdefinierte Javascript-Funktion funktioniert nicht wie erwartet?

Der folgende Code ist nur für die grundlegende Benutzeroberfläche (meine Benutzeroberfläche sieht sehr hässlich aus und ich werde es später aufräumen).

Ich habe eine Javascript-Funktion pushCmd geschrieben, die onsubmit der "cmd-form" heißt.

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText += "<br>" + cmdText; 
       } 
       srcElement.innerHTML = srcText; 
      } 

Das Formular wird wie folgt deklariert.

Die pushCmd-Funktion sollte den HTML-Inhalt des div "source-container" ändern, der standardmäßig wie folgt aussieht.

<div id="source-container">NO CODE</div> 

Nachdem ich den ersten Text (sagen "FWD 100") einreichen. Der Inhalt des "Quellcontainers" sollte auf "FWD 100" geändert werden. Dann wenn ich "RT 90" einreiche, sollte der Inhalt "FWD 100
RT 90" sein. Das ist, was ich davon erwarte.

Aber wenn ich den Text einreiche. Der Inhalt des "Source-Containers" ändert sich nur für einen Augenblick und kommt dann wieder auf "NO CODE" zurück. Warum passiert das, kann jemand bitte darauf hinweisen, wo mein Fehler liegt?

Ich versuchte beide erhalten & Post-Methoden, aber das Ergebnis ist das gleiche. Ich kann auch keine Fehler oder Warnungen in der Javascript-Konsole sehen. Ich verwende Google Chrome Version 26.0.1410.63, wenn das wichtig ist (ich denke nicht).

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen oder die vollständige HTML-Quelle dafür benötigen.

+0

Da du neu bei js bist, empfehle ich mit jQuery zu lernen. Es ist leicht zu erlernen/zu benutzen und dennoch sehr mächtig und kann viele Dinge viel einfacher machen, einschließlich der Auswahl bestimmter Elemente oder Gruppen von Elementen, Bindungsereignissen und Animationen. – smerny

+0

@smerny ... Danke für den Vorschlag (kein Sarkasmus). Learning Jquery ist auf meiner To-Do-Liste. –

+0

nur meine 2 Cent, denken Sie daran, weiterhin versuchen, JavaScript zu lernen, während Sie jQuery lernen. Es kann einfach sein, einfach zu lernen, wie man das Framework benutzt und nicht weiter ein Verständnis von hinter den Kulissen entwickelt. – keithwyland

Antwort

1

Ihre Form auf die leere Aktion tatsächlich einreicht. Bei einer leeren Aktion wird normalerweise die aktuelle Seite aktualisiert. So kann Ihre Seite so schnell auffrischen, dass es scheint, eine sofortige Änderung der source-container Div zu sein.

Anstatt eine Submit-Schaltfläche zu verwenden, versuchen Sie es mit der Taste = und klicken Sie dann im JavaScript auf diese Schaltfläche. (Beachten Sie die id="" auf die Schaltfläche Senden in der HTML)

HTML

<div id="command-container"> 
    <form id="cmd-form" action="" onreset="resetSource()" method="get"> 
    <input type="text" id="cmd-text" name="command" size="80" /> 
    <input type="button" id="btnSend" value="Send" /> 
    <input type="reset" value="Reset" /> 
    <input type="submit" value="Run" /> 
    </form> 
</div> 

<div id="source-container">NO CODE</div> 

Javascript

function pushCmd() 
{ 
    var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
    var srcElement = document.getElementById("source-container"); 
    var srcText = new String(srcElement.innerHTML); 
    srcText = srcText.toUpperCase(); 
    alert(cmdText); 
    if (srcText.indexOf("NO CODE") != 0) 
    { 
     srcText = cmdText; 
    } 
    else 
    { 
     srcText += "<br>" + cmdText; 
    } 
    srcElement.innerHTML = srcText; 
} 

document.getElementById('btnSend').onclick = pushCmd; 

sehen dies als ein Beispiel dieses Codes codepen: http://codepen.io/keithwyland/pen/scAJy

+0

Das sieht gut aus. Ich denke, ich werde sowohl die Send- als auch die Reset-Taste so konvertieren, wie Sie es vorgeschlagen haben. Und die Schaltfläche "Ausführen" kann als Übermittlungsoption verwendet werden. –

+0

@mobbarley Das ist schlechte Praxis. Sie sollten das Ereignis "submit" immer behandeln, wenn Sie mit einem Formular arbeiten, das eingereicht wird. Was passiert, wenn die "Return" -Taste gedrückt wird, während das Textfeld eines Formulars fokussiert ist? In einigen Browsern wird das Formular übermittelt ... in einigen Browsern nicht. – Ian

+0

Ich vermutete, dass Mobbarley eine andere Schaltfläche für das Senden des Formulars verwenden würde, da mit der Schaltfläche "Senden" lediglich ein Element auf der Seite ohne Aktualisierung aktualisiert werden sollte. Ich habe das Beispiel bearbeitet, um den Submit Button als Mobbarley hinzuzufügen. Ian bringt einen guten Punkt, dass das Eingeben in einer Form es einreichen wird. Also wirst du darüber nachdenken müssen, wie du damit umgehen sollst. – keithwyland

0

Sie senden wahrscheinlich die ganze Seite an den Server, was dazu führt, dass sie sich aktualisiert und Sie daher den gleichen Standardwert zurückbekommen.

Um dies zu verhindern, können Sie versuchen, AJAX zu verwenden, mit dem Sie Daten an den Server senden können, ohne die gesamte Seite zu aktualisieren.

Eine Möglichkeit, um zu verhindern, dass Ihre Seite an den Server gesendet wird, besteht darin, return false; zu Ihrer Funktion hinzuzufügen.

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText = "<br>" + cmdText; 
       } 
       srcElement.innerHTML = srcText; 
       retrun false; 
      } 
+0

Hallo Danke für die Antwort, aber es ist nur eine lokale Seite und ich habe es noch nicht auf einen Server hochgeladen.Es gibt entweder http-equiv = "refresh" -Meta-Tags. –

+0

Wenn Sie bereits das Ereignis "onsubmit" verwenden und Ihr Code ausgeführt wird, bedeutet dies, dass Ihre Seite an den Server gesendet wird. Eine Möglichkeit, dies zu verhindern, ist 'return false;' –

+0

Vielen Dank. Tat dies. Es funktionierte. –

2

Sie müssen false von pushCmd zurückzukehren, und ändern Sie das onsubmit Attribut onsubmit="return pushCmd();" sonst das Formular selbst einreichen und aktualisieren Sie die Seite.

Außerdem müssen Sie diese Zeile ändern:

srcText = "<br>" + cmdText; 

zu:

srcText += "<br>" + cmdText; 

Dies entspricht:

srcText = srcText + "<br>" + cmdText; 

was bedeutet, dass Sie cmdText anhängen wollen srcText.Wenn Sie += nicht haben, überschreiben Sie im Grunde srcText mit nur cmdText.

+0

Hallo Vivin, hat das gemacht. Ihr Punkt ist richtig, aber es funktioniert immer noch nicht. –

+1

@mobbarley Bitte beachten Sie meine Antwort, Sie müssen auch Ihr HTML-Attribut ändern, um den Wert zurückzugeben: 'onsubmit =" Zurück pushCmd() "' – Paulpro

+0

Vielen Dank. Tat dies. Es funktionierte. –

1

Sie reichen das Formular ein, damit die Seite aktualisiert wird und sie in den ursprünglichen Zustand zurückversetzt wird.

Je nachdem, was Sie letztendlich benötigen, besteht eine Lösung darin, die Formularübermittlung zu verhindern. Sie können dies mit einem einfachen return false; am Ende Ihrer Funktion tun.

function pushCmd() { 
    var cmdText = document.forms["cmd-form"]["cmd-text"].value; 

    var srcElement = document.getElementById("source-container"); 
    var srcText = srcElement.innerHTML; 
    srcText = srcText.toUpperCase(); 

    if (srcText.indexOf("NO CODE") != 0) { 
     srcText = cmdText; 
    } else { 
     srcText = "<br>" + cmdText; 
    } 
    srcElement.innerHTML = srcText; 

    return false; 
} 
+0

Vielen Dank. Tat dies. Es funktionierte. –

+0

Gern geschehen. – grasp

0

Sie benötigen false von Ihren onsubmit Event-Handler zurück, um die Seite von erfrischenden selbst zu verhindern. Wenn Sie die Senden-Schaltfläche drücken, wird Ihr Ereignishandler ausgelöst, aber dann wird sofort das Formular gesendet, das die Seite erneut lädt. Wenn Sie false von einem Ereignishandler zurückgeben, wird das Standardverhalten verhindert.

function pushCmd() 
      { var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
       var srcElement = document.getElementById("source-container"); 
       var srcText = new String(srcElement.innerHTML); 
       srcText = srcText.toUpperCase(); 
       if (srcText.indexOf("NO CODE") != 0) 
       { 
        srcText = cmdText; 
       } 
       else 
       { 
        srcText = "
" + cmdText; } srcElement.innerHTML = srcText; return false; }

Darüber hinaus werden Sie return pushCmd() müssen, anstatt nur pushCmd() in Ihrem Event-Handler.

+0

Das stimmt nicht. Es ist inkonsistent, wenn es mit Ereignishandlern verwendet wird, die an Javascript gebunden sind. Inline-Event-Handler erfordern 'return functionCall();' zusätzlich. Die Rückgabe von false verhindert nicht nur das Blubbern (was das nicht beeinflusst), es verhindert auch das Standardverhalten (wie das Senden) – Ian

+0

Vielen Dank. Tat dies. Es funktionierte. –

3

Es passiert, weil HTML-Formulare an den Server senden, indem sie eine neue HTTP-Anfrage senden, die in Ihrem Fall mit dem leeren Aktionsattribut der Aktualisierung der Seite in Ihrem Browser ähnelt. Um den Browser aus der Durchführung der Standardaktion (Absenden des Formulars) zu verhindern, dass Sie false von Ihrer Funktion zurückgeben kann, durch return false; als letzte Zeile in sie und fügte hinzu:

function pushCmd() { 
    var cmdText = document.forms["cmd-form"]["cmd-text"].value; 
    var srcElement = document.getElementById("source-container"); 
    var srcText = srcElement.innerHTML.toUpperCase(); 

    if (srcText.indexOf("NO CODE") !== 0) 
    { 
     srcText = cmdText; 
    } 
    else 
    { 
     srcText += "<br>" + cmdText; 
    } 
    srcElement.innerHTML = srcText; 
    return false; 
} 

Dann wird Ihr HTML die Rückkehr Attribut ändern zurückzukehren Wert Ihrer Funktion aus der onsubmit:

onsubmit="return pushCmd()" 
+0

Warum mit 'pushCmd' umgehen? Verwenden Sie einfach "onsubmit =" pushCmd(); return false; " – Ian

+0

Vielen Dank. Tat dies. Es funktionierte. –

+0

@Ian Es ist für mich auf diese Weise besser lesbar. – Paulpro

Verwandte Themen