Onay kutuları arasında dolaşın ve işaretli veya işaretli olmayan her birini sayın


82

Bir sorunla karşılaştım. İşte kısa bir açıklama.

Standart bir formda 12 onay kutum var. Yapmam gereken şey, her birini gözden geçirmek ve hangilerinin kontrol edildiğini ve hangilerinin kontrol edilmediğini öğrenmek.

Bunu kullanarak, daha sonra bir veritabanı alanına girdiğim bir dize oluşturabilirim. İşte bir örnek.

(Kontrol1 - işaretlendi)
(Kontrol2 - işaretlenmedi)
(Kontrol3 - işaretlendi)

1,0,1

Şimdiye kadar, bu biraz kod aldım.

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

Tamamen değil, yalnızca işaretlenmiş olanları geri getirmesi dışında mükemmel çalışır.

Yeni soru için özür dilerim. Ben jquery'de yeniyim.


5
Veritabanı şemanızı yeniden tasarlamalısınız.
SLaks

Nasıl yeniden tasarlanmalı? Bir alanda bir grup onay kutusu depolamak, her onay kutusu için bir alana sahip olmaktan daha iyi değil mi?
Richard M

4
Bu açıkça onay kutularının ne olduğuna bağlıdır, ancak muhtemelen tek tek alanlar veya bir alt tablo kullanmalısınız (her satırda [işaretli] onay kutusu için bir alan olacak şekilde)
SLaks

"Bir alanda bir grup onay kutusu depolamak, her onay kutusu için bir alana sahip olmaktan daha iyi değil mi?" Hayır, birler ve sıfırlar bit olarak depolanmadığı için bayt olarak saklanır. Virgülle ayrılmış değerli bir bit listesini tek bir alanda saklama nedeniniz verimlilik içinse, virgülü kaybedip bunun yerine bitsel ve maske işlemlerini kullanın. Mysql bu günlerde bit veri tipini uygulamış olsa da, kredi kartı çiplerini programlamıyorsanız veya kesinlikle çok hızlı bir şeye ihtiyacınız olmadıkça bitsel ve maske gerekli olmayabilir.
Blue Water

Yanıtlar:


127

Tam olarak gösterdiğiniz biçimde bir sonuç dizesi oluşturmak için şunu kullanabilirsiniz:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

Ancak @SLaks'a katılıyorum, bunu veritabanınızda saklayacağınız yapıyı yeniden düşünmeniz gerektiğini düşünüyorum.

DÜZENLEME : Üzgünüm, aradığınız çıktı biçimini yanlış okudum. İşte bir güncelleme:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);

1
Anladığım kadarıyla, 1s ve 0lerde bir dizi istiyor .
SLaks

Teşekkürler. Bunu deneyeceğim ve size haber vereceğim.
Richard M

Hmm. Bunu denedim, ancak tüm js dosyasını konsol günlüğünde görüntüledi.
Richard M

1
Ben kullanamazsınız Bu ancak ihtiyaç kullanmak (bu) $
V-SHY

1
@ Si8 - Keman'ı güncelledim, bu yüzden kod seçilmemiş onay kutularını yok sayıyor, bu da ekstra virgüllerin önüne geçmeli
Ed Schembor

61

Seçicileri Kullanma

Tüm işaretli onay kutularını şu şekilde alabilirsiniz:

var boxes = $(":checkbox:checked");

Ve tüm kontrol edilmeyenler şöyle:

var nboxes = $(":checkbox:not(:checked)");

Bu koleksiyonlardan herhangi biri arasında geçiş yapabilir ve bu isimleri saklayabilirsiniz. Eksik bir şey varsa, kontrol edildiğini veya olmadığını bilirsiniz. PHP'de, kontrol edilmiş bir dizi adınız varsa, in_array()belirli bir kutunun daha sonraki bir tarihte işaretlenip işaretlenmeyeceğini bilmek için basitçe bir istekte bulunabilirsiniz.

Seri hale getir

