Mutliple OnSubmit обработчики для нескольких форм - PullRequest
0 голосов
/ 13 декабря 2010

Я пишу дополнительный фрагмент JavaScript, который предназначен для сбора информации при отправке формы.Мне нужно учесть сценарий, когда на веб-странице может быть несколько форм, ни одна / некоторые / все из которых могут уже иметь определенные обработчики передачи ... и мне нужно запустить исходный обработчик после вызова кода на болтах.

У меня есть тестовый набор настроек с двумя формами, у первого нет обработчика onsubmit, у второго - простое окно оповещения.

Я попробовал приведенный ниже код - но, похоже, он скопировал предварительносуществующий обработчик из form2 в form1:

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

Есть идеи?

TIA

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Я не совсем понимаю, что вы хотите сделать, но у вас есть типичная функция в определении цикла проблема:

В то время, когда вызывается любая функция document.forms[x].onsubmit (очевидно, после завершения цикла), origSubmit в каждом обработчике будет указывать на одну и ту же функцию (document.forms[document.forms.length - 1].onsubmit). Вы должны «захватить» значение origSubmit, потому что JavaScript имеет только область действия функции, а не область блока:

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

См. Также Крышки для чайников , пример 5

1 голос
/ 13 декабря 2010

Я думаю, что проблема может быть вашей origSubmit переменной; он «закрыт» над созданной вами функцией, но он изменен циклом for.

Попробуйте:

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);
  }
}
...