Düğmeleri ve bağlantıları devre dışı bırakmanın / etkinleştirmenin en kolay yolu nedir (jQuery + Bootstrap)


360

Bazen düğme olarak şekillendirilmiş ankrajlar, bazen de sadece düğmeler kullanıyorum. Belirli tıklama öğelerini devre dışı bırakmak istiyorum, böylece:

  • Engelli görünüyorlar
  • Tıklanmayı bırakırlar

Bunu nasıl yapabilirim?


yazımı alt uçta görüyorsunuz ancak işte daha az açıklayıcı $ ("Seçiciniz"). düğmesi ("etkinleştir"); // düğmeyi etkinleştirin veya $ ("seçiciniz"). düğmesini ("devre dışı bırak"); // jqueryUI'den düğme widget'ı kullanılıyorsa düğmeyi devre dışı bırakın.
El Bayames

BS3 belgeleri role="button"bağlantılar için kullanıldığını söylüyor , ancak bunun bu sorunu etkilediği görülmüyor. getbootstrap.com/css/#buttons
Jess

2
Having a.btn[disabled]devre dışı görünür henüz tıklanabilir kalır IMO Bootstrap bir hata olduğunu. Özellik [disabled]yalnızca buttonve için devre dışı bırakılmış olarak görünmelidir input.
Jess

Yanıtlar:


575

Düğmeler

disabledTarayıcı tarafından işlenen bir düğme özelliği olduğu gibi düğmelerin devre dışı bırakılması kolaydır :

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

Bunları özel bir jQuery işleviyle devre dışı bırakmak için aşağıdakilerden faydalanırsınız fn.extend():

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

JSFiddle devre dışı düğmesi ve giriş demosu .

Aksi takdirde jQuery'nin prop()yöntemini kullanırsınız:

$('button').prop('disabled', true);
$('button').prop('disabled', false);

Bağlantı Etiketleri

Sabitleme etiketleri için geçerli bir özellikdisabled olmadığını belirtmek gerekir . Bu nedenle, Bootstrap öğelerinde aşağıdaki stili kullanır :.btn

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

[disabled]Özelliğin ve bir .disabledsınıfın nasıl hedeflendiğine dikkat edin . .disabledSınıf bir bağlantı etiketi devre dışı görünür hale getirmek için gerekli olan budur.

<a href="http://example.com" class="btn">My Link</a>

Tabii ki, bu tıklandığında bağlantıların çalışmasını engellemez. Yukarıdaki bağlantı bizi http://example.com adresine götürecektir . Bunu önlemek disablediçin, çağıracağınız sınıfla bağlantı etiketlerini hedeflemek için basit bir jQuery kodu parçası ekleyebiliriz event.preventDefault():

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

disabledSınıfı kullanarak şunları değiştirebiliriz toggleClass():

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

JSFiddle bağlantı demosunu devre dışı bıraktı .


kombine

Ardından, devre dışı bırakmaya çalıştığımız öğenin türünü kontrol etmek için yukarıda yapılan önceki devre dışı bırakma işlevini genişletebiliriz is(). Bu şekilde toggleClass(), bir inputveya buttonöğe değilse veya disabledözelliği şu şekilde değiştiririz:

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

Tam birleşik JSFiddle demosu .

Yukarıdaki işlevin tüm giriş türlerinde de çalışacağını belirtmek gerekir.


Kapsamlı cevap için teşekkürler. Kahve betiği sürümü için lütfen Düzenleme 1'e bakın . Hala tıklamayı önlemek için bağlantılar almak için mücadele ediyorum. return false if $(@).prop('disabled')Özel tıklama işleyicilerinde kalmamı mı kastettiniz ? Bu hat olmadan, bu işleyiciler ne olursa olsun çalıştırılır.
biyofraktal

1
Bahsettiğim gibi @biofractal disabledgeçerli bir tutturma etiketi özelliği değil, bu yüzden kullanılmamalıdır. Verdiğim tıklama etkinliği .disabledsınıfa dayanıyor , ancak kullanabileceğiniz şey hasClass('disabled')- bu doğruysa preventDefault,.
James Donnelly

