Onay kutusu girişleri yalnızca işaretlenmişlerse veri gönderir mi?


184

Tarayıcılar için onay kutusu giriş değeri verilerini yalnızca form gönderildiğinde işaretlenirse göndermek standart bir davranış mıdır?

Herhangi bir değer verisi sağlanmazsa, varsayılan değer her zaman "açık" mıydı?

Yukarıdakilerin doğru olduğunu varsayarsak, bu tüm tarayıcılarda tutarlı bir davranış mıdır?

Yanıtlar:


187

Evet, standart davranış, değerin yalnızca onay kutusu işaretliyse gönderilmesidir. Bu genellikle, sunucudaki tüm onay kutularını beklediğinizi hatırlamanın bir yoluna sahip olmanız gerektiği anlamına gelir, çünkü tüm veriler formdan geri gelmez.

Varsayılan değer her zaman "açık" dır, bu tarayıcılar arasında tutarlı olmalıdır.

Bu, W3C HTML 4 önerisinde ele alınmıştır :

Onay kutuları (ve radyo düğmeleri), kullanıcı tarafından değiştirilebilen açma / kapama düğmeleridir. Kontrol elemanının kontrol edilen özelliği ayarlandığında bir anahtar "açıktır". Bir form gönderildiğinde, yalnızca "açık" onay kutusu denetimleri başarılı olabilir.


18
Ne yazık ki bu acı verici, sadece işaretli onay kutuları işaretlenmemiş sunucuya gönderilir. Sayfada hangi onay kutularının olduğunu önceden biliyorsanız, bunları yönetmek için sunucu tarafı komut dosyasında sorun olmaz. Sorun, bazı iş mantığına bağlı olarak önceden - dinamik olarak oluşturulmuş onay kutularının sayfada olmadığını bilmenizdir. Ardından, bu onay kutuları için hileler yapmalı ve paralel gizleme giriş alanlarını kullanmalı ve bunları JavaScript ile yerine getirmelisiniz.
sbrbot

Bir tutarlı doğrulayıcı "izin başarısız kontroller (yani type =" checkbox ") yaratmanın anahtarı olarak bu form denetimlerini atama yetkisine geçici Başarılı olamadıkları zaman dinamik buna göre sterilizatör ve doğrulayıcı değiştirmez..
Anthony Rutledge

3
Çözüm: <select>iki seçenekle birlikte kullanın onve off:-)
andy

83

HTML'de, her <input />öğe tek bir (ancak benzersiz olmayan) ad ve değer çiftiyle ilişkilendirilir. Bu çift sonraki istekte (bu durumda POST istek gövdesi) yalnızca <input />"başarılı" ise gönderilir.

Yani <form>DOM'nizde bu girişler varsa :

<input type="text"     name="one"   value="foo"                        />
<input type="text"     name="two"   value="bar"    disabled="disabled" />
<input type="text"     name="three" value="first"                      />
<input type="text"     name="three" value="second"                     />

<input type="checkbox" name="four"  value="baz"                        />
<input type="checkbox" name="five"  value="baz"    checked="checked"   />
<input type="checkbox" name="six"   value="qux"    checked="checked" disabled="disabled" />
<input type="checkbox" name=""      value="seven"  checked="checked"   />

<input type="radio"    name="eight" value="corge"                      />
<input type="radio"    name="eight" value="grault" checked="checked"   />
<input type="radio"    name="eight" value="garply"                     />

Sunucuya gönderilecek bu ad + değer çiftlerini oluşturur:

one=foo
three=first
three=second
five=baz
eight=grault

Dikkat:

  • twove özellik ayarlarına sixsahip oldukları için hariç tutuldu disabled.
  • three aynı ada sahip iki geçerli girişi olduğu için iki kez gönderildi.
  • fourBir çünkü gönderilmedi checkboxolmadığınıchecked
  • sixdaha yüksek bir önceliğe sahip checkedolduğu için olmasına rağmen gönderilmedi disabled.
  • sevenname=""gönderilen bir özniteliği olmadığından gönderilmez.

Sorunuzla ilgili olarak: işaretlenmemiş bir onay kutusunun adının + değer çiftinin sunucuya gönderilmeyeceğini görebilirsiniz - ancak aynı adı paylaşan diğer girdiler de gönderilir.

ASP.NET MVC gibi çerçeveler, her checkboxgirdiyi hiddenişlenen HTML'deki bir girdiyle (gizlice) eşleştirerek bu şekilde çalışır:

@Html.CheckBoxFor( m => m.SomeBooleanProperty )

çizer:

<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden"   name="SomeBooleanProperty" value="false" />

Kullanıcı onay kutusunu işaretlemezse, sunucuya aşağıdakiler gönderilir:

SomeBooleanProperty=false

Kullanıcı onay kutusunu işaretlerse, her ikisi de gönderilir:

SomeBooleanProperty=true
SomeBooleanProperty=false

