2009-05-07 4 views
0

Was wäre der beste Weg, um das Senden Ereignis behandeln, wenn Sie mehrere Formulare dynamisch mit der gleichen Formular-ID in jQuery erstellt haben?Bind dynamisch hinzugefügt Formular zum Senden von Ereignis mit jQuery

Bis jetzt macht diese Zeile, dass jQuery nur die erste Form behandelt.

$("form#noteform").submit(function(){ 
    // do stuff 
}); 

Art verwirrend, weil ich wirklich die von einer bestimmten Form vorlegen müssen fangen die richtigen Post Werte zu erhalten, damit die Wähler der Form muss eindeutig sein.

Wie können Sie es auf alle Submits hören lassen und später identifizieren, ob es die richtige Form-ID ist, die das Submit gestartet hat?

Antwort

4

Es gibt keine beste Möglichkeit, dies mit IDs zu tun, da mehrere Elemente mit derselben ID ungültig sind.

Ich würde vorschlagen, stattdessen Ihre Formulare haben eindeutige IDs aber teilen einen Klassennamen. Wenn Sie dann die erste benötigen, können Sie die ID direkt oder die Klasse und den jquery: first selector verwenden.

$('form.className:first').submit(function(){ 
    stuff(); 
}); 

-edit- Der Versuch, das Problem tatsächlich zu adressieren festzustellen, welche Form vorgelegt. Auch hier setzt diese Lösung auf Unique

der Form ID
$('form.className').submit(function(){ 
    switch($(this).attr('id')){ 
    case 'form1id': 
     submitForm1(); 
     break; 
    case 'form2id': 
     submitForm2(); 
     break; 
    default: 
     stuff() 
     break; 
    }  
}); 
+0

-1 Es scheint mir, dass das OP auf irgendein Submission-Ereignis lauscht und hofft, Daten über das, was gefeuert wurde, zu verarbeiten. Obwohl die Klassenempfehlung funktioniert, vermute ich, dass es das gleiche Problem hätte. Was das Beispiel betrifft, bietet es keine zusätzliche Funktionalität gegenüber dem, was es bereits hat. – bendewey

+1

Ich stimme @Corey Downie @ mit der gleichen ID mehr als einmal ist * ungültig HTML * es ist in der Regel eine schlechte Idee und es könnte sogar zu unerwartetem Verhalten in jQuery führen. – brianpeiris

+0

Ich sage nicht, dass mit der ID mehr als einmal empfohlen wird, ich stimme zu, dass es schlecht ist, aber das war nicht die Frage. Ich gehe davon aus, dass das OP nicht die Kontrolle über die IDs hat. – bendewey

0

Ich habe mit dem submit Ereignis einige Probleme gesehen. Ich würde empfehlen, Ihre Ereignisse an die Klickereignisse für Ihre Formulare anzuhängen. Ich würde auch empfehlen, dass Sie nicht die gleichen IDs in HTML verwenden, wenn möglich. Das ist in der Regel eine schlechte Übung.

Zum Beispiel:

mit folgenden html:

<form id="questionForm" action="question/save/1234" method="post">> 
    <input type="text" id="question1" /> 
    <input type="text" id="answer1" /> 
    <input type="submit" id="saveQuestion1" class="submit" value="Save" /> 
</form> 
<!-- more forms --> 
<form id="questionForm" action="question/save/4321" method="post"> 
    <input type="text" id="question2" /> 
    <input type="text" id="answer2" /> 
    <input type="submit" id="saveQuestion2" class="submit" value="Save" /> 
</form> 

Sie können dies stattdessen verwenden:

$(document).ready(function() { 
    $('.submit').click(function(e) { 
    // load the form with closest (jQuery v1.3+) 
    var form = $(this).closest('form'); 
    // check form 
    if (!isValid(form)) 
    { 
     e.preventDefault(); 
    } 
    // or if you make the buttons of type button and not submit 
    if (isValid(form)) 
    { 
     form.submit(); 
    } 
    }); 
}); 
+0

