mehrere onsubmit Handler für mehrere Formulare
-
09-10-2019 - |
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
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);
}
}