2012-03-26 141 views
0

我試圖從我不控制的網頁攔截表單提交。JavaScript:攔截表單提交併確定提交的表單提交

我目前的實現是...

// During onLoad, loop through all forms and for each form object 
var prevonsubmit = formobj.onsubmit; 
if (prevonsubmit) { 
    formobj.onsubmit = function f() { 
     if(prevonsubmit()) { 
      interceptform(); 
      return true; 
     } 
     return false; 
    }; 
} else { 
    formobj.onsubmit = function ff() { 
     interceptform(); 
     return true; 
    }; 
} 

這裏的問題是,裏面interceptform(),我無法確定哪些形式實際上是由本次提交。有沒有一種方法,我真的得到了試圖提交的表單對象?請記住,我看到的一些表單沒有指定名稱或ID,並且存在多個表單(在同一網頁中)具有相同的操作。

編輯: 目的是捕獲屬於表單的輸入標籤中的內容。 一個由例如我在一個形式看:

<form action="https://duckduckgo.com/html/" method="GET"> 
    <input type="text" name="q"/> 
</form> 
<form action="https://duckduckgo.com/html/" method="GET"> 
    <input type="text" name="l"/> 
</form> 
<form action="https://duckduckgo.com/html/" method="GET"> 
    <input type="text" name="l"/> 
    <input type="text" name="q"/> 
</form> 

EDIT2:

基於@ruakh答案,解決我最終使用:

var prevonsubmit = formobj.onsubmit; 
if (prevonsubmit) 
    formobj.onsubmit = createOnSubmitFunctionWithOld(prevonsubmit, formobj); 
else 
    formobj.onsubmit = createOnSubmitFunction(formobj); 

// Definition of the functions: 
function createOnSubmitFunctionWithOld(prevonsubmit,formObj) { 
    return function() { 
     if (prevonsubmit()) { 
      interceptform(formObj); 
      return true; 
     } 
     return false; 
    }; 
} 
function createOnSubmitFunction(formObj) { 
    return function() { 
     interceptform(formObj); 
     return true; 
    }; 
} 
+0

確定提交表單的目的是什麼?你可以發佈一個頁面上的表單和例子,以便我們看到你在處理什麼? – prodigitalson 2012-03-26 00:55:05

+0

@prodigitalson,目的是從提交中獲取文本。我添加了這個問題的目的和形式的一個例子。 – mani 2012-03-26 01:05:04

回答

0

你可以簡單地傳遞formobj作爲參數interceptform()

 interceptform(formobj); 

但請記住,與formobjprevonsubmit都必須小心避免捕獲您不想要的變量。例如,在JavaScript中,這樣的:

var functions = []; 
for(var i = 0; i < 10; ++i) 
    { functions[i] = function() { return i; }; } 

創建十大功能,所有返回10,因爲它們都捕獲一直由函數稱爲有史以來的時間最多增加到10相同i變量。在上面的例子中,你可以寫這樣的:

function new_constant_function(return_value) 
    { return function() { return return_value; }; } 

// ... 

var functions = []; 
for(var i = 0; i < 10; ++i) 
    { functions[i] = new_constant_function(i); } 

i每個值複製到一個新的局部變量return_value其值永遠不會改變;或者更簡潔些,這:

var functions = []; 
for(var i = 0; i < 10; ++i) 
    { functions[i] = (function(_i){ return function(){ return _i; } })(i); } 

你幾乎肯定需要在你的情況下做類似的事情。 (但沒有看到更多關於代碼的上下文,很難說出具體的內容)

+0

完美!正是我在尋找的東西。我嘗試了同樣的方式,作爲參數傳遞,但是有些人沒有意識到我當前代碼中存在一個錯誤。我最終解決的解決方案是,如果任何人感興趣的是... var prevonsubmit = formobj.onsubmit; if(prevonsubmit) formobj.onsubmit = else formobj.onsubmit = – mani 2012-03-26 09:44:28

0

爲什麼不循環遍歷document.forms併爲每個表單添加一個隱藏字段,或者爲表單本身分配一個id 。

0

如果您loopoing在從函數的形式,則:

> var prevonsubmit = formobj.onsubmit; 
> if (prevonsubmit) { 
>  formobj.onsubmit = function f() { 
>   if(prevonsubmit()) { 

prevonsubmit有一個封閉的外部變量,它會引用prevonsubmit的最後值,因此它們全部會引用相同的功能。這可能「有效」,但如果您的任何表單具有與任何其他表單不同的當前偵聽器,則會失敗。

>    interceptform(); 

你可以簡單地通過從功能到interceptform

   interceptform(this); 

interceptform將被傳遞到元素調用函數(可能被提交表單的引用。 )。

>    return true; 
>   } 
>   return false; 

這將(可能)取消提交任何沒有現有偵聽器的表單。那是你要的嗎?

>  }; 
> } else { 
>  formobj.onsubmit = function ff() { 

命名函數表達式在至少一個廣泛使用的瀏覽器中被稱爲是越野車。如果你不需要一個名字(並且它在這裏似乎沒有用於任何東西),不要'使用一個名字。保持匿名功能。

>   interceptform(); 
>   return true; 
>  }; 
> } 
+0

我剛剛瞭解JS Closure是如何工作的,並添加了一個包裝來使其工作。而關於返回的錯誤,是的,這是意圖,如果原始的onSubmit返回false,我的函數應該返回一個false,而不截取表單。我將命名的函數表達式重命名爲匿名函數表達式。感謝您的評論和回覆。這真的很有幫助。 – mani 2012-03-26 09:58:31