Làm cách nào để loại bỏ thuộc tính bị vô hiệu hóa bằng cách sử dụng jQuery?


394

Tôi phải vô hiệu hóa đầu vào lúc đầu và sau đó nhấp vào liên kết để kích hoạt chúng.

Đây là những gì tôi đã cố gắng cho đến nay, nhưng nó không hoạt động.

HTML:

<input type="text" disabled="disabled" class="inputDisabled" value="">

jQuery:

$("#edit").click(function(event){
   event.preventDefault();
   $('.inputDisabled').removeAttr("disabled")
});


Điều này cho tôi thấy truevà sau đó falsenhưng không có gì thay đổi cho các đầu vào:

$("#edit").click(function(event){
   alert('');
   event.preventDefault();
   alert($('.inputDisabled').attr('disabled'));
   $('.inputDisabled').removeAttr("disabled");
   alert($('.inputDisabled').attr('disabled'));
});

2
Tôi không thấy vấn đề của bạn. Bạn hỏi gì?
nicosantangelo

Vậy câu hỏi là gì? ý tôi là bạn đang gặp phải vấn đề gì
Satya Teja

7
Sử dụng prop () - .prop ('bị vô hiệu hóa', sai)
Jay Blanchard

Nếu vấn đề của bạn được giải quyết, vui lòng đánh dấu vào câu trả lời được chấp nhận (Real) để người khác biết ...
Dhamu

vấn đề là nó không bị vô hiệu hóa sau clic
fatiDev

Câu trả lời:


817

Luôn sử dụng prop()phương thức để bật hoặc tắt các thành phần khi sử dụng jQuery (xem bên dưới để biết lý do).

Trong trường hợp của bạn, nó sẽ là:

$("#edit").click(function(event){
   event.preventDefault();
   $('.inputDisabled').prop("disabled", false); // Element(s) are now enabled.
});

ví dụ jsFiddle ở đây.


Tại sao sử dụng prop()khi bạn có thể sử dụng attr()/ removeAttr()để làm điều này?

Về cơ bản, prop()nên được sử dụng khi nhận hoặc thiết lập các thuộc tính (ví dụ như autoplay, checked, disabledrequiredgiữa những người khác).

Bằng cách sử dụng removeAttr(), bạn đang loại bỏ hoàn toàn disabledchính thuộc tính - trong khi prop()chỉ đơn thuần là đặt giá trị boolean bên dưới của thuộc tính thành false.

Mặc dù những gì bạn muốn làm có thể được thực hiện bằng cách sử dụng attr()/ removeAttr(), nhưng điều đó không có nghĩa là nó nên được thực hiện (và có thể gây ra hành vi lạ / có vấn đề, như trong trường hợp này).

Các trích xuất sau (lấy từ tài liệu jQuery cho prop () ) giải thích các điểm này chi tiết hơn:

"Sự khác biệt giữa các thuộc tính và thuộc tính có thể quan trọng trong các tình huống cụ thể. Trước khi jQuery 1.6, .attr()phương thức đôi khi tính đến các giá trị thuộc tính khi truy xuất một số thuộc tính, có thể gây ra hành vi không nhất quán. Đối với jQuery 1.6, .prop() phương thức cung cấp một cách để truy xuất rõ ràng giá trị .attr()thuộc tính , trong khi lấy các thuộc tính. "

"Các thuộc tính thường ảnh hưởng đến trạng thái động của thành phần DOM mà không thay đổi thuộc tính HTML được tuần tự hóa. Ví dụ bao gồm thuộc value tính của các thành phần đầu vào, thuộc disabledtính của đầu vào và nút hoặc thuộc checkedtính của hộp kiểm. .prop()Phương thức này nên được sử dụng để đặt disabledcheckedthay vì các .attr() phương pháp. các .val()phương pháp nên được sử dụng để nhận và thiết lập value".


3
Mọi người cũng nên biết về cờ kiểm tra bẩn, hoàn toàn phá vỡ attrso với propcác hộp kiểm: w3.org/TR/html5/forms.html#concept-input-checked-denty ngoại trừ phép thuật giải quyết nội bộ của jQuery.
Ciro Santilli 郝海东 冠状 病 事件

19
Hmm, .prop ("bị vô hiệu hóa", sai) dường như không hoạt động đối với tôi trong một nút - để lại thuộc tính 'bị vô hiệu hóa' trong thẻ không có giá trị.
UpTheCux

