2010-12-13 6 views
0

J'écris un bit de javascript qui est destiné à capturer des informations lorsqu'un formulaire est soumis. J'ai besoin d'adapter le scénario où il peut y avoir plusieurs formulaires sur une page Web, aucun/certains/tous qui ont déjà des gestionnaires de sous-menus définis .... et je dois déclencher le gestionnaire d'origine après avoir appelé le code de verrouillage.multiliple onsubmit handlers pour plusieurs formulaires

J'ai une configuration de cas de test avec 2 formulaires, le premier n'a pas de gestionnaire de sous-menu, le second une simple boîte d'alerte.

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

Répondre

1

Je ne comprends pas vraiment ce que vous voulez faire, mais vous avez la fonction typique Définition du problème de la boucle:

Au moment où une fonction document.forms[x].onsubmit est appelé (évidemment après la boucle terminée), origSubmit dans chaque gestionnaire pointera vers la même fonction(). Vous devez « capturer » la valeur de origSubmit parce que JavaScript n'a que la portée de la fonction, ne bloque pas 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 Closures for Dummies, Exemple 5

+0

Merci Felix, oui - cela fonctionne certainement - j'ai besoin d'un petit wee pense à pourquoi maintenant - alors je vais aller lire ce lien. Malheureusement dans MSIE6, l'objet d'événement semble s'égarer quelque part - mais j'obtiens le même problème avec attachEvent. – symcbean

+0

@symcbean: IE ne transmet pas directement l'objet événement. Vous l'obtenez via 'window.event'. Lisez à propos des événements ici: http://www.quirksmode.org/js/events_properties.html et cela pourrait aussi être intéressant: http://www.quirksmode.org/js/events_tradmod.html –

1

Je pense que la question peut être votre variable origSubmit; il est 'fermé' sur la fonction que vous créez là mais il est changé par la boucle for.

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); 
    } 
} 
+0

Merci sje397 - malheureusement je Felix m'a donné la même réponse et Je ne peux pas les accepter tous les deux - donc vous obtenez un vote à la place :) – symcbean

+0

Aw - même si je l'ai battu de quelques secondes? Nevermind :) – sje397