2016-06-01 12 views
1

Wie kann ich verhindern, dass Sie das Formular zweimal senden müssen, wenn Sie Codemirror verwenden und das Formular mit JavaScript senden. Was passiert ist, sind alle Änderungen, die ich in der Codemirror Textarea mache, vorübergehend in einem anderen Textarea (es hat keinen Namen oder ID) gespeichert. Wenn ich zweimal auf die Senden-Schaltfläche klicke, werden die richtigen Daten gesendet, aber ich möchte vermeiden, dass ich zweimal darauf klicken muss. Hier ist mein Quellcode zum Einreichen des Formulars:Senden von Codemirror-Daten mit JavaScript funktioniert nicht richtig

var ajax; 
var formData = new FormData(); 
var fileUpload = false; 
for (i = 0; i < e.elements.length; i++) 
{ 
    if (e.elements[i].type == "submit") 
    { 
     if (submitname == e.elements[i].name) 
     { 
      if (submit != null && submit.disabled) 
       submit.disabled = false; 
      submit = e.elements[i]; 
      submit.disabled = true; 
      formData.append(e.elements[i].name, e.elements[i].value); 
     } 
    } 
    else if (e.elements[i].type == "radio" || e.elements[i].type == "checkbox") 
    { 
     if (e.elements[i].checked) 
      formData.append(e.elements[i].name, e.elements[i].value); 
    } 
    else if (e.elements[i].type == "file") 
    { 
     abortButton.disabled = false; 
     var file = document.getElementsByName("file")[0].files[0]; 
     var maxSize = 1024; 
     var maxSizeBytes = 1048576 * maxSize; 
     formData.append("archivo", file); 
     fileUpload = true; 
    } 
    else 
    { 
     //alert(e.elements[i].type + e.elements[i].name + e.elements[i].class + e.elements[i].value); 
     if (e.elements[i].name == 'code') 
     { 
      alert(e.elements[i].type + e.elements[i].name + e.elements[i].value + e.elements[i + 1].value); 
      formData.append(e.elements[i].name, e.elements[i].value); 
      //formData.append(e.elements[i].name, e.elements[i].value + e.elements[i + 1].value); 
     } 
     else 
      formData.append(e.elements[i].name, e.elements[i].value); 
    } 
} 
formData.append("javascript", "javascript"); 
status = e.elements[0].value.split('/').reverse()[0] + "-status"; 
ajax = new XMLHttpRequest(); 
if (!fileUpload) 
{ 
    ajax.addEventListener("load", manageLoad, false); 
    ajax.addEventListener("error", manageError, false); 
} 
else 
{ 
    ajax.upload.addEventListener("progress", manageProgress, false); 
    ajax.addEventListener("load", _manageLoad, false); 
    ajax.addEventListener("error", _manageError, false); 
    ajax.addEventListener("abort", _manageAbort, false); 
    globalAjax = ajax; 
} 
ajax.open("POST", e.action); 
ajax.send(formData); 
return false; 

NB. Diese Codezeile: if (e.elements[i].name == 'code') bestimmt, dass das Element die Codemirror-Textarea ist.

Ich bin auf der Suche nach einer Nicht-jQuery-Lösung. Vielen Dank.

Antwort

2

Sie können die Verwendung von cm.getDoc().getValue() in Erwägung ziehen, anstatt den Wert direkt aus dem DOM-Element zu lesen (e.elements[i].value)).

(cm ist der Verweis auf die dann instanziiert Codemirror Objekt, wie in var cm = CodeMirror(...))

+0

Wenn ich mein Codemirror Objekt initiiert wurde ich nicht einmal einen Hinweis darauf zu speichern. Ich habe manchmal mehrere CodeMirror-Objekte, also muss ich jetzt jedem CodeMirror-Textbereich eine Nummer als ID geben, damit ich 'cmArray [e.elements [i] .id] .getDoc(). GetValue()' verwenden kann. Vielen Dank für Ihre Hilfe. Ich werde dir das Kopfgeld geben, sobald es mich lässt. –