2013-07-16 9 views
5

Die folgenden Funktionen funktionieren, wenn ich zum ersten Mal "Add New" wähle und eine neue Option hinzufüge. Beim zweiten Mal (für ein anderes Element, das durch die Klasse unterschieden wird), fügt es dem ausgewählten Element und dem ersten Element die neue Option hinzu. Beide Elemente müssen neu hinzukommen.Warum schreibt jQuery ajax hier zweimal?

<script type="text/javascript"> 

     $('#upload_form option[value="addnew"]').click(function(){ 

      // Show modal window 
      $('#add-new').modal('show'); 

      // Get the class 

      var Classofentry = $(this).attr("class");   

      $('#add-new-submit').on('click', function(){     

       // Get new option from text field 
       var value = $('#add-new-text').val(); 
       console.log(value); 

       $.ajax({ 
        type: "POST", 
        url: "<?php echo site_url(); ?>main/change_options", 
        data: {new_option: value, new_option_class: Classofentry}, 
        dataType: "html", 
        error: errorHandler, 
        success: success 
        }); 

       function success(data) 
       { 

        $('#'+Classofentry).append("<option value='" + data + "'selected=\"selected\">" + data + "</option>"); 
        //alert(data); 

        //alert('Success!'); 

       } 

       function errorHandler() 
       { 
        alert('Error with AJAX!'); 
       } 

       $('#add-new').modal('toggle'); 

      }); 
     }); 

    </script> 

Die komische Sache ist, dass es scheint, zweimal durch den Ajax einen Pfosten zu durchlaufen. Ich nehme an, dass es alle "neuen" Werte gibt (es gibt bisher 2, es wird mehr geben). Wie bekomme ich es, das Element nur mit der angegebenen Klasse zu behandeln? Hoffe, das macht Sinn.

+1

Jedes Mal, wenn Sie auf #upload_form Option auf [value = „addnew“], fügen Sie einen neuen Klick-Handler # Hinzufügen-Neu-Senden Klicken Sie 5 mal auf die erste, jetzt ein Klick auf die zweite wird 5 mal auslösen! – Robert

+0

@Robert: Wie mache ich das bei der Abwahl des Modals rückgängig? I.e. Wenn die Option #upload_form [value = "addnew"] angeklickt wird, wird das Modal durch Anklicken beendet. – MysticalTautologist

Antwort

4

Danke für Ihre Antworten! Ich habe einen Weg gefunden, es zum Laufen zu bringen, indem ich die Klicks verschachtelt, aber die zweite klicke. Ich konnte nicht die vorgeschlagenen Lösungen (die alle Funktionen aufnimulieren) erhalten. Es scheint keine Möglichkeit zu geben, den zweiten Klick zu funktionieren, wenn sie nicht verschachtelt sind. Ich bin mir nicht sicher warum. Es ist auch notwendig, dass die Funktionen success und errorHandler in der Funktion ajax aufgerufen werden. Hier ist der Code (identisch die Frage oben, aber mit der unbind Anweisung in dem zweiten verschachtelten Klick):

<script type="text/javascript"> 

     var Classofentry = ''; 

     $('#upload_form option[value="addnew"]').click(function(){ 

      // Show modal window 
      $('#add-new').modal('show'); 

      // Get the class 
      var Classofentry = $(this).attr("class"); 
      console.log(Classofentry);Thanks    

     $('#add-new-submit').on('click', function(){     

      // Get new option from text field 
      var value = $('#add-new-text').val(); 
      console.log(value); 

      $.ajax({ 
       type: "POST", 
       url: "<?php echo site_url(); ?>main/change_options", 
       data: {new_option: value, new_option_class: Classofentry}, 
       dataType: "html", 
       error: errorHandler, 
       success: success 
       }); 

      $('#add-new-submit').unbind('click') // <-------------- The answer!!!!! 
      $('#add-new').modal('toggle'); 


      function success(data) 
      { 

       //$('#animal_species').append("<option value='" + data + "'selected=\"selected\">" + data + "</option>"); 
       $('#'+Classofentry).append("<option value='" + data + "'selected=\"selected\">" + data + "</option>"); 
       //alert(data); 

       //alert('Success!'); 

      } 

      function errorHandler() 
      { 
       alert('Error with AJAX!'); 
      } 
     }); 
     }); 

    </script> 
+1

rette mein Leben! Danke, Mann! – Rubyrider

2

Die Klickereignisse nicht verschachteln.

Das Problem hierbei ist, dass Sie Click-Ereignis auf $('#add-new-submit') jedes Mal, binden Sie das Click-Ereignis auf $('#upload_form option[value="addnew"]') ausgelöst wird

Ihr Skript sollte wie folgt aussehen

var Classofentry; 
$('#upload_form option[value="addnew"]').click(function() { 

    // Show modal window 
    $('#add-new').modal('show'); 
    // Get the class 
    Classofentry = $(this).attr("class"); 
}); 

$('#add-new-submit').on('click', function() { 

    // Get new option from text field 
    var value = $('#add-new-text').val(); 
    console.log(value); 

    $.ajax({ 
     type: "POST", 
     url: "<?php echo site_url(); ?>main/change_options", 
     data: { 
      new_option: value, 
      new_option_class: Classofentry 
     }, 
     dataType: "html", 
     error: errorHandler, 
     success: success 
    }); 
    $('#add-new').modal('toggle'); 

}); 

function success(data) { 
    $('#' + Classofentry) 
     .append("<option value='" 
       + data + "'selected=\"selected\">" + data + "</option>"); 
    //alert(data); 

    //alert('Success!'); 
} 

function errorHandler() { 
    alert('Error with AJAX!'); 
} 
+0

Vielen Dank für Ihre Antwort. Ich habe es versucht und jetzt mein modales Fenster tut nichts, nachdem ich den Text eingeben und klicken Sie auf die Schaltfläche Hinzufügen. Wie trigge ich das modale Fenster an, um die Texteingabe zu akzeptieren, ohne die beiden Klickereignisse zu verschachteln? – MysticalTautologist

+0

Überprüfen Sie auf Fehler in Ihrer Konsole –

+0

Die Konsole ist sauber, da die Schaltfläche Hinzufügen keine Auswirkung hat. – MysticalTautologist

0

Korrekter Code:

var Classofentry = ''; 
$('#upload_form option[value="addnew"]').click(function(){ 
// Show modal window 
$('#add-new').modal('show'); 
    Classofentry = $(this).attr("class"); // Get the class 
});   



$('#add-new-submit').on('click', function(){     

// Get new option from text field 
var value = $('#add-new-text').val(); 
console.log(value); 

$.ajax({ 
    type: "POST", 
    url: "<?php echo site_url(); ?>main/change_options", 
    data: {new_option: value, new_option_class: Classofentry}, 
    dataType: "html", 
    error: errorHandler, 
    success: success 
}); 

function success(data){ 

    $('#'+Classofentry).append("<option value='" + data + "'selected=\"selected\">" + data + "</option>"); 
    //alert(data); 

    //alert('Success!'); 

} 

function errorHandler(){ 
    alert('Error with AJAX!'); 
} 

$('#add-new').modal('toggle'); 

}); 
Verwandte Themen