Cách dễ nhất để vô hiệu hóa / kích hoạt các nút và liên kết (jQuery + Bootstrap) là gì


360

Đôi khi tôi sử dụng các neo được tạo kiểu như các nút và đôi khi tôi chỉ sử dụng các nút. Tôi muốn vô hiệu hóa những thứ clicky cụ thể để:

  • Họ trông tàn tật
  • Họ ngừng được nhấp

Tôi có thể làm cái này như thế nào?


xem bài viết của tôi ở cuối cùng nhưng đây là nút $ ("yourSelector") ít mô tả hơn ("enable"); // kích hoạt nút hoặc $ ("yourSelector"). nút ("vô hiệu hóa"); // tắt nút nếu tiện ích nút từ jqueryUI được sử dụng.
El Bayames

Tài liệu BS3 nói rằng sử dụng role="button"cho các liên kết, nhưng điều đó dường như không ảnh hưởng đến vấn đề này. getbootstrap.com/css/#buttons
Jess

2
a.btn[disabled]vẻ như bị vô hiệu hóa nhưng vẫn có thể nhấp là một lỗi trong Bootstrap IMO. Thuộc tính [disabled]chỉ nên xuất hiện bị vô hiệu hóa cho buttoninput.
Jess

Câu trả lời:


575

nút

Các nút đơn giản để vô hiệu hóa disabledlà thuộc tính nút được trình duyệt xử lý:

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

Để vô hiệu hóa các chức năng này bằng một hàm jQuery tùy chỉnh, bạn chỉ cần sử dụng 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);

Nút vô hiệu hóa JSFiddle và bản demo đầu vào .

Nếu không, bạn sẽ sử dụng prop()phương thức của jQuery :

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

Thẻ neo

Đáng lưu ý rằng đó disabledkhông phải là một thuộc tính hợp lệ cho các thẻ neo. Vì lý do này, Bootstrap sử dụng kiểu dáng sau trên các .btnthành phần của nó :

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

Lưu ý cách [disabled]tài sản được nhắm mục tiêu cũng như một .disabledlớp. Các .disabledlớp học là những gì cần thiết để làm cho một thẻ neo xuất hiện tàn tật.

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

Tất nhiên, điều này sẽ không ngăn các liên kết hoạt động khi nhấp vào. Liên kết trên sẽ đưa chúng ta đến http://example.com . Để ngăn chặn điều này, chúng ta có thể thêm vào một đoạn mã jQuery đơn giản để nhắm mục tiêu các thẻ neo với disabledlớp cần gọi event.preventDefault():

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

Chúng ta có thể chuyển đổi disabledlớp bằng cách sử dụng 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);

Bản demo liên kết bị vô hiệu hóa của JSFiddle .


Kết hợp

Sau đó, chúng tôi có thể mở rộng chức năng tắt trước đó được thực hiện ở trên để kiểm tra loại phần tử mà chúng tôi đang cố gắng vô hiệu hóa bằng cách sử dụng is(). Bằng cách này, chúng tôi có thể toggleClass()nếu đó không phải là một phần tử inputhoặc buttonphần tử hoặc chuyển đổi thuộc disabledtính nếu đó là:

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

Bản demo kết hợp đầy đủ của JSFiddle .

Cần lưu ý thêm rằng chức năng trên cũng sẽ hoạt động trên tất cả các loại đầu vào.


Cảm ơn câu trả lời toàn diện. Vui lòng xem Chỉnh sửa 1 của tôi để biết phiên bản tập lệnh cà phê. Tôi vẫn đang cố gắng để có được các liên kết để ngăn chặn nhấp chuột. Ý bạn là để tôi giữ các return false if $(@).prop('disabled')trình xử lý nhấp chuột tùy chỉnh? Không có dòng đó những người xử lý được chạy bất kể.
biofractal

1
@biofractal như tôi đã đề cập disabledkhông phải là thuộc tính thẻ neo hợp lệ, vì vậy không nên sử dụng. Sự kiện nhấp mà tôi đã đưa ra dựa trên .disabledlớp, nhưng những gì bạn có thể sử dụng là hasClass('disabled')- nếu đó là sự thật , preventDefault.
James Donnelly

à, được rồi Cảm ơn. Vậy tại sao tôi không nên tạo và sử dụng disabledtài sản trên mỏ neo. Đó là một đối tượng động để tôi có thể đặt và sử dụng nó, giống như tôi đang mở rộng bộ tính năng của neo? Tôi đã cập nhật câu trả lời của tôi dưới đây để hiển thị điều này. Bạn nghĩ sao? Có ác không? Ngoài ra, bạn có phải .off()các preventDefaultsự kiện nhấp chuột khi bạn kích hoạt lại một liên kết?
biofractal

