बटन और लिंक को निष्क्रिय / सक्षम करने का सबसे आसान तरीका क्या है (jQuery + बूटस्ट्रैप)


360

कभी-कभी मैं बटन के रूप में स्टाइल किए गए एंकर का उपयोग करता हूं और कभी-कभी मैं सिर्फ बटन का उपयोग करता हूं। मैं विशिष्ट क्लिक-चीजों को अक्षम करना चाहता हूं ताकि:

  • वे विकलांग दिखते हैं
  • उन्हें क्लिक किया जाना बंद हो जाता है

मैं यह कैसे कर सकता हूँ?


नीचे के छोर पर मेरी पोस्ट देखें, लेकिन यहां कम वर्णनात्मक $ ("yourSelector") है। बटन ("सक्षम करें"); // बटन या $ ("yourSelector") को सक्षम करें। बटन ("अक्षम"); // बटन को निष्क्रिय करें यदि jqueryUI से बटन विजेट का उपयोग किया जाता है।
एल बेयम्स

बीएस 3 प्रलेखन role="button"लिंक के लिए उपयोग करने के लिए कहता है , लेकिन वह इस मुद्दे को प्रभावित नहीं करता है। getbootstrap.com/css/#buttons
जेस

2
a.btn[disabled]अक्षम दिखाई देने के बाद भी क्लिक करने योग्य रहना बूटस्ट्रैप IMO में एक बग है। विशेषता [disabled]केवल buttonऔर के लिए अक्षम दिखाई देनी चाहिए input
जेस

जवाबों:


575

बटन

बटन को निष्क्रिय करना आसान है क्योंकि disabledएक बटन संपत्ति है जो ब्राउज़र द्वारा नियंत्रित की जाती है:

<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>

कस्टम jQuery फ़ंक्शन के साथ इन्हें अक्षम करने के लिए, आप बस इसका उपयोग करेंगे 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 विकलांग बटन और इनपुट डेमो

अन्यथा आप jQuery की prop()विधि का उपयोग करेंगे:

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

एंकर टैग

यह ध्यान देने योग्य है कि लंगर टैग के लिए disabledएक वैध संपत्ति नहीं है । इस कारण से, बूटस्ट्रैप अपने .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]संपत्ति को एक .disabledवर्ग के रूप में भी कैसे लक्षित किया जाता है । .disabledवर्ग क्या एक लंगर टैग विकलांग प्रदर्शित करने के लिए जरूरत है।

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

बेशक, यह क्लिक करने पर लिंक को कार्य करने से नहीं रोकेगा। उपरोक्त लिंक हमें http://example.com पर ले जाएगा । इसे रोकने के लिए, हम disabledकॉल करने के लिए कक्षा के साथ एंकर टैग को लक्षित करने के लिए jQuery कोड के एक साधारण टुकड़े में जोड़ सकते हैं event.preventDefault():

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

हम disabledकक्षा का उपयोग करके टॉगल कर सकते हैं 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 विकलांग लिंक डेमो


संयुक्त

फिर हम ऊपर दिए गए पिछले अक्षम फ़ंक्शन को विस्तारित कर सकते हैं कि हम किस प्रकार के तत्व का उपयोग करने की कोशिश कर रहे हैं is()। इस तरह हम toggleClass()अगर यह एक तत्व inputया buttonतत्व नहीं है, या disabledअगर यह है तो संपत्ति को टॉगल कर सकते हैं:

// 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);

पूर्ण संयुक्त JSFiddle डेमो

यह आगे ध्यान देने योग्य है कि उपरोक्त फ़ंक्शन सभी इनपुट प्रकारों पर भी काम करेगा।


व्यापक उत्तर के लिए धन्यवाद। कृपया कॉफी स्क्रिप्ट संस्करण के लिए मेरा संपादन 1 देखें । मैं अभी भी क्लिक करने से रोकने के लिए लिंक प्राप्त करने के लिए संघर्ष कर रहा हूं। क्या आप मेरे लिए return false if $(@).prop('disabled')कस्टम क्लिक हैंडलर में रखने का मतलब रखते हैं ? उस लाइन के बिना उन हैंडलर की परवाह किए बिना चलाया जाता है।
बायोफ्रेक्टल