Hinweis zur Verwendung der gleichen IDs hinzugefügt, was eine schlechte Übung ist. – bendewey

0

die letzte Option, die ich wirklich darüber nachdachte , weil ich schon verwendet dieser Code woanders

Wenn das rea ist lly arbeiten, dann wäre das große

zu überprüfen, ob das Formular gültig ist ich statt off

if (!isValid(form)) 

if form.id="tbnoteform" then 
submit the form 

verwenden konnte ich immer noch versuchen, das das Schlüsselwort verwenden

Können Sie die hängen weg zu erhalten dies jedes Mal, nachdem Sie die Selektor-Anweisung zu verwenden, erstellen Sie eine Objektinstanz ?? Also Formular ist jetzt eine Objektinstanz aus dem Formular?

Richard

+0

In jQuery wird die 'thy'-Variable normalerweise in Ereignisrückrufen verwendet, um auf das Element zu verweisen, an das das Ereignis gebunden war. In @ bendewey's Code verweist es auf die '.submit'-Schaltfläche, die das Ereignis ausgelöst hat. Es wird auch in jQuery UI-Widgets verwendet, um auf das Element zu verweisen, das zum Erstellen des Widgets verwendet wurde. – brianpeiris

+0

Ja, dieser Code wird tun, was Sie erwarten. Obwohl 'form' ein jQuery-Objekt ist, müssen Sie' form.attr ('id') 'anstelle von' form.id' verwenden. P.S. Bitte aktualisieren Sie Ihre Frage, anstatt weitere Informationen als Antwort hinzuzufügen. – brianpeiris

+0

Danke Brian, ich will nicht zu viel von dem Thema abdriften Ich war gerade dabei, den Gebrauch zu lesen, aber ich möchte auch den Code verstehen, der mir gegeben wird, sonst kann ich mehrere Beiträge zu jedem kleinen Ding erstellen Ich bekomme nicht Aber ich halte das generell in Schach –

0

Ich glaube, ich in eine Syntax Problem lief

ich meine komplette Code hier haben

die Schaltfläche vom Typ Bild

$(document).ready(function(){ 
    timestamp = 0; 
    $('.delete').click(function(e) { 
      // load the form with closest (jQuery v1.3+)  
     var form = $(this).closest('form'); // check form 
     if (!form.attr('id')="noteform") {  
      e.preventDefault();  
     }  

      // or if you make the buttons of type button and not submit  
     if (form.attr('id')="noteform") {  
     form.submit(function(){ 

     $(this).parents(".pane").animate({ opacity: 'hide' }, "slow"); 
     $.post("tbnotes.php",{ 
      noteid: $("#frmnoteid").val(), 
      action: "delete", 
      time: timestamp 

     }, function(xml) { 
      addMessages(xml); 
      }); 
     return false; 
       });     

     } // end off IF(form.attr('id')="noteform") 

}); // end off $ ('. delete) .click (function (e) {

}); // end off document ready

+0

Sie vermissen ein Angebot in der dritten Zeile. Sollte '$ ('. Submit')' anstelle von '$ ('. Submit)' sein. Bitte aktualisieren Sie die aktuelle Frage erneut. Es macht keinen Sinn, der Frage in einer Antwort eine Erweiterung hinzuzufügen. – brianpeiris

+0

Ich weiß nicht, was Sie wollen zu mir die mittleren Frage ändern noch gültig ist, und andere Menschen so das gleiche Problem haben, kann ich nicht nur die Frage ändern ich immer noch Probleme haben diese eine Arbeit zu machen –

+0

auf den letzten Kommentar, das Zitat wurde durch meine Bearbeitung der Bild-Typ-Taste, die als Standardaktion gesendet hat, hat die Klasse = "löschen" beigefügt es Ich werde den Code wieder auseinander reißen auch sehen, was ist Fehler –

0

Ich habe meine Antwort komplett überarbeitet ... Es ist sauberer, einfacher und funktioniert auch für dynamisch hinzugefügte Formulare! ;-P