Ah tamam. Teşekkürler. Öyleyse neden disabledbağlantıdaki özelliği oluşturup kullanmamalıyım . Dinamik bir nesne, bu yüzden sadece çapanın özellik setini genişletiyormuşum gibi ayarlayabilir ve kullanabilir miyim? Bunu göstermek için aşağıdaki cevabımı güncelledim. Ne düşünüyorsun? Kötü mü? Ayrıca, gerekiyor bir bağlantı yeniden etkinleştirmek zaman click olayı? .off()preventDefault
biyofraktal

Şartnameye aykırıdır ve doğrulama testlerini geçmez. Özel bir disabledözellik istiyorsanız, data-*özniteliklerden yararlanabilirsiniz . Bootstrap zaten aynı disabledözellik stillerini uyguladığından class="disabled", sınıfa da güvenebilirsiniz.
James Donnelly

Anladım - Cevabımı yorumlarınızı yansıtacak şekilde uyarladım. Hala preventDefaulttüm çapa tıklama olaylarını bağlarsanız o zaman bağlantı yeniden etkinleştirildiğinde onları ayırmak gerekir endişeliyim . Yoksa bir şeyi yanlış mı anlıyorum?
biyofraktal

48

Daha basit / daha kolay bir yol düşünemiyorum! ;-)


Bağlantı etiketlerini (Bağlantılar) kullanma:

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

Bağlantı etiketini etkinleştirmek için:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");

resim açıklamasını buraya girin


Bağlantı etiketini devre dışı bırakmak için:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

resim açıklamasını buraya girin


27

Metin alanınız ve gönder düğmeniz olduğunu varsayalım,

<input type="text" id="text-field" />
<input type="submit" class="btn" value="Submit"/>

Devre Dışı Bırakılması:

Herhangi bir düğmeyi devre dışı bırakmak için, örneğin, düğmeyi gönder , devre dışı bırakılmış özniteliği,

$('input[type="submit"]').attr('disabled','disabled');

Yukarıdaki satırı yürüttükten sonra, gönder düğmesi html etiketiniz şöyle görünür:

<input type="submit" class="btn" value="Submit" disabled/>

'Devre dışı' özelliğinin eklendiğine dikkat edin .

etkinleştirme:

Etkinleştirmek için, örneğin metin alanında biraz metin olduğunda. Düğmeyi etkinleştirmek için devre dışı bırak özniteliğini kaldırmanız gerekir.

 if ($('#text-field').val() != '') {
     $('input[type="submit"]').removeAttr('disabled');
 }

Şimdi yukarıdaki kod 'devre dışı' niteliğini kaldıracak.


22

Partiye geç kaldığımı biliyorum, ama özellikle iki soruyu cevaplamak için:

"Yalnızca belirli tıklama öğelerini devre dışı bırakmak istiyorum, böylece:

  • Tıklamayı bırakıyorlar
  • Engelli görünüyorlar

Bu ne kadar zor olabilir? "

Tıklamayı bırakıyorlar

Düğmeleri için 1. gibi <button>veya <input type="button">siz özelliği ekleyin: disabled.

<button type="submit" disabled>Register</button>
<input type="button" value="Register" disabled>

2. Linkler, HERHANGİ bir link ... aslında, herhangi bir HTML öğesi, CSS3 işaretçi olaylarını kullanabilirsiniz .

.selector { pointer-events:none; }

İşaretçi olayları için tarayıcı desteği, günümüzün son teknolojisiyle harika (5/12/14). Ancak genellikle IE alanındaki eski tarayıcıları desteklememiz gerekir, bu nedenle IE10 ve altı işaretçi olaylarını desteklemez: http://caniuse.com/pointer-events . Yani burada başkaları tarafından bahsedilen JavaScript çözümlerinden birini kullanmak, eski tarayıcılar için gitmek için bir yol olabilir.

İşaretçi olayları hakkında daha fazla bilgi:

Engelli görünüyorlar

Açıkçası bu bir CSS cevabı, yani:

1. Seçici gibi <button>veya <input type="button">kullanmak için düğmeler için [attribute]:

