เป็นวิธีที่ง่ายที่สุดในการปิดการใช้งาน / เปิดใช้งานปุ่มและลิงก์ (jQuery + Bootstrap)


360

บางครั้งฉันใช้จุดยึดสไตล์เป็นปุ่มและบางครั้งฉันก็ใช้ปุ่ม ฉันต้องการปิดการใช้งานสิ่งที่เฉพาะเจาะจงคลิกเพื่อ:

  • พวกเขาดูปิดการใช้งาน
  • พวกเขาหยุดการคลิก

ฉันจะทำสิ่งนี้ได้อย่างไร


ดูโพสต์ของฉันที่ด้านล่างสุด แต่นี่คือคำอธิบายที่น้อยกว่า $ ("yourSelector") ปุ่ม ("เปิดใช้งาน"); // เปิดใช้งานปุ่มหรือ $ ("yourSelector"). ปุ่ม ("ปิดการใช้งาน"); // ปิดใช้งานปุ่มหากใช้วิดเจ็ตปุ่มจาก jqueryUI
El Bayames

เอกสาร BS3 บอกว่าจะใช้role="button"สำหรับลิงก์ แต่ไม่ปรากฏว่ามีผลกับปัญหานี้ getbootstrap.com/css/#buttons
Jess

2
การa.btn[disabled]ปรากฏตัวที่ปิดใช้งาน แต่ยังคงสามารถคลิกได้นั้นเป็นข้อบกพร่องใน Bootstrap IMO แอตทริบิวต์[disabled]ควรปรากฏปิดการใช้งานและbutton input
Jess

คำตอบ:


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 ปุ่มพิการและการสาธิตการป้อนข้อมูล

มิฉะนั้นคุณจะใช้prop()วิธีการของ jQuery :

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

แท็ก Anchor

เป็นที่น่าสังเกตว่าdisabledไม่ใช่คุณสมบัติที่ถูกต้องสำหรับจุดยึดแท็ก ด้วยเหตุผลนี้ Bootstrap ใช้สไตล์ต่อไปนี้กับ.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 เพื่อป้องกันสิ่งนี้เราสามารถเพิ่ม jQuery code ในชิ้นส่วนง่ายๆเพื่อกำหนดเป้าหมายของแท็กจุดยึดกับdisabledคลาสที่จะเรียก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 รวม

มันน่าสังเกตว่าฟังก์ชั่นด้านบนจะทำงานกับอินพุตทุกประเภทด้วยเช่นกัน


ขอบคุณสำหรับคำตอบที่ครอบคลุม โปรดดูEdit 1ของฉันสำหรับรุ่นสคริปต์กาแฟ ฉันยังคงพยายามรับลิงก์เพื่อป้องกันการคลิก คุณหมายถึงให้ฉันเก็บไว้ return false if $(@).prop('disabled')ในตัวจัดการการคลิกที่กำหนดเองหรือไม่? หากไม่มีบรรทัดนั้นตัวจัดการเหล่านั้นจะรันโดยไม่คำนึงถึง
biofractal

1
@biofractal อย่างที่ฉันพูดถึงdisabledไม่ใช่คุณสมบัติแท็กจุดยึดที่ถูกต้องดังนั้นจึงไม่ควรใช้ เหตุการณ์คลิกฉันได้รับจะขึ้นอยู่กับ.disabledระดับ แต่สิ่งที่คุณสามารถใช้เป็นhasClass('disabled')- preventDefaultถ้าว่าเป็นความจริง
James Donnelly

อาโอเค. ขอบคุณ เหตุใดฉันจึงไม่ควรสร้างและใช้disabledคุณสมบัติบนสมอ มันเป็นวัตถุแบบไดนามิกดังนั้นฉันจึงสามารถตั้งค่าและใช้งานได้เช่นเดียวกับที่ฉันขยายชุดคุณลักษณะของสมอ ฉันได้อัปเดตคำตอบของฉันด้านล่างเพื่อแสดงสิ่งนี้ คุณคิดอย่างไร? มันชั่วร้ายไหม? นอกจากนี้คุณต้องเหตุการณ์คลิกเมื่อคุณเปิดใช้งานการเชื่อมโยงหรือไม่? .off()preventDefault
biofractal

มันขัดกับข้อกำหนดและจะไม่ผ่านการทดสอบการตรวจสอบ หากคุณต้องการที่กำหนดเองdisabledและบริการที่คุณสามารถใช้ประโยชน์จากคุณลักษณะdata-* เนื่องจาก Bootstrap ใช้disabledสไตล์ของคุณสมบัติเดียวกันกับclass="disabled"คุณแล้วคุณอาจต้องพึ่งพาคลาสแทน
James Donnelly

เข้าใจแล้ว - ฉันได้ปรับคำตอบเพื่อสะท้อนความคิดเห็นของคุณ ฉันยังกังวลว่าหากฉันpreventDefaultเชื่อมโยงกิจกรรมการคลิกทั้งหมดแล้วฉันจะต้องแยกพวกเขาออกเมื่อเปิดใช้งานลิงก์อีกครั้ง หรือฉันเข้าใจผิดบางอย่าง
biofractal

48

ฉันไม่สามารถคิดวิธีที่ง่ายกว่า / ง่ายกว่านี้ได้! ;-)


ใช้แท็ก Anchor (ลิงค์):

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

วิธีเปิดใช้งานแท็ก Anchor:

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

ป้อนคำอธิบายรูปภาพที่นี่


หากต้องการปิดใช้งานแท็ก Anchor:

 $('#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');
 }

