javascript - 多个表单的多个 onsubmit 处理程序

标签 javascript events closures handler onsubmit

我正在编写一段附加的 JavaScript,旨在在提交表单时捕获信息。我需要适应网页上可能有多个表单的情况,其中没有/部分/全部可能已经定义了 onsubmit 处理程序......并且我需要在调用 bolt 代码后触发原始处理程序。

我有一个包含 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

最佳答案

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

当调用任何 document.forms[x].onsubmit 函数时(显然是在循环完成之后),每个处理程序中的 origSubmit 将指向相同的函数(document.forms[document.forms.length - 1].onsubmit)。您必须“捕获”origSubmit 的值,因为 JavaScript 只有函数作用域,没有 block 作用域:

 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

关于javascript - 多个表单的多个 onsubmit 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429791/

相关文章:

Swift 如何使用 Segue 通过 View Controller 传递数据?

javascript - 为什么我们在原型(prototype)继承中使用临时盒子?

javascript - jQuery:根据类型对子项进行排序

c# - Azure Windows 事件日志级别

closures - 使用线程时的生命周期问题

javascript - 分解 Backbone.js set 方法时避免范围陷阱?

Javascript CORS 请求,不存在 'Access-Control-Allow-Origin' header 和 200 状态代码

Javascript 垃圾收集相关

javascript - 获取元素innerHTML并添加到List

javascript - jQuery .live() 与 .on() 方法在加载动态 html 后添加点击事件