1
@Bofractal जैसा कि मैंने उल्लेख किया disabledहै कि एक वैध एंकर टैग संपत्ति नहीं है, इसलिए इसका उपयोग नहीं किया जाना चाहिए। मेरे द्वारा दिया गया क्लिक इवेंट .disabledक्लास पर आधारित है , लेकिन आप जो उपयोग कर सकते हैं वह है hasClass('disabled')- यदि यह सच है preventDefault
जेम्स डोनली

आह अच्छा। धन्यवाद। तो मुझे disabledएंकर पर संपत्ति क्यों नहीं बनानी चाहिए और न ही उसका उपयोग करना चाहिए । इसकी एक गतिशील वस्तु है, इसलिए मैं इसे बस सेट कर सकता हूं और इसका उपयोग कर सकता हूं, जैसे मैं एंकर की सुविधा सेट का विस्तार कर रहा था? मैंने यह दिखाने के लिए नीचे अपना उत्तर अपडेट किया है। तुम क्या सोचते हो? क्या यह बुराई है? जब आप किसी लिंक को पुन: सक्षम करते हैं, तो क्या आपके पास क्लिक करने .off()की preventDefaultघटना है?
बायोफ्रेक्टल

यह विनिर्देश के खिलाफ जाता है और सत्यापन परीक्षण पास नहीं करेगा। यदि आप एक कस्टम disabledसंपत्ति चाहते हैं तो आप data-*विशेषताओं का उपयोग कर सकते हैं । जैसा कि बूटस्ट्रैप आपके लिए पहले से ही समान disabledसंपत्ति शैलियों को लागू करता है class="disabled", इसके बजाय कक्षा पर भी भरोसा कर सकता है।
जेम्स डोनली

समझ गया - आपकी टिप्पणियों को प्रतिबिंबित करने के लिए मैंने अपना उत्तर अनुकूलित कर लिया है। मुझे अब भी चिंता है कि अगर मैं हुक अप करूंpreventDefault सभी एंकर क्लिक इवेंट्स को दूंगा, तो लिंक को फिर से सक्षम करने पर मुझे उन्हें अलग करना होगा। या मैं कुछ गलत समझ रहा हूं?
बायोफ्रेक्टल

48

मैं एक आसान / आसान तरीका नहीं सोच सकता! ;-)


एंकर टैग (लिंक) का उपयोग करना:

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

एंकर टैग को सक्षम करने के लिए:

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

यहां छवि विवरण दर्ज करें


एंकर टैग को अक्षम करने के लिए:

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

यहां छवि विवरण दर्ज करें


27

मान लें कि आपके पास टेक्स्ट फ़ील्ड है और बटन सबमिट करें,

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

अक्षम करना:

किसी भी बटन को अक्षम करने के लिए, उदाहरण के लिए, बटन सबमिट करें जिसे आपको अक्षम करने की आवश्यकता है जैसे कि,

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

उपरोक्त लाइन निष्पादित करने के बाद, आपका सबमिट बटन html टैग इस तरह दिखाई देगा:

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

ध्यान दें कि 'अक्षम' विशेषता जुड़ गई है

सक्षम करने से:

बटन सक्षम करने के लिए, जैसे कि जब आपके पास पाठ क्षेत्र में कुछ पाठ हो। बटन को सक्षम करने के लिए आपको अक्षम विशेषता को हटाना होगा ,

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

अब उपरोक्त कोड 'अक्षम' विशेषता को हटा देगा।


22

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन विशेष रूप से दो सवालों के जवाब देने के लिए:

"मैं केवल विशिष्ट क्लिक-चीजों को अक्षम करना चाहता हूं ताकि:

  • वे क्लिक करना बंद कर देते हैं
  • वे विकलांग दिखते हैं

यह कितना कठिन हो सकता है? ”

वे क्लिक करना बंद कर देते हैं

1. जैसे बटन <button>या <input type="button">आप विशेषता जोड़ते हैं disabled:।

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

2. लिंक के लिए, किसी भी लिंक ... वास्तव में, किसी भी HTML तत्व, आप CSS3 पॉइंटर घटनाओं का उपयोग कर सकते हैं ।

.selector { pointer-events:none; }

