我试图拦截我不控制的网页提交的表单。
我目前的实施是......
// 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 :(得分:0)
您只需将formobj
作为参数传递给interceptform()
:
interceptform(formobj);
但请记住,使用formobj
和prevonsubmit
时,您必须小心避免捕获您不想要的变量。例如,在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;
> };
> }