Nó đi ngược lại các đặc điểm kỹ thuật và sẽ không vượt qua các bài kiểm tra xác nhận. Nếu bạn muốn một thuộc tính tùy chỉnh, disabledbạn có thể sử dụng các data-*thuộc tính . Vì Bootstrap đã áp dụng các disabledkiểu thuộc tính tương tự cho class="disabled"bạn, cũng có thể dựa vào lớp thay thế.
James Donnelly

Có nó - Tôi đã điều chỉnh câu trả lời của tôi để phản ánh ý kiến ​​của bạn. Tôi vẫn lo ngại rằng nếu tôi kết nối preventDefaultvới tất cả các sự kiện nhấp chuột neo thì tôi sẽ cần phải tách chúng ra khi liên kết được bật lại. Hay tôi đang hiểu lầm điều gì đó?
biofractal

48

Tôi không thể nghĩ một cách đơn giản / dễ dàng hơn! ;-)


Sử dụng thẻ Anchor (Liên kết):

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

Để bật thẻ Anchor:

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

nhập mô tả hình ảnh ở đây


Để tắt thẻ Anchor:

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

nhập mô tả hình ảnh ở đây


27

Giả sử bạn có trường văn bản và nút gửi,

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

Vô hiệu hóa:

Để tắt bất kỳ nút nào, ví dụ, gửi nút, bạn chỉ cần thêm thuộc tính bị vô hiệu hóa như,

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

Sau khi thực hiện dòng trên, thẻ html của nút gửi của bạn sẽ trông như thế này:

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

Lưu ý thuộc tính 'khuyết tật' đã được thêm .

Cho phép:

Để bật nút, chẳng hạn như khi bạn có một số văn bản trong trường văn bản. Bạn sẽ cần xóa thuộc tính vô hiệu hóa để bật nút như,

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

Bây giờ đoạn mã trên sẽ loại bỏ thuộc tính 'khuyết tật'.


22

Tôi biết tôi đến bữa tiệc muộn, nhưng để trả lời cụ thể hai câu hỏi:

"Tôi chỉ muốn vô hiệu hóa những thứ clicky cụ thể để:

  • Họ ngừng nhấp
  • Họ trông tàn tật

Cái này khó tới mức nào?"

Họ ngừng nhấp

1. Đối với các nút như <button>hoặc <input type="button">bạn thêm thuộc tính : disabled.

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

2. Đối với các liên kết, BẤT K link liên kết nào ... thực sự, bất kỳ yếu tố HTML nào, bạn đều có thể sử dụng các sự kiện con trỏ CSS3 .

.selector { pointer-events:none; }

Hỗ trợ trình duyệt cho các sự kiện con trỏ là tuyệt vời bởi tình trạng hiện đại ngày nay (5/12/14). Nhưng chúng tôi thường phải hỗ trợ các trình duyệt cũ trong lĩnh vực IE, vì vậy IE10 trở xuống KHÔNG hỗ trợ các sự kiện con trỏ: http://caniuse.com/pulum-events . Vì vậy, sử dụng một trong những giải pháp JavaScript được đề cập bởi những người khác ở đây có thể là cách phù hợp với các trình duyệt cũ.

Thông tin thêm về các sự kiện con trỏ:

Họ trông tàn tật

Rõ ràng đây là một câu trả lời CSS, vì vậy:

1. Đối với các nút thích <button>hoặc <input type="button">sử dụng [attribute]bộ chọn:

button[disabled] { ... }

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

-

Đây là bản demo cơ bản với nội dung tôi đã đề cập ở đây: http://jsfiddle.net/bXm5B/4/

Hi vọng điêu nay co ich.


17

Nếu, giống như tôi, bạn chỉ muốn tắt một nút, đừng bỏ lỡ câu trả lời đơn giản được ẩn một cách tinh tế trong chuỗi dài này:

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

anh hùng thực sự, đây là tất cả những gì tôi cần.
ricks

7

@James Donnelly đã cung cấp một câu trả lời toàn diện dựa trên việc mở rộng jQuery với một chức năng mới. Đó là một ý tưởng tuyệt vời, vì vậy tôi sẽ điều chỉnh mã của anh ấy để nó hoạt động theo cách tôi cần.

Mở rộng 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)

Sử dụng

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

Mã sẽ xử lý một yếu tố duy nhất hoặc một danh sách các yếu tố.

Các nút và Đầu vào hỗ trợ thuộc disabledtính và, nếu được đặt thành true, chúng sẽ bị vô hiệu hóa (nhờ bootstrap) và sẽ không kích hoạt khi nhấp vào.

Các neo không hỗ trợ thuộc tính bị vô hiệu hóa, vì vậy thay vào đó chúng ta sẽ dựa vào .disabledlớp để làm cho chúng trông bị vô hiệu hóa (nhờ bootstrap một lần nữa) và kết nối một sự kiện nhấp chuột mặc định để ngăn nhấp bằng cách trả về false (không cần preventDefaultxem tại đây ) .