button[disabled] { ... }

input[type=button][disabled] { ... }

-

Burada bahsettiğim şeylerle ilgili temel bir demo: http://jsfiddle.net/bXm5B/4/

Bu yardımcı olur umarım.


17

Benim gibi, sadece bir düğmeyi devre dışı bırakmak istiyorsanız, bu uzun iş parçacığında gizlenmiş basit cevabı kaçırmayın:

 $("#button").prop('disabled', true);

gerçek kahraman, tüm ihtiyacım olan bu.
ricks

7

@James Donnelly, jQuery'nin yeni bir işlevle genişletilmesine dayanan kapsamlı bir yanıt sağlamıştır. Bu harika bir fikir, bu yüzden ona ihtiyacım şekilde çalışır şekilde kodunu uyarlayacağım.

JQuery genişletme

$.fn.disable=-> setState $(@), true
$.fn.enable =-> setState $(@), false
$.fn.isDisabled =-> $(@).hasClass 'disabled'

setState=($el, state) ->
    $el.each ->
        $(@).prop('disabled', state) if $(@).is 'button, input'
        if state then $(@).addClass('disabled') else $(@).removeClass('disabled')

    $('body').on('click', 'a.disabled', -> false)

kullanım

$('.btn-stateful').disable()
$('#my-anchor').enable()

Kod tek bir elemanı veya eleman listesini işleyecektir.

Düğmeler ve Girişler disabledözelliği destekler ve eğer ayarlanırsa truedevre dışı görünürler (bootstrap sayesinde) ve tıklandığında ateşlenmezler.

Çapalar biz güvenmek olacak böylece yerine özürlü özelliğini desteklemeyen .disabledonları (yine önyükleyebilmek sayesinde) ve varsayılan tıklama olayı kanca engelli görünmesi için sınıfın ki (gerek false dönerek önler tık preventDefaultbakın burada ) .

Not : Bağlantıları yeniden etkinleştirirken bu olayı kaldırmanız gerekmez. Sadece .disabledsınıfı kaldırmak hile yapar.

Tabii ki, bağlantıya özel bir tıklama işleyicisi eklediyseniz, bootstrap ve jQuery kullanırken çok yaygın olan bir şey bu yardımcı olmaz. Bu yüzden bununla başa çıkmak isDisabled()için .disabledsınıfı test etmek için uzantıyı kullanacağız, şöyle:

$('#my-anchor').click -> 
    return false if $(@).isDisabled()
    # do something useful

Umarım bu işleri basitleştirmeye yardımcı olur.


7

Bootstrap'ın JS düğmelerini ve 'yükleme' durumunu kullanıyorsanız garip bir sorun olduğunu unutmayın. Bunun neden olduğunu bilmiyorum, ama nasıl düzeltileceği aşağıda açıklanmıştır.

Düğmeniz olduğunu ve yükleme durumuna getirdiğinizi varsayalım:

var myButton = $('#myBootstrapButton');
myButton.button('loading');

Şimdi yükleme durumundan çıkarmak istiyorsunuz, fakat aynı zamanda devre dışı bırakıyorsunuz (örneğin düğme bir Kaydet düğmesiydi, yükleme durumu devam eden bir doğrulama gösterdi ve doğrulama başarısız oldu). Bu makul Bootstrap JS'ye benziyor:

myButton.button('reset').prop('disabled', true); // DOES NOT WORK

Ne yazık ki, bu düğmeyi sıfırlar, ancak devre dışı bırakmaz. Görünüşe göre, button()gecikmiş bir görev gerçekleştirir. Dolayısıyla, devre dışı bırakmanızı da ertelemeniz gerekir:

myButton.button('reset');
setTimeout(function() { myButton.prop('disabled', true); }, 0);

Biraz sinir bozucu, ama çok kullandığım bir model.


6

Harika cevap ve herkesten katkılar! Seçili öğelerin devre dışı bırakılmasını dahil etmek için bu işlevi biraz genişletmek zorunda kaldım:

