несколько обработчиков onsubmit для нескольких форм
-
09-10-2019 - |
Вопрос
Я пишу встроенную часть 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);
}
}