ตอนนี้โค้ดด้านบนจะลบแอตทริบิวต์ '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 http://caniuse.com/pointer-eventsดังนั้นการใช้หนึ่งในโซลูชัน JavaScript ที่ผู้อื่นกล่าวถึงที่นี่อาจเป็นหนทางไปสู่เบราว์เซอร์รุ่นเก่า

ข้อมูลเพิ่มเติมเกี่ยวกับกิจกรรมของตัวชี้:

พวกเขาดูปิดการใช้งาน

เห็นได้ชัดว่านี่เป็นคำตอบ CSS ดังนั้น:

1. สำหรับปุ่มที่ชอบ<button>หรือ<input type="button">ใช้[attribute]ตัวเลือก:

button[disabled] { ... }

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

-

นี่คือตัวอย่างเบื้องต้นของสิ่งที่ฉันพูดถึงที่นี่: http://jsfiddle.net/bXm5B/4/

หวังว่านี่จะช่วยได้


17

ถ้าเช่นเดียวกับฉันคุณเพียงแค่ต้องการปิดการใช้งานปุ่มอย่าพลาดคำตอบง่ายๆที่ซ่อนอยู่ในเธรดแบบยาวนี้:

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

ฮีโร่ตัวจริงนี่คือทั้งหมดที่ฉันต้องการ
ricks

7

@James Donnelly ได้ให้คำตอบที่ครอบคลุมซึ่งอาศัยการขยาย 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พวกเขาจะดูปิดการใช้งาน (ขอบคุณ bootstrap) และจะไม่ทำงานเมื่อคลิก

แองเคอร์ไม่สนับสนุนคุณสมบัติที่ปิดใช้งานดังนั้นเราจึงต้องพึ่งพา.disabledคลาสเพื่อทำให้พวกเขาดูปิดการใช้งาน (ขอบคุณ bootstrap อีกครั้ง) และเชื่อมโยงเหตุการณ์การคลิกเริ่มต้นที่ป้องกันไม่ให้คลิกโดยส่งคืน false (ไม่จำเป็นต้องpreventDefaultดูที่นี่ ) .

หมายเหตุ : คุณไม่จำเป็นต้องปลดล็อคกิจกรรมนี้เมื่อเปิดใช้งานแองเคอร์อีกครั้ง เพียงแค่ถอด.disabledชั้นเรียนออก

แน่นอนว่าสิ่งนี้ไม่ได้ช่วยอะไรหากคุณแนบตัวจัดการคลิกที่กำหนดเองไปยังลิงก์ซึ่งเป็นสิ่งที่พบได้บ่อยมากเมื่อใช้ bootstrap และ jQuery ดังนั้นเพื่อจัดการกับสิ่งนี้เราจะใช้การisDisabled()ทดสอบเพื่อขยาย.disabledชั้นเรียนเช่นนี้

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

ฉันหวังว่าจะช่วยลดความซับซ้อนของสิ่งเล็กน้อย


7

โปรดทราบว่ามีปัญหาแปลก ๆ หากคุณใช้ปุ่ม JS ของ Bootstrap และสถานะ 'กำลังโหลด' ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น แต่นี่คือวิธีแก้ไข

สมมติว่าคุณมีปุ่มและคุณตั้งเป็นสถานะการโหลด:

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

ตอนนี้คุณต้องการนำออกจากสถานะการโหลด แต่ยังปิดการใช้งาน (เช่นปุ่มเป็นปุ่มบันทึกสถานะการโหลดแสดงการตรวจสอบอย่างต่อเนื่องและการตรวจสอบล้มเหลว) ดูเหมือน Bootstrap JS ที่สมเหตุสมผล:

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

สำหรับพฤติกรรมแบบนั้นฉันมักจะใช้buttonวิดเจ็ตjQueryUI ฉันจะใช้มันเพื่อเชื่อมโยงและปุ่ม

กำหนดแท็กภายใน 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

ที่จะดูแลปุ่มและเคอร์เซอร์พฤติกรรม แต่ถ้าคุณต้องการที่จะได้รับลึกและเปลี่ยนรูปแบบปุ่มเมื่อปิดการใช้งานแล้วเขียนทับคลาส CSS ต่อไปนี้ภายในไฟล์สไตล์ CSS หน้าของคุณ

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

แต่จำไว้ว่าคลาส CSS เหล่านั้น (ถ้าเปลี่ยน) จะเปลี่ยนสไตล์ของวิดเจ็ตอื่นเช่นกัน


1
ค่อนข้างแน่ใจว่าคำตอบนี้มีไว้สำหรับปุ่ม jQuery UIและไม่ใช่สำหรับปุ่ม Bootstrap ที่ใช้กับ vanilla jQuery ธรรมดาซึ่งเป็นสิ่งที่ OP ใช้ Btw การใส่คำตอบในความคิดเห็นเกี่ยวกับคำถามไม่ใช่วิธีการเผยแพร่ที่ต้องการ ; ^)
รัฟฟิน


2

นี่เป็นคำตอบที่ค่อนข้างล่าช้า แต่ฉันก็สะดุดกับคำถามนี้ในขณะที่ค้นหาวิธีปิดการใช้งานปุ่มเพิ่มหลังจากที่คลิกปุ่มเหล่านั้นและอาจเพิ่มเอฟเฟกต์ที่ดี (fe a spinner) ฉันพบห้องสมุดที่ยอดเยี่ยมที่ทำอย่างนั้น

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

คุณเพียงแค่ใส่ CSS และ js ที่ต้องการเพิ่มคุณสมบัติบางอย่างลงในปุ่มของคุณและเปิดใช้งาน lada ด้วย javascript ... Presto! ปุ่มของคุณมีชีวิตใหม่ (โปรดตรวจสอบตัวอย่างเพื่อดูว่าสวยงามแค่ไหน)!


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

รหัส js:

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;"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.