Lưu ý : Bạn không cần mở khóa sự kiện này khi bật lại neo. Đơn giản chỉ cần loại bỏ các .disabledlớp làm thủ thuật.

Tất nhiên, điều này không hữu ích nếu bạn đã đính kèm một trình xử lý nhấp chuột tùy chỉnh vào liên kết, một điều rất phổ biến khi sử dụng bootstrap và jQuery. Vì vậy, để đối phó với điều này, chúng tôi sẽ sử dụng isDisabled()tiện ích mở rộng để kiểm tra .disabledlớp, như thế này:

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

Tôi hy vọng điều đó sẽ giúp đơn giản hóa mọi thứ một chút.


7

Lưu ý rằng có một vấn đề kỳ lạ nếu bạn đang sử dụng các nút JS của Bootstrap và trạng thái 'đang tải'. Tôi không biết tại sao điều này xảy ra, nhưng đây là cách khắc phục.

Giả sử bạn có một nút và bạn đặt nó ở trạng thái tải:

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

Bây giờ bạn muốn đưa nó ra khỏi trạng thái tải, nhưng cũng vô hiệu hóa nó (ví dụ: nút là nút Lưu, trạng thái tải cho biết xác thực đang diễn ra và xác thực không thành công). Điều này có vẻ như hợp lý Bootstrap JS:

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

Thật không may, điều đó sẽ thiết lập lại nút, nhưng không vô hiệu hóa nó. Rõ ràng, button()thực hiện một số nhiệm vụ bị trì hoãn. Vì vậy, bạn cũng sẽ phải hoãn việc vô hiệu hóa của bạn:

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

Một chút khó chịu, nhưng đó là một mô hình tôi đang sử dụng rất nhiều.


6

Câu trả lời tuyệt vời và đóng góp từ tất cả! Tôi đã phải mở rộng chức năng này một chút để bao gồm vô hiệu hóa các yếu tố được chọn:

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

Có vẻ như đang làm việc cho tôi. Cảm ơn tất cả!


5

Đối với loại hành vi đó, tôi luôn sử dụng buttontiện ích jQueryUI , tôi sử dụng nó cho các liên kết và các nút.

Xác định thẻ trong HTML:

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

Sử dụng jQuery để khởi tạo các nút:

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

Sử dụng các buttonphương thức widget để vô hiệu hóa / kích hoạt chúng:

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

Điều đó sẽ quan tâm đến hành vi của nút và con trỏ, nhưng nếu bạn cần tìm hiểu sâu hơn và thay đổi kiểu nút khi bị tắt thì hãy ghi đè lên các lớp CSS sau trong tệp kiểu CSS trang của bạn.

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

Nhưng hãy nhớ rằng: các lớp CSS đó (nếu thay đổi) cũng sẽ thay đổi kiểu cho các widget khác.


1
Đẹp, chắc chắn câu trả lời này là dành cho nút jQuery UIkhông cho nút Bootstrap sử dụng với vani đồng bằng jQuery, các phúc sau những gì các OP đang sử dụng. Btw, đặt một câu trả lời trong một nhận xét về câu hỏi không phải là phương pháp phổ biến ưa thích. ; ^)
ruffin

3

Sau đây đã làm việc cho tôi rất tốt:

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

2

Đây là một câu trả lời khá muộn, tuy nhiên tôi đã vấp phải câu hỏi này trong khi tìm cách vô hiệu hóa các nút boostrap sau khi nhấp vào chúng và có thể thêm một hiệu ứng đẹp mắt (từ một spinner). Tôi đã tìm thấy một thư viện tuyệt vời thực hiện chính xác điều đó:

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

Bạn chỉ cần bao gồm css và js cần thiết, thêm một số thuộc tính vào các nút của bạn và bật lada bằng javascript ... Presto! Các nút của bạn có một cuộc sống mới (vui lòng kiểm tra bản demo để xem nó đẹp như thế nào)!


2

Điều này ở trên không hoạt động vì đôi khi

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

điều chỉnh mã của bạn với

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

2

Tôi biết câu trả lời của mình là muộn, nhưng IMO đây là cách dễ nhất để chuyển một nút 'enable' và nút 'vô hiệu hóa'

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

Giả sử bạn có các nút này trên trang như:

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

Mã js:

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

1

Giả sử bạn có hình như thế này hiện đang được bật.

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

Chỉ cần thêm điều này:

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

và bạn sẽ nhận được cái này sẽ vô hiệu hóa nút

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

2
Câu hỏi hỏi về các nút neo. Tài disabledsản không phải là một tài sản hợp lệ cho các thẻ neo.
biofractal

0

Nếu bạn muốn tắt tính năng có thể nhấp, bạn cũng có thể thêm nội tuyến này vào html

style="cursor: not-allowed;"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.