Вопрос

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

У меня есть настройка тестового примера с 2 формами, в первой нет обработчика 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);  
}

Есть какие-нибудь идеи?

ТИА

Это было полезно?

Решение

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

В то время, когда любой 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

Другие советы

Я думаю, что проблема может быть в вашем 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);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top