2010-12-13 63 views
0

我正在写一个JavaScript的螺栓固定位,用于在提交表单时捕获信息。我需要容纳一个网页上可能有多个表单的场景,其中没有/一些/所有这些可能已经有onsubmit处理程序定义....我需要在调用螺栓代码后触发原始处理程序。多种形式的多重提交处理程序

我有一个测试用例设置2种形式,第一个没有onsubmit处理程序,第二个简单的警报箱。

我尝试下面的代码 - 而这似乎预先存在的处理程序从窗口2复制到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

回答

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

+0

谢谢菲利克斯,是的 - 这当然有效 - 我需要有一个小时思考为什么现在 - 所以我会去读这个链接。不幸的是,在MSIE6中,事件对象似乎在某处陷入歧途 - 但我遇到了与attachEvent相同的问题。 – symcbean 2010-12-13 15:38:07

+0

@symcbean:IE不直接传递事件对象。你通过'window.event'得到它。阅读关于这里的活动:http://www.quirksmode.org/js/events_properties.html,这也可能是有趣的:http://www.quirksmode.org/js/events_tradmod.html – 2010-12-13 23:19:05

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

感谢sje397 - 不幸的是我菲利克斯给了我同样的答案,我无法接受他们两个 - 所以你得到了一个投票,而不是:) – symcbean 2010-12-13 15:36:34

+0

唉 - 即使我殴打他几秒?没关系:) – sje397 2010-12-13 23:16:29