3
@UpTheCalet cũng không làm việc cho tôi. Nhưng tôi phát hiện ra là một vấn đề phạm vi với mệnh đề 'this' (như thường lệ). Trong trường hợp cụ thể .prop()được thực thi trên phần tử được chỉ ra bởi this( this.prop("disabled", false)nhưng trong một cuộc gọi lại, nó bị ràng buộc với phần tử sai, vì vậy tôi phải thực hiện một var that = thiscách giải quyết chung . Cố gắng chơi với .apply()/ .call()không hoạt động tốt; Tôi không biết Tại sao. Kiểm tra kỹ với console.log(this)nếu nó được đặt thành đối tượng bạn muốn, ngay trước khi gọithis.prop(...)
Kamafeather

3
Tôi chỉ định câu trả lời này là một ứng cử viên để chuyển đổi sang phần tài liệu. Rõ ràng, đầy đủ, được viết tốt.
Anne Gunn

4
Bằng cách sử dụng removeAttr (), bạn sẽ loại bỏ hoàn toàn chính thuộc tính bị vô hiệu hóa - trong khi prop () chỉ đơn thuần là đặt giá trị boolean bên dưới của thuộc tính thành false. Tôi không tin đây là sự thật. Trong HTML, sự hiện diện đơn thuần của thuộc disabledtính sẽ vô hiệu hóa phần tử. Ví dụ, có một <button disabled="false"></button> sẽ không kích hoạt nút, thuộc tính phải được loại bỏ. Bằng cách gọi $('button').prop('disabled', false);jQuery sẽ loại bỏ thuộc tính cho bạn, như tôi đã quan sát trong codepen này (kiểm tra để xem loại bỏ thuộc tính).
Naftali

42
<input type="text" disabled="disabled" class="inputDisabled" value="">
​<button id="edit">Edit</button>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

$("#edit").click(function(event){
    event.preventDefault();
    $('.inputDisabled').removeAttr("disabled")
});​

http://jsfiddle.net/ZwHfY/


42

để loại bỏ việc sử dụng thuộc tính bị vô hiệu hóa,

 $("#elementID").removeAttr('disabled');

và để thêm sử dụng thuộc tính bị vô hiệu hóa,

$("#elementID").prop("disabled", true);

Thưởng thức :)


4
Hoặc chỉ phần tử.removeAttribution ('khuyết tật') trong vanilla js
Dragos Rusu

16

Sử dụng như thế này,

HTML:

<input type="text" disabled="disabled" class="inputDisabled" value="">

<div id="edit">edit</div>

JS:

 $('#edit').click(function(){ // click to
            $('.inputDisabled').attr('disabled',false); // removing disabled in this class
 });

6
Điều này thực sự làm việc cho tôi. Prop ('khuyết tật', sai) đáng ngạc nhiên đã không hoạt động.
Stefan

@Stefan điều tương tự ở đây! Bạn đã tìm hiểu tại sao?
Alexander Suraphel

1
Tôi biết đây là một chủ đề cổ xưa nhưng nếu ai đó vẫn đấu tranh với điều này, vấn đề của tôi là yếu tố này là một <a>, trên đó .prop('disabled', false)không hoạt động. Tôi đã thay đổi nó thành một <button>và nó hoạt động ngay bây giờ
Oliver Nagy


3

Nghĩ rằng bạn có thể dễ dàng thiết lập

$(function(){
$("input[name^=radio_share]").click
(
    function()
    {
        if($(this).attr("id")=="radio_share_dependent")
        {
            $(".share_dependent_block input, .share_dependent_block select").prop("disabled",false);   
        }
        else
        {
            $(".share_dependent_block input, .share_dependent_block select").prop("disabled",true);   
        }
    }
 );
});

3

Đây là mã duy nhất làm việc cho tôi:

element.removeProp('disabled')

Lưu ý rằng nó removePropvà không removeAttr.

Tôi đang sử dụng jQuery 2.1.3ở đây.


12
Từ tài liệu jQuery: Quan trọng: không nên sử dụng phương thức .removeProp () để đặt các thuộc tính này thành false. Khi một thuộc tính gốc được loại bỏ, nó không thể được thêm lại. Xem .removeProp () để biết thêm thông tin.
XanatosLightfiren

2

2018, không có JQuery

Tôi biết câu hỏi là về JQuery: câu trả lời này chỉ là FYI.

document.getElementById('edit').addEventListener(event => {
    event.preventDefault();
    [...document.querySelectorAll('.inputDisabled')].map(e => e.disabled = false);
}); 

0

Câu hỏi này đặc biệt đề cập đến jQuery, nhưng nếu bạn đang tìm cách thực hiện điều này mà không cần jQuery, thì tương đương trong JavaScript vanilla là:

elem.removeAttribute('disabled');

elem.removeAttr('disabled');làm việc cho tôi
Cheng Hui Yuan
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.