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

Était-ce utile?

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);
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top