<script language="javascript"> 
$(function() { 
    $('form').live('specialSubmit',function() { 
     // do stuff... the form = $(this) 
     alert($(this).serialize()); // to prove it's working... 
    }); 
    bind_same_id_forms('noteform'); 
}); 
function bind_same_id_forms(id) { 
    $('form').die().live('keypress',function(ev) { 
     if(ev.keyCode == 13 && $(this).attr('id') == id) { 
      $(this).trigger('specialSubmit'); 
      return false; 
     } 
    }).children(':submit,:image').die().live('click',function(ev) { 
     if($(this).attr('id') == id) { 
      $(this).trigger('specialSubmit'); 
      return false; 
     } 
    }); 
} 
</script> 

Beispiel HTML:

<form id="noteform" action="question/save/1234" method="post"> 
    <input type="text" name="question" /> 
    <input type="text" name="answer" /> 
    <input type="submit"value="Save" /> 
</form> 
<!-- more forms --> 
<form id="noteform" action="question/save/4321" method="post"> 
    <input type="text" name="question" /> 
    <input type="text" name="answer" /> 
    <input type="submit" value="Save" /> 
</form> 
+0

Kyle, sind diese statischen Formen auf der Seite oder erstellen Sie sie auch im laufenden Betrieb –

+0

Statisch. Sie sind nur meine Versionen eines Beispiels für eine HTML-Struktur mit mehreren Formen (mit identischen IDs). Sie müssen diese Struktur jedoch nicht verwenden. Sie können HTML haben, wie Sie wollen. – KyleFarris

+0

Also, zum besseren Verständnis. Ich muss diesen Code in den Kopfbereich der Seite einfügen. Aber dann läuft es nur einmal Sollte ich die bind_same_id_forms -Funktion in den Callback der load-Methode in meine newnote() -Funktion setzen, sonst denke ich, dass ich auf das gleiche Problem stoßen, dass die neu erstellten Formulare nicht an das Click-Ereignis –

0

überarbeitete ich meinen Code Beispiel eine neue Notiz zu erstellen

Dies das Ereignis auch die neu hinzugefügte Form innerhalb der Callback einreichen legt Funktion aus dem Load-Ereignis.

Es ist ein Schritt vorwärts , weil die anderen Beispiele aus irgendeinem Grund die Arbeit nicht gemacht haben.

Ich weiß nichts über Nachteile davon, es so zu tun, noch !! Ich bin offen für alle Kommentare zu diesem Thema Wenn Sie see example

Zweck & Kommentare wollen: Die newnote Funktion zwei Argumente nimmt

-: index = die Zahl aus Notizen bereits auf der Seite

-: tbnoteid = die Notiz aus der Datenbank

Der Index soll auch wie ein Zähler der angezeigten Nachrichten handeln.

Wenn der Zähler zum Beispiel 10 überschreitet, soll er die Nachricht auf dem Kriterium löschen, das zuletzt aus der Seite und der db herauskommt (Nachricht mit dem ältesten Zeitstempel) (Logik muss auch später hinzugefügt werden)

Die einzige Aktion, die das Formular erlaubt Todo ist, löschen Sie die Nachricht aus der Datenbank und entfernen Sie sich selbst (das Container-div) von der Seite.Aus statischen Gründen wird es zuerst ausgeblendet.

Die Funktion kann mehr Argumente wie die Nachricht selbst annehmen. Wenn Benutzer die Seite eingibt, sollte die Newnote-Funktion von einer anderen Funktion aufgerufen werden, die die Nachrichten aus der Datenbank abruft, falls solche vorhanden sind.

Der Link zu erzeugen, um eine neue Notiz wird durch die Aktion aus einer anderen Form wie this example