jQuery.fn.extend({
disable: function (state) {
    return this.each(function () {
        var $this = jQuery(this);
        if ($this.is('input, button'))
            this.disabled = state;
        else if ($this.is('select') && state)
            $this.attr('disabled', 'disabled');
        else if ($this.is('select') && !state)
            $this.removeAttr('disabled');
        else
            $this.toggleClass('disabled', state);
    });
}});

Benim için çalışıyor gibi görünüyor. Hepinize teşekkürler!


5

Bu tür davranışlar için her zaman jQueryUI buttonwidget'ı kullanıyorum, bağlantılar ve düğmeler için kullanıyorum.

Etiketi HTML içinde tanımlayın:

<button id="sampleButton">Sample Button</button>
<a id="linkButton" href="yourHttpReferenceHere">Link Button</a>

Düğmeleri başlatmak için jQuery kullanın:

$("#sampleButton").button();
$("#linkButton").button();

buttonBunları devre dışı bırakmak / etkinleştirmek için widget yöntemlerini kullanın :

$("#sampleButton").button("enable"); //enable the button
$("#linkButton").button("disable"); //disable the button

Bu, düğme ve imleç davranışıyla ilgilenir, ancak daha derine inmeniz ve devre dışı bırakıldığında düğme stilini değiştirmeniz gerekiyorsa, sayfanızın CSS stil dosyanızdaki aşağıdaki CSS sınıflarının üzerine yazın.

.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
      background-color:aqua;
      color:black;
 }

Ancak unutmayın: bu CSS sınıfları (değiştirildiyse) diğer widget'ların stilini de değiştirir.


1
Bu cevabın jQuery UI düğmeleri için olduğundan emin olun ve düz vanilya jQuery ile kullanılan Bootstrap düğmeleri için değil , ikincisi OP'nin kullandığı şeydir. Btw, soru üzerine bir yorum yapmak, tercih edilen yayma yöntemi değildir. ; ^)
ruffin

3

Aşağıdakiler benim için çok iyi çalıştı:

$("#button").attr('disabled', 'disabled');

2

Bu oldukça geç bir cevap, ancak tıkladıktan sonra boostrap düğmelerini devre dışı bırakmanın bir yolunu ararken ve belki de güzel bir efekt (fe spinner) eklerken bu soru üzerine tökezledim. Tam olarak bunu yapan harika bir kütüphane buldum:

http://msurguy.github.io/ladda-bootstrap/

Sadece gerekli css ve js ekleyin, düğmelerinize bazı özellikler ekleyin ve lada javascript ile etkinleştirin ... Presto! Düğmelerinizin yeni bir hayatı var (ne kadar güzel olduğunu görmek için lütfen demoyu kontrol edin)!


2

Bu yukarıdaki işe yaramıyor çünkü bazen

$(this).attr('checked') == undefined

ile kodunu ayarla

if(!$(this).attr('checked') || $(this).attr('checked') == false){

2

Cevabımın geciktiğini biliyorum, ancak IMO, bir Düğme 'etkinleştir' ve 'devre dışı bırak' düğmesine geçiş yapmanın en kolay yoludur

function toggleButtonState(button){

  //If button is enabled, -> Disable
  if (button.disabled === false) {
    button.disabled = true;

  //If button is disabled, -> Enable
  } else if (button.disabled === true) {
    button.disabled = false;
  }
}

1

Sayfada şu düğmelerin bulunduğunu varsayalım:

<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit"value="Enable All" onclick="change()"/>

JS kodu:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}

1

Diyelim ki şu anda etkin olan şuna benzer.

<button id="btnSave" class="btn btn-info">Save</button>

Sadece şunu ekleyin:

$("#btnSave").prop('disabled', true);

ve bunu devre dışı bırakacaksınız

<button id="btnSave" class="btn btn-primary" disabled>Save</button>

2
Soru düğmeler ve çapalar hakkında sordu . disabledMülkiyet bağlayıcı etiketler için geçerli bir özellik değil.
biyofraktal

0

Tıklanabilir öğeyi devre dışı bırakmak istiyorsanız, bunu html'de satır içi de ekleyebilirsiniz

style="cursor: not-allowed;"
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.