पॉइंटर घटनाओं के लिए ब्राउज़र का समर्थन कला की आज की स्थिति (5/12/14) द्वारा भयानक है। लेकिन हमें आमतौर पर IE क्षेत्र में विरासत ब्राउज़र का समर्थन करना पड़ता है, इसलिए IE10 और नीचे संकेतक घटनाओं का समर्थन नहीं करते हैं: http://caniuse.com/pointer-events । तो यहाँ दूसरों द्वारा बताए गए जावास्क्रिप्ट समाधानों में से एक का उपयोग करना विरासत ब्राउज़रों के लिए जाने का तरीका हो सकता है।

सूचक घटनाओं के बारे में अधिक जानकारी:

वे विकलांग दिखते हैं

जाहिर है यह एक सीएसएस जवाब है, इसलिए:

1. चयनकर्ताओं की तरह बटन के लिए <button>या <input type="button">उपयोग करें [attribute]:

button[disabled] { ... }

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

-

यहाँ मेरे द्वारा बताए गए सामान के साथ एक बुनियादी डेमो है: http://jsfiddle.net/bXm5B/4/

उम्मीद है की यह मदद करेगा।


17

यदि, मेरी तरह, आप बस एक बटन को निष्क्रिय करना चाहते हैं, तो इस लंबे धागे में छिपे हुए सरल उत्तर को याद न करें:

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

असली नायक, यह सब मुझे चाहिए।
रिक्स

7

@ जेम्स डोनली ने एक व्यापक उत्तर की आपूर्ति की है जो एक नए फ़ंक्शन के साथ jQuery के विस्तार पर निर्भर है। यह एक महान विचार है, इसलिए मैं उनके कोड को अनुकूलित करने जा रहा हूं, इसलिए यह उस तरीके से काम करता है, जिसकी मुझे आवश्यकता है।

JQuery का विस्तार

$.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)

प्रयोग

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

कोड एक एकल तत्व या तत्वों की एक सूची को संसाधित करेगा।

बटन और इनपुट disabledसंपत्ति का समर्थन करते हैं और, यदि सेट किया जाता हैtrue , तो वे अक्षम दिखाई देंगे (बूटस्ट्रैप के लिए धन्यवाद) और क्लिक करने पर फायर नहीं करेंगे।

एंकर विकलांग संपत्ति का समर्थन नहीं करते हैं, इसलिए इसके बजाय हम .disabledउन्हें निष्क्रिय दिखने के लिए वर्ग पर भरोसा करने जा रहे हैं (फिर से बूटस्ट्रैप के लिए धन्यवाद) और एक डिफ़ॉल्ट क्लिक ईवेंट को हुक करें जो झूठे वापस आने से रोकता है ( यहांpreventDefault देखने की कोई आवश्यकता नहीं है ) ।

नोट : एंकरों को पुन: सक्षम करते समय आपको इस घटना को अनहुक करने की आवश्यकता नहीं है। बस .disabledक्लास को हटाने की कोशिश करता है।

बेशक, यह मदद नहीं करता है यदि आपने लिंक पर एक कस्टम क्लिक हैंडलर संलग्न किया है, तो कुछ ऐसा जो बूटस्ट्रैप और jQuery का उपयोग करते समय बहुत सामान्य है। तो इससे निपटने के लिए हम वर्ग isDisabled()का परीक्षण करने के लिए विस्तार का उपयोग कर रहे हैं .disabled, जैसे:

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

मुझे उम्मीद है कि चीजों को थोड़ा सरल बनाने में मदद मिलेगी।


7

ध्यान दें कि यदि आप बूटस्ट्रैप के JS बटन और 'लोडिंग' स्थिति का उपयोग कर रहे हैं तो एक अजीब समस्या है। मुझे नहीं पता कि ऐसा क्यों होता है, लेकिन यहां बताया गया है कि इसे कैसे ठीक किया जाए।

कहते हैं कि आपके पास एक बटन है और आप इसे लोडिंग स्थिति पर सेट करते हैं:

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

अब आप इसे लोडिंग स्थिति से बाहर निकालना चाहते हैं, लेकिन इसे अक्षम भी करें (जैसे कि बटन एक सहेजें बटन था, लोडिंग राज्य ने एक निरंतर सत्यापन और सत्यापन विफल होने का संकेत दिया)। यह उचित बूटस्ट्रैप जेएस की तरह दिखता है:

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