$(document).ready(function(){ 
$('a[name=modal]').click(function(e) { //the selector is for testing purpose 
     //Cancel the link behavior 
     e.preventDefault(); 
     var $aantal = $("div.pane").size() 
    newnote($number+1,1); // second argument is supposed too come from the database 


    }); 

    function newnote(index,tbnoteid) { 


    $("div.wrapper:last").after('<div class="wrapper"></div>'); 
    $('.wrapper:last').load('tbnote.html .pane', function() { 
    $(".pane:last").prepend("testmessage"); //testpurpose 
    $('.pane:last #frmnoteid').val(tbnoteid); 

    $(this,".frm").attr('id' , index); 
    var $id = $(this).attr('id'); "); //testpurpose 
    $('.frm:last').submit(function(){ 
     $.post("tbnotes.php",{ 
     noteid: $("#frmnoteid").val(), 
     actie: "verwijder", 
     tijd: timestamp}, function(xml) { 
     addMessages(xml); 
     }); 

    alert("Hello mijn id = " + $id);"); //testpurpose 
    $(this).parents(".pane").animate({ opacity: 'hide' }, "slow"); 
    $(this).parents(".wrapper").remove(); 
    return false; 

      }); 
     }); 

} 
+0

Sie haben auf der Seite, mit der Sie verlinkt sind, sehr schlechte Codes/schlechte Praktiken. Ich möchte nicht beleidigend sein, aber vielleicht solltest du darüber nachdenken, deine Logik und HTML auf dieser Seite neu zu schreiben. Beispielsweise binden Sie ein Klickereignis an ein "" -Tag basierend auf seinem Attribut 'name'. Das ist überhaupt kein Standard. Sie sollten dort wahrscheinlich eine ID oder Klasse verwenden. Ich würde eine Klasse in dieser Situation bevorzugen, da Sie möglicherweise andere Elemente auf Ihrer Seite haben, die die gleiche Aktion auslösen. – KyleFarris

+0

nicht beleidigt, das meiste davon ist nur für Testzwecke Es war eigentlich etwas, das ich aus einem anderen Tutorial copypastete Wenn ich eigentlich auch gehe es für die Produktion zu verwenden sozusagen werde ich über jedes Detail gehen, vor allem Namenskonventionen, aber danke für die heads up –

1

ersetzt werden, wenn Sie dynamisch hinzugefügt Formularen sind, sollten Sie die live Funktion in jQuery verwenden:

$('.submit').live('click', function(e) { 

statt

$('.submit').click(function(e) { 

Dies bindet den Klick-Callback an Schaltflächen mit der Klasse submit, auch wenn neue dynamisch hinzugefügt werden.

P.S. Es tut uns leid, dass Sie sich darüber ärgern, aber die Klarstellungen, die Sie in neue Antworten auf Ihre eigene Frage einfügen, sollten an die ursprüngliche Frage angehängt und nicht als Antworten hinzugefügt werden. Sie sind technisch nicht Antworten.

+0

Brian, Sie gehen davon aus, dass die Person das Formular mit einem Klick abschicken wird. Sie könnten genauso einfach das Formular mit dem 'Enter'-Button abschicken. Sie konnten das Klicken der Übermittlungsschaltfläche sowie des keyPress-Ereignisses für die "Enter" -Taste mit der live() -Methode abfangen, aber Sie können (noch) nicht die Methode live() verwenden, um Formulare zu senden. Ich stimme Brian jedoch zu den Antworten des Einsenders zu. Sie sollten an seine ursprüngliche Frage angehängt oder als Kommentar zu den entsprechenden Antworten hinzugefügt werden. – KyleFarris

+0

@KyleFarris, Sie haben Recht, die Methode live() unterstützt derzeit keine Bindung an Ereignisse "senden". – brianpeiris

+0

Klarstellungen, ja ich verstehe. Antworten führen meist zu neuen Fragen. Das einzige, was ich versuche auch zu beachten ist, wie auch das Hauptproblem zu lösen, ohne zu viel Offtopic Entschuldigung, ich bin nicht wirklich bewusst, dass es verwirrend ist es nur mein Gedanke Prozess –

0

Was wäre der beste Weg, den einreichen Ereignis zu behandeln, wenn Sie mehr Formulare dynamisch erstellt mit der gleichen Form ID in jQuery hat?

Wenn id 'noteform' ist, zu wählen alle Form mit dieser ID:

jQuery('form[id="noteform"]') 

Vorsicht: Es ist nicht die beste Idee sein können mehrere HTML-Element (einschließlich Form) zu haben nicht eindeutige ID

Wie kann man es auf alle vorträgt machen hören?

Sie können Ereignisse auf ihrer Veranstaltung binden:

jQuery('form[id="noteform"]').submit(function(e){}); 

und später identifizieren, wenn es die richtige Form id ist, dass die einreichen ins Leben gerufen?

Obwohl durch den Selektor, es (meiner Meinung nach) gewährleistet ist mit dem richtigen id Form haben, können Sie die ID des Formulars im Fall einreichen überprüfen, indem mit diesem Objekt, zB:

jQuery('form[id="noteform"]').submit(function(e){ 
    if(this.id=='noteform') {/* do interesting stuffs */} 

    // use .index function to determine the form index from the jQuery array. 
    alert('index='+jQuery('form[id="noteform"]').index(this)); 
}); 

Wenn Sie in POC-Code-snippet interessiert sind, die ich benutze sie (Lösung) zu testen, hier ist es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled 1</title> 

<script type="text/javascript" src="jquery-1.3.2.js"></script> 

</head> 

<body> 

<form id="noteform"><div> 
<input type="submit" value="submit" /> 
</div></form> 

<form id="noteform"><div> 
<input type="submit" value="submit" /> 
</div></form> 

<form id="noteform"><div> 
<input type="submit" value="submit" /> 
</div></form> 

<script type="text/javascript"> 
/* <![CDATA[ */ 

// test for selection 
jQuery('form[id="noteform"]').each(function(i){ 
    alert('noteform #' + i); // 
}); 

// test for submission 
jQuery('form[id="noteform"]').submit(function(e){ 
    if(this.id=='noteform'){ 
    alert('index='+jQuery('form[id="noteform"]').index(this)); 
    return false; // cancel submission 
    } 
}); 

/* ]]> */ 
</script> 

</body> 

</html> 

Dank.

+0

bist du sicher, dass das funktioniert, weil es aussieht, als wäre es auch @ bendeway's Code ähnlich. Es schien nicht, auch die neuen Formen anzuhängen. Wenn Sie mein Beispiel sehen, stelle ich es in den Lade-Callback. Das scheint zu funktionieren. Ich habe auch meine ID einzigartig gemacht, indem ich eine Indexnummer hinter den Namen gesetzt habe. Sie können dies auch in der Quelle des Live-Beispiels sehen. Es ist ein bisschen klimpernd, aber es funktioniert. Es ist immer noch in der Testphase, also könnte ich einige Sachen verbessern. Weißt du, ob es einen Nachteil gibt, indem du das Event in den Load-Callback legst? –

+0

Der POC-Code funktioniert mit JQuery 1.3.2, basierend auf meinen Tests auf Safari 4b und Chrome 1. Ich habe nur versucht, die Frage zu beantworten, aber vielleicht kann ich die Frage missverstehen. Die Frage sagte explizit dieselbe ID. Eine nicht eindeutige ID zu haben, ist jedoch keine weise Idee. Es wird kein Ereignis an ein neues dynamisch hinzugefügtes Formular gebunden, nachdem die Ereignisbindung durchgeführt wurde. Ich bin mir nicht sicher, ob das in der Frage gefragt wurde, deshalb habe ich es weggelassen. Und für Load-Callback ist es definitiv eine gute Idee, es zu verwenden. Ich verwende es im POC-Code nicht nur aus Gründen der POC. ;-) Danke, Richard. – Nordin

+0

Hallo Richard, nachdem ich andere Antworten in dieser Frage gelesen habe, erklärt das, warum ich das ganze Bild hier nicht verstehen kann. Nimm das nicht als Beleidigung, wir lernen hier alle, ich stimme dem Vorschlag anderer hier zu, die Frage zu aktualisieren, als im Abschnitt "Antworten" anzuhängen. Wie auch immer, ich nehme an, Sie hatten schon alles in Ordnung, Glückwunsch. ;-) – Nordin