2014-01-10 7 views
6

Ich habe ein Formular, dass (in der einfachsten Form), wie das ist folgende:Formular zurücksetzen Ursachen „aus Stapelspeicher“ Fehler mit jquery.validation

<!DOCTYPE html> 
<!--[if lt IE 7]>  <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> 
<!--[if IE 7]>   <html class="no-js lt-ie9 lt-ie8"> <![endif]--> 
<!--[if IE 8]>   <html class="no-js lt-ie9"> <![endif]--> 
<!--[if gt IE 8]><!--> 
<html class="no-js"> 
<!--<![endif]--> 
<head> 
    <meta charset="utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
    <title>PC Trade Up - Test </title> 
</head> 
<body id="tech"> 
    <div id="page"> 
     <section id="main"> 
      <h2> 
      Test 
      </h2> 
      <form action="/tech/migration/test" method="post"> 
       <input id="test1" name="test1" type="text" value="" />  
       <div> 
        <button type="Submit" id="formSubmit" class="btn"> 
         Submit 
        </button> 
        <button type="Reset" id="formReset" class="btn"> 
         Reset 
        </button> 
       </div> 
      </form> 
     </section> 
    </div> 
    <script src="/Scripts/jquery-1.9.1.js"></script> 
    <script src="/Scripts/jquery.validate.js"></script> 
    <script src="/Scripts/jquery.validate.unobtrusive.js"></script> 
    <script src="/content/js/lib/jquery.form.js"></script> 
</body> 
</html> 

ich diese Form nutzen können und ohne Probleme einreichen . Wenn ich jedoch die Reset-Taste drücke, erhalte ich "SCRIPT28: Out of stack space" in der IE10-Konsole. Seltsamerweise kann ich das in Firefox nicht reproduzieren.

Ich habe das Problem durch Entfernen der jquery.form.js Referenz vermieden, aber das ist in meinem Bundle enthalten. Der Fehler scheint aus jquery.validation.js zu sprudeln. Ich habe das 417 dieses Skript zur Linie verfolgt, die wie folgt lautet:

resetForm: function() { 
    if ($.fn.resetForm) { 
     $(this.currentForm).resetForm(); 
    } 
    this.submitted = {}; 
    this.lastElement = null; 
    this.prepareForm(); 
    this.hideErrors(); 
    this.elements().removeClass(this.settings.errorClass).removeData("previousValue"); 
}, 

Die Linie

$(this.currentForm).resetForm(); 

scheint für 254 Iterationen rekursiv aufrufen, bevor dieser Fehler produzieren, (sinnvoll). Aber ich kann die Quelle der Rekursion nicht bestimmen. Ich verstehe, dass das Auslösen eines Ereignisses auf einem Nachkomme zu einer Blase führen und diese Art von Schleife verursachen wird, aber ich sehe nicht, wo ich das mache, noch sehe ich das in diesem Skript.

Vorschläge zur Bestimmung der Quelle der Rekursion oder Schleife?

+0

$ (this.currentForm) .resetForm(); ruft resetForm auf und Sie erhalten einen Stackoverflow! – Fals

+0

Fals, Danke für die Antwort. Bitte lassen Sie mich klären. Erstens ist die obige Funktion nicht meine eigene. Es stammt aus der jquery.validate.js-Bibliothek, die für sich selbst einwandfrei funktioniert (kein Stack-Überlauf). Das Problem tritt auf, wenn auf die Bibliothek jquery.form.js verwiesen wird. Auch das gehört nicht mir. Es scheint (und ich vermute hier), dass jeder das Reset-Ereignis behandelt und das andere auslöst, was den Stack-Überlauf verursacht. Meine Frage ist, ob es eine Einstellung (oder ein Update) gibt, die dies verhindern kann. Ist jemand anderen mit diesen beiden Bibliotheken begegnet? – user734929

+0

Ich untersuche gerade das gleiche Problem. Ich laufe jetzt mit einem ziemlich minimalen Testfall und ich denke, dass es einen Konflikt zwischen jquery.validate.unobtrusive und jquery.form gibt, die beide Handler zum Formularreset-Ereignis hinzufügen. Ich halte dich auf dem Laufenden. Es ist nicht spezifisch für IE 10, ich habe dies in 8, 10 und 11 reproduziert. 9 ist wahrscheinlich auch betroffen. – Stijn

Antwort

1

ich das gleiche Problem konfrontiert, und ich bin in der Lage, es zu lösen, indem die oben genannten Kommentierung aus:

resetForm: function() { 
     if ($.fn.resetForm) { 
      //$(this.currentForm).resetForm(); 
     } 
     this.submitted = {}; 
     this.lastElement = null; 
     this.prepareForm(); 
     this.hideErrors(); 
     this.elements().removeClass(this.settings.errorClass).removeData("previousValue"); 
    }, 

ich es weiß, dass einige ordnungsgemäße Umsetzung sein sollte, aber dieses Patch behebt Problem schon jetzt, habe ich versucht, in FF & Chrome auch und es scheint zu funktionieren.

1

Ich wollte keinen der vorhandenen jquery.forms Code ändern, also habe ich dies implementiert ist eine separate javaScript-Datei, die nach jquery.form geladen wird. Dieses Skript sollte nur für IE geladen werden.

(function($) {  
    $.fn.resetForm = resetForm; 
    function resetForm() { 
     return this.each(function() { 
      // guard against an input with the name of 'reset' 
      // note that IE reports the reset function as an 'object' 
      if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) { 
       $.fn.resetForm = undefined; 
       this.reset(); 
       $.fn.resetForm = resetForm; 
      } 
     }); 
    }; 
})(jQuery); 
+0

Nice one Ray. Wir Leute in Manchester schätzen es! – ouflak

Verwandte Themen