2010-12-13 65 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