2012-03-26 9 views
0

Ich versuche, Form Submits von Webseiten abfangen, die ich nicht kontrolliere.JavaScript: Abfangen Formular senden und identifizieren, welches Formular die Einreichung

Meine aktuelle Implementierung ist ...

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

Das Problem dabei ist, innerhalb interceptform(), bin ich nicht in der Lage zu erkennen, welche Form gemacht tatsächlich diese Unterwerfung. Gibt es eine Möglichkeit, das Formularobjekt, das versucht wird, zu übergeben? Beachten Sie, dass für einige der Formulare, die ich sehe, kein Name oder keine ID angegeben ist und dass mehr als ein Formular (auf derselben Webseite) mit derselben Aktion vorhanden ist.

Bearbeiten: Der Zweck ist erfassen den Inhalt in den Eingabe-Tags, die zu dem Formular gehören. A aus Beispiel dafür, was ich in einer Form zu sehen:

<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:

Basierend auf @ruakh Antwort, die Lösung, die ich am Ende mit:

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

Welchen Zweck hat es zu bestimmen, welches Formular übermittelt wird? Und können Sie die Formulare auf einer Seite mit Beispielen versehen, damit wir sehen können, was Sie damit zu tun haben? – prodigitalson

+0

@ prodigitson, der Zweck ist, Text von der Vorlage zu erfassen. Ich fügte der Frage den Zweck und ein Beispiel von Formen hinzu, die ich sehe. – mani

Antwort

0

Sie können einfach passieren formobj als Argument an interceptform():

 interceptform(formobj); 

Aber bedenken Sie, dass Sie sowohl mit formobj als auch mit prevonsubmit vorsichtig sein müssen, um die Erfassung einer Variablen zu vermeiden, die Sie nicht möchten. dies zum Beispiel in JavaScript, um:

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

schafft zehn Funktionen, die alle 10 zurückkehren, weil sie alle die gleiche i Variable erfassen, die zu 10 durch die Zeit inkrementiert ist schon werden die Funktionen immer genannt.

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

kopieren jeden Wert von i in eine neue lokale Variable return_value, deren Wert sich nie ändert;: Im obigen Beispiel könnte man so etwas schreiben oder, ein wenig lapidar, dies:

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

Sie werden mit ziemlicher Sicherheit etwas ähnliches in Ihrem Fall tun müssen. (Aber ohne etwas mehr von dem Kontext Ihres Codes zu sehen, ist es schwer, genau zu sagen, was.)

+0

Perfekt! Genau nach was ich suche. Ich habe das gleiche versucht, indem ich als Argument übergeben habe, aber einige haben nicht bemerkt, dass es einen Bug in meinem aktuellen Code gibt. Die Lösung, mit der ich endete, ist, wenn jemand interessiert ist ... var prevonsubmit = formobj.onsubmit; if (prevonsubmit) formobj.onsubmit = sonst formobj.onsubmit = – mani

0

Warum nicht durchlaufen document.forms und fügen Sie ein verstecktes Feld zu jedem, oder zuweisen Sie eine ID zu dem Formular selbst .

0

Wenn Sie über die Formen von einer Funktion sind loopoing, dann:

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

prevonsubmit einen Verschluss an der äußeren Variable hat, wird es den letzten Wert von prevonsubmit verweisen, so werden sie alle Referenz die gleiche Funktion. Dies funktioniert möglicherweise, schlägt jedoch fehl, wenn eines Ihrer Formulare einen aktuellen Listener aufweist, der sich von anderen Formularen unterscheidet.

>    interceptform(); 

Sie können einfach diese von der Funktion interceptform passieren:

   interceptform(this); 

und interceptform wird eine Referenz auf das Element übergeben werden dem Aufruf der Funktion (vermutlich das Formular abgeschickt werden).

Das wird (wahrscheinlich) die Einreichung eines Formulars abbrechen, das keinen vorhandenen Listener hat. Ist es das was du willst?

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

Benannte Funktionsausdrücke sind bekanntermaßen in mindestens einem weit verbreiteten Browser fehlerhaft. Wenn Sie keinen Namen brauchen (und es scheint hier nicht verwendet zu werden), verwenden Sie keinen. Halten Sie die Funktion anonym.

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

Ich habe gerade verstanden, wie JS Closure funktioniert, und einen Wrapper hinzugefügt, damit es funktioniert. Und über die Rückkehr falsch, ja, das war die Absicht, meine Funktion sollte eine falsche zurückgeben, ohne das Formular abzufangen, wenn das Original onSubmit eine falsche zurückgibt. Ich habe die benannten Funktionsausdrücke in anonyme umbenannt. Danke für die Kommentare und Antworten. Es war sehr hilfreich. – mani

Verwandte Themen