JavaScript:拦截表单提交并确定提交的表单

时间:2012-03-26 00:49:52

标签: javascript html forms onsubmit

我试图拦截我不控制的网页提交的表单。

我目前的实施是......

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

3 个答案:

答案 0 :(得分:0)

您只需将formobj作为参数传递给interceptform()

        interceptform(formobj);

但请记住,使用formobjprevonsubmit时,您必须小心避免捕获您不想要的变量。例如,在JavaScript中,这个:

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

创建了所有返回10的十个函数,因为它们都捕获了相同的i变量,该变量在调用函数时已递增到10。在上面的示例中,您可以编写类似:

的内容
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); }

你几乎肯定需要在你的情况下做类似的事情。 (但是,如果没有看到代码的更多内容,很难确切地说出什么。)

答案 1 :(得分:0)

为什么不循环遍历document.forms并为每个字段添加一个隐藏字段,或者为表单本身分配一个id。

答案 2 :(得分:0)

如果您在函数中循环表单,那么:

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

prevonsubmit 对外部变量有一个闭包,它将引用prevonsubmit的 last 值,因此它们都将引用相同的函数。这可能“有效”,但如果您的任何表单具有与任何其他表单不同的当前侦听器,则会失败。

>              interceptform();

您只需将从函数传递到 interceptform

               interceptform(this);

interceptform 将传递对调用该函数的元素的引用(可能是提交的表单)。

>              return true;
>          }
>          return false;

那将(可能)取消提交任何没有现有听众的表格。这就是你想要的吗?

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

已知命名函数表达式在至少一个广泛使用的浏览器中是错误的。如果你不需要一个名字(这里似乎没有使用它),不要使用一个名字。保持函数匿名。

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