Ancak sunucu, =falsesürümü gördüğünden sürümü görmezden gelir =trueve böylece görmezse =true, onay kutusunun oluşturulduğunu ve kullanıcının hiç kontrol etmediği SomeBooleanPropertygirişlerin aksine, onu kontrol etmediğini belirleyebilir .


Ek gizli metin kutusu gibi birden çok alanınız varsa, arka ucun bir dizi değer alacağını belirtmek gerekir.
Salam

Yalnızca []giriş adının sonunda kullanırsanız bir dizi alır ; varsayılan davranış, yalnızca gizli ad onay kutusunun önünde olduğu sürece, bu ada sahip son öğeyi göndermektir.
beeglebug

Aynı ada sahip iki alana (gizli alan + onay kutusu alanı) sahip olarak ve onay kutusunu işaretleyerek, gönderi değeri, değerlerin virgülle ayrılmış bir dizesidir; "0,1" gibi bir şey
ʞᴉɯ

1
@beeglebug Açıkladığınız şey PHP'nin isimleri ve değerleri nasıl ele aldığıdır, []sonek HTML spesifikasyonunun bir parçası değildir ve tarayıcılar özel olarak ele almazlar. []PHP olmadan tüm değerler yerine yalnızca tek bir değere (son değer) erişime izin verir.
Dai

1
PHP ile GET ve POST kullanarak test ettiğim tüm tarayıcılarda onay kutusunu kullanmadan önce gizli özelliği kullanmak . Onay kutusu denetiminden sonra yerleştirdiğimde sonuç her zaman yanlış oldu.
adrianwadey

16

Onay kutusu işaretli değilse, form gönderildiğinde gönderilen verilere katkıda bulunmaz.

HTML5 bölümü 4.10.22.4 Form veri kümesinin oluşturulması, form verilerinin oluşturulma şeklini açıklar:

Aşağıdaki koşullardan herhangi biri karşılanırsa, bu öğe için bu alt adımları atlayın: [...]

Alan öğesi, type özniteliği Checkbox durumunda olan ve denetimi yanlış olan bir girdi öğesidir.

ve eksikse varsayılan değer onbelirtilir value:

Aksi takdirde, field öğesi, type özelliği Checkbox durumunda veya Radio Button durumunda olan bir girdi öğesiyse, bu iç içe geçmiş alt adımları çalıştırın:

Alan öğesinde belirtilen bir değer özelliği varsa, değerin bu özelliğin değeri olmasına izin verin; aksi takdirde, değer "on" dizesi olsun.

Bu nedenle, form verisi oluşturma sırasında denetlenmeyen onay kutuları atlanır.

Benzer davranış HTML4 altında gereklidir . Bu davranışı tüm uyumlu tarayıcılardan beklemek mantıklıdır.


10

Onay kutuları, yalnızca onay kutusu işaretliyse 'on' değerini gönderir. Gizli girişleri kullanabileceğiniz onay kutusu değerini yakalamak

JS :

var chk = $('input[type="checkbox"]');
    chk.each(function(){
        var v = $(this).attr('checked') == 'checked'?1:0;
        $(this).after('<input type="hidden" name="'+$(this).attr('rel')+'" value="'+v+'" />');
    });

chk.change(function(){ 
        var v = $(this).is(':checked')?1:0;
        $(this).next('input[type="hidden"]').val(v);
    });

HTML :

<label>Active</label><input rel="active" type="checkbox" />

8

Tarayıcılar için onay kutusu giriş değeri verilerini yalnızca form gönderildiğinde işaretlenirse göndermek standart bir davranış mıdır?

Evet, aksi takdirde onay kutusunun gerçekten işaretlenip işaretlenmediğini belirlemenin sağlam bir yolu olmayacaktır (değeri değiştirdiyse, kontrol edildiyse istediğiniz değerin olduğu ile aynı olması durumunda durum olabilir ile değiştirildi).

Herhangi bir değer verisi sağlanmazsa, varsayılan değer her zaman "açık" mıydı?

Diğer cevaplar "açık" ın varsayılan olduğunu onaylar. Ancak, değerle ilgilenmiyorsanız sadece şunu kullanın:

if (isset($_POST['the_checkbox'])){
    // name="the_checkbox" is checked
}

7

Hemen hemen tüm tarayıcılarda tutarlı olması gereken HTML 4 spesifikasyonlarından:

http://www.w3.org/TR/html401/interact/forms.html#checkbox

Onay kutuları (ve radyo düğmeleri), kullanıcı tarafından değiştirilebilen açma / kapama düğmeleridir. Kontrol elemanının kontrol edilen özelliği ayarlandığında bir anahtar "açıktır". Bir form gönderildiğinde, yalnızca "açık" onay kutusu denetimleri başarılı olabilir.

Başarılı aşağıdaki gibi tanımlanır:

Başarılı bir kontrol, gönderim için "geçerlidir". Her başarılı kontrolün kontrol adı, gönderilen form veri kümesinin bir parçası olarak geçerli değeri ile eşleştirilir. Başarılı bir denetim bir FORM öğesi içinde tanımlanmalı ve bir denetim adına sahip olmalıdır.


5

girdi türü = "gizli" ad = "is_main" değer = "0"

girdi türü = "onay kutusu" adı = "is_main" değer = "1"

böylece uygulamada yaptığım gibi kontrol edebilirsiniz. kontrol ederse 1 değerini gönderin aksi takdirde 0


3

Yukarıdaki cevapların hiçbiri beni tatmin etmedi. En iyi çözüm, aynı ada sahip her onay kutusu girişinden önce gizli bir giriş eklemektir .

<input type="hidden" name="foo[]" value="off"/>

<input type="checkbox" name="foo[]"/>

Daha sonra sunucu tarafında, küçük bir algoritma kullanarak HTML gibi daha fazla şey elde edebilirsiniz.

function checkboxHack(array $checkbox_input): array
{
    $foo = [];
    foreach($checkbox_input as $value) {
        if($value === 'on') {
            array_pop($foo);
        }
        $foo[] = $value;
    }
    return $foo;
}

Bu ham girdi olacak

array (
    0 => 'off',
    1 => 'on',
    2 => 'off',
    3 => 'off',
    4 => 'on',
    5 => 'off',
    6 => 'on',
),

Ve fonksiyon geri dönecek

array (
    0 => 'on',
    1 => 'off',
    2 => 'on',
    3 => 'on',
)  

1

Dinamik olarak onay kutusu üreten bir sayfa (form) var, bu nedenle bu cevaplar çok yardımcı oldu. Benim çözümüm buradaki birçok kişiye çok benziyor ancak uygulanmasının daha kolay olduğunu düşünemiyorum.

İlk önce onay kutuma uygun gizli bir giriş kutusu koydum, yani

 <td><input class = "chkhide" type="hidden" name="delete_milestone[]" value="off"/><input type="checkbox" name="delete_milestone[]"   class="chk_milestone" ></td>

Şimdi tüm checkboxesseçilmemişse gizli alan tarafından döndürülen değerlerin tümü kapalı olacaktır.

Örneğin, burada dinamik olarak eklenen beş onay kutusuyla POSTSaşağıdaki değerleri oluşturun:

  'delete_milestone' => 
array (size=7)
  0 => string 'off' (length=3)
  1 => string 'off' (length=3)
  2 => string 'off' (length=3)
  3 => string 'on' (length=2)
  4 => string 'off' (length=3)
  5 => string 'on' (length=2)
  6 => string 'off' (length=3)

Bu, yalnızca 3. ve 4. onay kutularının onveya olduğunu gösterir checked.

Aslında, kukla veya gizli giriş alanı , kapalı dizinin altında bir "açık" olmadığı sürece her şeyin kapalı olduğunu gösterir , bu da size tek bir istemci tarafı kodu olmadan ihtiyacınız olan dizini verir.

.


0

Tıpkı ASP.NET varyantı gibi, gizli girdiyi aynı adla (aynı adın) gerçek onay kutusunun önüne koyun. Yalnızca son değerler gönderilir. Bu şekilde bir kutu işaretlenirse adı ve değeri "on" gönderilirken, işaretlenmezse karşılık gelen gizli girişin adı ve vermek istediğiniz değer gönderilir. Sonunda $ _POST dizisini, içinde işaretlenmiş ve işaretlenmemiş tüm elemanlar, "açık" ve "yanlış" değerler, yinelenen anahtarlar olmadan okuyacaksınız. PHP ile işlenmesi kolaydır.


0

Form gönderilmeyecek kontrol edilmemiş onay kutuları ile aynı sorunu yaşarken, onay kutusu öğelerini yansıtmaktan başka bir çözüm buldum.

İşaretlenmemiş tüm onay kutularını

var checkboxQueryString;

$form.find ("input[type=\"checkbox\"]:not( \":checked\")" ).each(function( i, e ) {
  checkboxQueryString += "&" + $( e ).attr( "name" ) + "=N"
});

-2

Bu kodla ilgili sorunu çözdüm:

HTML Formu

<input type="checkbox" id="is-business" name="is-business" value="off" onclick="changeValueCheckbox(this)" >
<label for="is-business">Soy empresa</label>

ve javascript işlevini kullanarak onay kutusu değer formunu değiştirin:

//change value of checkbox element
function changeValueCheckbox(element){
   if(element.checked){
    element.value='on';
  }else{
    element.value='off';
  }
}

ve sunucu veri gönderisinin "açık" veya "kapalı" olup olmadığını kontrol etti. Playframework java kullandım

        final Map<String, String[]> data = request().body().asFormUrlEncoded();

        if (data.get("is-business")[0].equals('on')) {
            login.setType(new MasterValue(Login.BUSINESS_TYPE));
        } else {
            login.setType(new MasterValue(Login.USER_TYPE));
        }
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.