2009-10-12 7 views
8

Warum wird nur ein Wert des Kontrollkästchens "db" an das serverseitige Skript gesendet?Post-Array mit mehreren Checkbox-Werten

JQUERY:

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 
    var db = []; 
    $.each($('.db:checked'), function() { 
     db.push($(this).val()); 
    }); 
    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {db: db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 

HTML:

<input type="checkbox" name="db[]" class="db" value="track"/><label for="track">track</label></br> 
<input type="checkbox" name="db[]" class="db" value="gps"/><label for="gps">gps</label></br> 
<input type="checkbox" name="db[]" class="db" value="accounting"/><label for="accounting">accounting</label></br> 

bearbeiten: beendet ich meine eigene Frage zu beantworten, aber jemand Dokumentation hat (oder eine Erklärung), warum das ist notwendig? Es war schwierig für mich, die genaue Antwort (also die posthume Post) zu finden.

+0

Sicher, es ist dokumentiert, da Sie verwenden PHP als serverseitiges Skript, schau hier: http://www.php.net/manual/en/faq.html.php#faq.html.arrays und hier: http://www.php.net/manual/ en/language.variables.external.php –

+1

Etwas außerhalb des Themas sollte der 'for'-Wert des Labels liegen sei die Eingabe-ID, nicht der Eingabewert. –

Antwort

15

Ich stimme @jjclarkson zu. Nur hinzufügen, anstatt Ihre ids auf ein Array von Schiebe, können Sie $.map verwenden:

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 

    var db = $('.db:checked').map(function(i,n) { 
     return $(n).val(); 
    }).get(); //get converts it to an array 

    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {'db[]': db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 
+0

Ist es effizienter, .map() zu verwenden? – jjclarkson

+0

@jjclarkson - nicht sicher, aber es ist kürzer und sichtbarer. Das heißt, ich hatte den $ .each-Ansatz verwendet, bis ich $ .map entdeckte, ich habe keinen Unterschied bemerkt, aber im Allgemeinen glaube ich nicht, dass man einen Unterschied für einen kleinen bis mittelgroßen Datensatz feststellen wird. – karim79

4

Sie müssen die eckigen Klammern haben, um ein Array [] für den übergebenen Variablennamen anzugeben.

{'db[]': db} 

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 
    var db = []; 
    $.each($('.db:checked'), function() { 
     db.push($(this).val()); 
    }); 
    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {'db[]': db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 
1

$('input[name="mycheckboxes"]:checked').map(function(){ return $(this).val(); }).get().join(",");

dann explodieren in PHP $mycheckboxes = explode(',',$_GET['mycheckboxes']);

5
var checkeditems = $('input:checkbox[name="review[]"]:checked') 
         .map(function() { return $(this).val() }) 
         .get() 
         .join(","); 
$.ajax({ 
    type: "POST", 
    url: "/index.php/openItems/", 
    data: "ids=" + checkeditems,           
    success: function(msg) { $(".mainContainer").html(msg); } 
});