JavaScript: перехват формы отправки и определение, какая форма сделала отправку - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь перехватить отправку форм с веб-страниц, которые я не контролирую.

Моя текущая реализация ...

// 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 () я не могу определить, какая форма на самом деле сделала это представление. Есть ли способ получить объект формы, который пытается отправить? Помните, что в некоторых формах, которые я вижу, не указано имя или идентификатор, и существует несколько форм (на одной веб-странице) с одним и тем же действием.

Edit: Целью является захват содержимого во входных тегах, которые принадлежат форме. Придуманный пример того, что я вижу в форме:

<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 голосов
/ 26 марта 2012

Почему бы не выполнить цикл по document.forms и добавить к каждому из них скрытое поле или присвоить идентификатор самой форме.

0 голосов
/ 26 марта 2012

Если вы перебираете формы из функции, то:

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

prevonsubmit имеет замыкание на внешнюю переменную, оно будет ссылаться на значение last prevonsubmit, поэтому все они будут ссылаться на одну и ту же функцию. Это может «сработать», но не удастся, если какая-либо из ваших форм имеет текущего слушателя, который отличается от любой другой формы.

>              interceptform();

Вы можете просто передать this из функции в interceptform :

               interceptform(this);

и interceptform будет передана ссылка на элемент, вызывающий функцию (предположительно, отправляемая форма).

>              return true;
>          }
>          return false;

Это (вероятно) отменит отправку любой формы, у которой нет существующего слушателя. Это то, что вы хотите?

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

Выражения именованных функций, как известно, содержат ошибки по крайней мере в одном широко используемом браузере. Если вам не нужно имя (и оно, кажется, здесь ни для чего не используется), не используйте его. Сохраняйте функцию анонимной.

>          interceptform();
>          return true;
>      };
>  }
0 голосов
/ 26 марта 2012

Вы можете просто передать 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); }

Вы почти наверняка должны будете сделать что-то подобное в вашем случае.(Но не видя немного больше контекста вашего кода, трудно сказать, что именно.)

...