jQuery ayrıca form denetimlerinizin durumunu koruyacak bir serileştirme yöntemine sahiptir. Örneğin, jQuery'nin web sitesinde verilen örnek aşağıdaki gibidir:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

Bu, hangi öğelerin kontrol edildiğini de saklamanızı sağlayacaktır.


16

Yazarak tüm onay kutuları arasında geçiş yapabilirsiniz $(':checkbox').each(...).

Sorunuzu doğru anladıysam, aşağıdaki kodu arıyorsunuz:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

Bu kod, tüm onay kutularının üzerinden geçecek ve ya 1,ya 0,da bir dizeye ekleyecektir .


Teşekkürler. Bunu da deneyecek.
Richard M

Ayrıca değer özelliğini de kullanabilirsiniz. İkili bir değer yaratmaya çalışıyorsanız, her bir onay kutusuna 2'lik bir yükselme gücü verin ve sadece işaretlenmiş olanları ekleyin, ikilideki toplam, birler ve sıfırların eklenmesiyle aynı olacaktır. 32 onay kutusuyla sınırlandırılacaksınız (en büyük sayısal değer JavaScript'te 2 ^ 32'dir [sanırım 64 olabilir]. Daha iyi bir veritabanı tasarımı daha esnek olabilir)
Jason Sperske

0

Orijinal gönderide öne sürülen şema hususlarına yeterince zaman ayrıldığını sanmıyorum. İşte yeni başlayanlar için dikkate alınması gereken bir şey.

Diyelim ki devam ettiniz ve bu çözümü inşa ettiniz. Tüm temel değerleriniz tek bir değerde toplanır ve veritabanında saklanır. Veritabanınızda gerçekten [biraz] yer ve biraz zaman kodlaması kazanıyorsunuz.

Şimdi, mevcut onay kutuları 3 ve 4 arasına yeni bir onay kutusu ekleme görevini sık ve kolay bir şekilde gerçekleştirmeniz gerektiğini düşünelim. Geliştirme yöneticiniz, müşteriniz, bunun basit bir değişiklik olmasını beklerse.

Böylece, onay kutusunu kullanıcı arayüzüne eklersiniz (kolay kısım). Döngü kodunuz, kaç onay kutusu olursa olsun değerleri zaten birleştirirdi. Ayrıca, veritabanı alanınızın sadece bir varchar veya başka bir dize türü olduğunu anlıyorsunuz, bu yüzden de iyi olmalı.

Müşterileriniz veya siz değişiklikten önceki verileri görüntülemeye çalıştığınızda ne olur? Esasen soldan sağa diziliyorsunuz. Ancak, şimdi 3'ten sonraki değerlerin tümü 1 karakter farkla kapalıdır. Tüm mevcut verilerinizle ne yapacaksınız? Bir uygulama yazacak, hepsini veritabanından çıkaracak, yeni soru konumu için varsayılan bir değer eklemek üzere işleyecek ve ardından hepsini veritabanında depolayacak mısınız? Bir hafta veya bir ay arayla birkaç yeni değeriniz olduğunda ne olur? Ya konumları taşırsanız ve jQuery bunları farklı bir sırayla işlerse? Tüm verileriniz toplanır ve yeniden düzenlemek için yeniden işlenmesi gerekir.

Sıkı bir anahtar-değer ilişkisi SAĞLAMAMANIN tüm kavramı ludacris'tir ve başınızı belaya sokmaktan ziyade en kısa zamanda sonuçlanacaktır. Bunu düşünenler için lütfen yapma. Şema değişiklikleri için diğer öneriler gayet iyi. Bir alt tablo, ana tabloda daha fazla alan, soru-cevap tablosu vb. Kullanın. Bu verilerin yapısı değişebileceğinde, etiketsiz verileri saklamayın.


-1
$.extend($.expr[':'], {
        unchecked: function (obj) {
            return ((obj.type == 'checkbox' || obj.type == 'radio') && !$(obj).is(':checked'));
        }
    });

$("input:checked")
$("input:unchecked")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.