दुर्भाग्य से, यह बटन को रीसेट कर देगा, लेकिन इसे अक्षम नहीं करेगा। जाहिर है, button()कुछ विलंबित कार्य करता है। इसलिए आपको अपनी अक्षमता को स्थगित करना होगा:

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

थोड़ा परेशान, लेकिन यह एक पैटर्न है जिसका मैं बहुत उपयोग कर रहा हूं।


6

सभी से महान जवाब और योगदान! चुनिंदा तत्वों को अक्षम करने के लिए मुझे इस फ़ंक्शन को थोड़ा विस्तारित करना पड़ा:

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);
    });
}});

मेरे लिए काम करने लगता है। सबको शुक्रीया!


5

उस तरह के व्यवहार के लिए मैं हमेशा jQueryUI buttonविजेट का उपयोग करता हूं, मैं इसे लिंक और बटन के लिए उपयोग करता हूं।

HTML के भीतर टैग को परिभाषित करें:

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

बटन को इनिशियलाइज़ करने के लिए jQuery का उपयोग करें:

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

buttonउन्हें निष्क्रिय / सक्षम करने के लिए विजेट विधियों का उपयोग करें:

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

यह बटन और कर्सर के व्यवहार का ख्याल रखेगा, लेकिन अगर आपको गहराई में जाने और अक्षम होने पर बटन शैली को बदलने की आवश्यकता है, तो अपने पृष्ठ सीएसएस शैली फ़ाइल के भीतर निम्नलिखित सीएसएस कक्षाओं को अधिलेखित करें।

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

लेकिन याद रखें: उन सीएसएस कक्षाएं (यदि बदल गई हैं) अन्य विगेट्स के लिए शैली भी बदल देंगी।


1
बहुत यकीन है कि यह उत्तर jQuery के यूआई बटन के लिए है और सादे वेनिला jQuery के साथ उपयोग किए जाने वाले बूटस्ट्रैप बटन के लिए नहीं है , बाद वाला ओपी का उपयोग कर रहा है। Btw, सवाल पर एक टिप्पणी में एक जवाब डाल प्रसार का पसंदीदा तरीका नहीं है। ; ^)
रफिन

3

निम्नलिखित ने मेरे लिए बहुत अच्छा काम किया है:

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

2

यह एक बहुत देर से जवाब है, हालांकि मैंने इस सवाल पर ठोकर खाई, जबकि उन्हें क्लिक करने के बाद बूस्टर बटन को अक्षम करने का एक तरीका खोजा गया और शायद एक अच्छा प्रभाव (एक स्पिनर) जोड़ें। मुझे एक बढ़िया पुस्तकालय मिला है जो ठीक यही करता है:

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

आप बस आवश्यक सीएसएस और js को शामिल करते हैं, अपने बटनों में कुछ गुण जोड़ते हैं और जावास्क्रिप्ट के साथ लाडा सक्षम करते हैं ... प्रेस्टो! आपके बटनों में एक नया जीवन है (कृपया यह देखने के लिए डेमो देखें कि यह कितना सुंदर है)!


2

यह ऊपर काम नहीं करता है क्योंकि कभी-कभी

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

के साथ अपना कोड समायोजित करें

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

2

मुझे पता है कि मेरा उत्तर देर से है, लेकिन IMO बटन 'सक्षम' और बटन 'अक्षम' को चालू करने का सबसे आसान तरीका है

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

मान लीजिए कि आपके पास पृष्ठ पर ये बटन हैं जैसे:

<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()"/>

जेएस कोड:

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

1

मान लीजिए कि आपके पास ऐसा दिखता है जो वर्तमान में सक्षम है।

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

बस इसे जोड़ें:

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

और आपको यह मिलेगा जो बटन को अक्षम कर देगा

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

2
बटन और एंकर के बारे में पूछे गए सवाल । disabledसंपत्ति लंगर टैग के लिए एक वैध संपत्ति नहीं है।
बायोफ्रेक्टल

0

यदि आप क्लिक करने योग्य को अक्षम करना चाहते हैं, तो आप HTML में इनलाइन भी जोड़ सकते हैं

style="cursor: not-allowed;"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.