0

我正在编写一个附加的 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);  
}

有任何想法吗?

TIA

4

2 回答 2

1

我认为问题可能是您的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);
  }
}
于 2010-12-13T14:37:59.370 回答
1

我真的不明白你想要做什么,但你有循环定义问题中的典型函数:

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

另请参阅Closures for Dummies,示例 5

于 2010-12-13T14:38:45.620 回答