plusieurs gestionnaires pour soumettre à de multiples formes
-
09-10-2019 - |
Question
J'écris un boulonné peu de javascript qui est destiné à l'information de capture lorsqu'un formulaire est soumis. Je dois accueillir le scénario où il peut y avoir plusieurs formes sur une page Web, aucun / some / qui peuvent tous déjà avoir des gestionnaires onsubmit définis .... et je dois tirer le gestionnaire d'origine après avoir appelé le verrou sur le code.
J'ai une installation de cas de test avec 2 formes, le premier gestionnaire n'a pas onsubmit, le second simple Alertbox.
J'ai essayé le code ci-dessous - mais qui semblait copier le gestionnaire pré-existant à partir form2 dans Formulaire1:
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);
}
Toutes les idées?
TIA
La solution
Je ne comprends pas vraiment ce que vous voulez faire, mais vous avez la typique fonction dans la définition de la boucle problème:
Au moment où toute fonction est appelée document.forms[x].onsubmit
(évidemment après la boucle terminée), origSubmit
dans chaque gestionnaire pointera vers la même fonction (document.forms[document.forms.length - 1].onsubmit
). Vous devez « capturer » la valeur de origSubmit
parce que JavaScript n'a que la portée de la fonction, ne pas bloquer la portée:
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));
}
}
Voir aussi Fermetures pour les nuls , Exemple 5
Autres conseils
Je pense que le problème peut être votre variable origSubmit
; il est « fermé » sur la fonction que vous créez là, mais il a changé par la boucle.
Essayez:
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);
}
}