Frage

Ich schreibe eine Bolt-on-Bit von Javascript, der Capture-Information bestimmt wird, wenn ein Formular abgeschickt wird. Ich brauche das Szenario zu empfangen, wo es auf einer Webseite mehrere Formen annehmen kann, keine / some / von denen alle bereits onsubmit Handler definiert .... und ich brauche die ursprüngliche Handler Feuer nach dem Bolt-on-Code aufrufen.

Ich habe einen Testfall-Setup mit zwei Formen erhalten, hat die erste keine onsubmit-Handler, der zweite ein einfaches Alertbox.

Ich habe versucht, den Code unten - aber das schien den vorbestehenden Handler von form2 in form1 zu kopieren:

window.onload=pageinit;

function pageinit()
{
    for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = function (event) {
                            dosubmit(event);
                            return origSubmit(event);
                    }
            }
    }
}

function dosubmit(ev)
{
  alert('bolt-on invoked from ' + ev.target.name);  
}

Irgendwelche Ideen?

TIA

War es hilfreich?

Lösung

Ich habe nicht wirklich das, was Sie tun wollen, aber Sie haben die typische Funktion in Schleife Definition Problem:

Im der Zeit, als jede document.forms[x].onsubmit Funktion aufgerufen wird (natürlich nach der Schleife beendet), origSubmit in jedem Handler wird auf die gleiche Funktion (document.forms[document.forms.length - 1].onsubmit) zeigen. Sie müssen „capture“ den Wert von origSubmit weil JavaScript nur Funktionsumfang hat, nicht Umfang blockieren:

 for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = (function(func) {
                        return function (event) {
                                dosubmit(event);
                                return func(event);
                               }
                    }(origSumbit));
            }
    }

Siehe auch Verschlüsse für Dummies Beispiel 5

Andere Tipps

Ich denke, die Frage Ihre origSubmit variabel sein kann; es ist ‚geschlossen‘ über die Funktion, die Sie dort erstellen, aber es ist von der for-Schleife geändert.

Versuchen Sie:

function pageinit()
{
    for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = createSubmitHandler(origSubmit);
            }
    }
}

function dosubmit(ev)
{
  alert('bolt-on invoked from ' + ev.target.name);  
}


function createSubmitHandler(origSubmit) 
{
  return function(event) {
    dosubmit(event);
    return origSubmit(event);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top