Vô hiệu hóa / kích hoạt đầu vào với jQuery?


2291
$input.disabled = true;

hoặc là

$input.disabled = "disabled";

Đó là cách tiêu chuẩn? Và ngược lại, làm thế nào để bạn kích hoạt đầu vào bị vô hiệu hóa?



1
Tôi đã tìm thấy plugin DependsOn mà bạn có thể thấy hữu ích
Onshop

Câu trả lời:


3810

jQuery 1.6+

Để thay đổi disabledtài sản bạn nên sử dụng .prop()chức năng.

$("input").prop('disabled', true);
$("input").prop('disabled', false);

jQuery 1.5 trở xuống

Các .prop()chức năng không tồn tại, nhưng .attr()không tương tự:

Đặt thuộc tính bị vô hiệu hóa.

$("input").attr('disabled','disabled');

Để kích hoạt lại, phương pháp thích hợp là sử dụng .removeAttr()

$("input").removeAttr('disabled');

Trong mọi phiên bản của jQuery

Bạn luôn có thể dựa vào đối tượng DOM thực tế và có thể nhanh hơn một chút so với hai tùy chọn còn lại nếu bạn chỉ xử lý một yếu tố:

// assuming an event handler thus 'this'
this.disabled = true;

Lợi thế của việc sử dụng .prop()hoặc .attr()phương thức là bạn có thể đặt thuộc tính cho một loạt các mục đã chọn.


Lưu ý: Trong 1.6 có một .removeProp()phương thức nghe rất giống removeAttr(), nhưng nó KHÔNG NÊN SỬ DỤNG trên các thuộc tính gốc như 'disabled' Trích từ tài liệu:

Lưu ý: Không sử dụng phương pháp này để xóa các thuộc tính gốc như đã chọn, bị vô hiệu hóa hoặc được chọn. Điều này sẽ loại bỏ hoàn toàn thuộc tính và sau khi xóa, không thể thêm lại vào phần tử. Sử dụng .prop () để đặt các thuộc tính này thành false thay thế.

Trên thực tế, tôi nghi ngờ có nhiều cách sử dụng hợp pháp cho phương pháp này, các đạo cụ boolean được thực hiện theo cách mà bạn nên đặt chúng thành false thay vì "loại bỏ" chúng giống như "thuộc tính" của chúng trong 1,5


9
Bên cạnh đó, hãy nhớ rằng, nếu bạn muốn tắt TẤT CẢ các điều khiển nhập mẫu - bao gồm. hộp kiểm, radio, textareas, v.v. - bạn phải chọn ':input', không chỉ 'input'. Cái sau chỉ chọn các phần tử <input> thực tế.
Cornel Masson

35
@CornelMasson input,textarea,select,buttonsử dụng tốt hơn một chút so với :input- :inputvì bộ chọn khá kém hiệu quả vì phải chọn *sau đó lặp qua từng phần tử và lọc theo tên thẻ - nếu bạn chuyển trực tiếp 4 bộ chọn tên thẻ thì sẽ nhanh hơn. Ngoài ra, :inputkhông phải là một bộ chọn CSS tiêu chuẩn, do đó, mọi hiệu suất có thể đạt querySelectorAllđược đều bị mất
gnarf

3
Điều này chỉ ngăn người dùng truy cập nó, hay nó thực sự loại bỏ nó khỏi yêu cầu web?
OneChillDude

4
Việc sử dụng .removeProp("disabled")đã gây ra vấn đề "tài sản bị xóa hoàn toàn và không được thêm lại" như được chỉ ra bởi @ThomasDavidBaker, trong trường hợp một số trình duyệt như Chrome, trong khi nó hoạt động tốt trên một số như Firefox. Chúng ta nên thực sự cẩn thận ở đây. Luôn luôn sử dụng .prop("disabled",false)thay thế
Sandeepan Nath

6
Cả .prop hoặc .attr đều không đủ để vô hiệu hóa các phần tử neo; .prop thậm chí sẽ không làm mờ 'quyền kiểm soát' (.attr, nhưng href vẫn hoạt động). Bạn cũng phải thêm một trình xử lý sự kiện nhấp để gọi ngăn chặnDefault ().
Jeff Lowery

61

Chỉ vì lợi ích của các quy ước mới && làm cho nó có thể thích ứng trong tương lai (trừ khi mọi thứ thay đổi mạnh mẽ với ECMA6 (????):

$(document).on('event_name', '#your_id', function() {
    $(this).removeAttr('disabled');
});

$(document).off('event_name', '#your_id', function() {
    $(this).attr('disabled','disabled');   
});

12
Nhảy vọt! Tại sao $(document).on('event_name', '#your_id', function() {...})thay vì $('#your_id').on('event_name', function() {...}). Như được mô tả trong tài liệu jQuery .on () , trước đây sử dụng ủy quyền và lắng nghe tất cả các event_name sự kiện xảy ra documentvà kiểm tra xem chúng có khớp không #your_id. Cái sau chỉ nghe đặc biệt cho $('#your_id')các sự kiện và quy mô tốt hơn.
Peter V. Mørch

23
Cái trước hoạt động cho các phần tử được chèn vào DOM tại bất kỳ thời điểm nào, phần sau chỉ dành cho những phần còn lại tại thời điểm đó.
crazymykl

1
@crazymykl Đúng nhưng bạn không nên thêm các yếu tố với id đã có trên trang của mình.
SepehrM

33
    // Disable #x
    $( "#x" ).prop( "disabled", true );
    // Enable #x
    $( "#x" ).prop( "disabled", false );

Đôi khi bạn cần phải tắt / bật phần tử biểu mẫu như đầu vào hoặc textarea. Jquery giúp bạn dễ dàng thực hiện điều này với việc đặt thuộc tính bị vô hiệu thành "bị vô hiệu hóa". Ví dụ:

  //To disable 
  $('.someElement').attr('disabled', 'disabled');

Để bật phần tử bị vô hiệu hóa, bạn cần xóa thuộc tính "bị vô hiệu hóa" khỏi phần tử này hoặc làm trống chuỗi đó. Ví dụ:

//To enable 
$('.someElement').removeAttr('disabled');

// OR you can set attr to "" 
$('.someElement').attr('disabled', '');

tham khảo: http://garmoncheg.blogspot.fr/2011/07/how-to-disableenable-element-with.html


13
$("input")[0].disabled = true;

hoặc là

$("input")[0].disabled = false;

2
Tất nhiên câu hỏi yêu cầu cho jQuery và điều này đang thay đổi trạng thái trong JavaScript đơn giản, nhưng nó hoạt động.
bản6

1
Điều này thay đổi trạng thái trong JavaScript, nhưng nó vẫn sử dụng bộ chọn jQuery để có đầu vào đầu tiên.
cjsimon

3
Nhưng tôi không nghĩ rằng chúng tôi đang thực hiện bách khoa toàn thư về trò đùa ở đây, nếu một câu trả lời hoạt động, thật tốt
Sajjad Shirazy

8

Bạn có thể đặt cái này ở đâu đó trên toàn cầu trong mã của bạn:

$.prototype.enable = function () {
    $.each(this, function (index, el) {
        $(el).removeAttr('disabled');
    });
}

$.prototype.disable = function () {
    $.each(this, function (index, el) {
        $(el).attr('disabled', 'disabled');
    });
}

Và sau đó bạn có thể viết những thứ như:

$(".myInputs").enable();
$("#otherInput").disable();

3
Trong khi gói các chức năng rất thuận tiện, bạn nên đã sử dụng propkhông attrdisabledtài sản để cho nó hoạt động một cách chính xác (giả jQuery 1.6 hoặc cao hơn).
Mã hóa đã qua

1
@TrueBlueAussie Nhược điểm của việc sử dụng là attrgì? Tôi sử dụng mã trên trong một số dự án và theo như tôi nhớ thì nó hoạt động tốt
Nicu Surdu

1
Các ngoại lệ rõ ràng là các điều khiển với các thuộc tính đằng sau hậu trường. Một trong những nổi tiếng nhất là checkedtài sản của hộp kiểm tra. Sử dụng attrsẽ không cho kết quả tương tự.
Mã hóa đã qua

7

Nếu bạn chỉ muốn đảo ngược trạng thái hiện tại (như hành vi nút chuyển đổi):

$("input").prop('disabled', ! $("input").prop('disabled') );

1
cảm ơn tôi có một điều tương tự cho việc chuyển đổi nó là; $ ("đầu vào"). prop ('bị vô hiệu hóa', hàm (i, v) {return! v;});
Floww

5

Có nhiều cách sử dụng chúng, bạn có thể bật / tắt bất kỳ yếu tố nào :

Cách tiếp cận 1

$("#txtName").attr("disabled", true);

Cách tiếp cận 2

$("#txtName").attr("disabled", "disabled");

Nếu bạn đang sử dụng jQuery 1.7 hoặc phiên bản cao hơn thì hãy sử dụng prop (), thay vì attr ().

$("#txtName").prop("disabled", "disabled");

Nếu bạn muốn kích hoạt bất kỳ yếu tố nào thì bạn chỉ cần làm ngược lại với những gì bạn đã làm để vô hiệu hóa nó. Tuy nhiên jQuery cung cấp một cách khác để loại bỏ bất kỳ thuộc tính nào.

Cách tiếp cận 1

$("#txtName").attr("disabled", false);

Cách tiếp cận 2

$("#txtName").attr("disabled", "");

Cách tiếp cận 3

$("#txtName").removeAttr("disabled");

Một lần nữa, nếu bạn đang sử dụng jQuery 1.7 hoặc phiên bản cao hơn thì hãy sử dụng prop (), thay vì attr (). Đó là. Đây là cách bạn kích hoạt hoặc vô hiệu hóa bất kỳ yếu tố nào bằng jQuery.


2

Cập nhật năm 2018:

Bây giờ không cần jQuery và đã lâu rồi document.querySelector hoặc document.querySelectorAll(đối với nhiều phần tử) thực hiện gần như chính xác công việc tương tự như $, cộng với các phần tử rõ ràng hơn getElementById,, getElementsByClassName.getElementsByTagName

Vô hiệu hóa một trường của lớp "hộp kiểm đầu vào"

document.querySelector('.input-checkbox').disabled = true;

hoặc nhiều yếu tố

document.querySelectorAll('.input-checkbox').forEach(el => el.disabled = true);

1
câu hỏi đặc biệt hỏi về jQuery ... nhưng bằng nhau, tuyên bố của bạn là chính xác và đáng để biết rằng jQuery không cần phải sử dụng cho điều này khi có nhiều yếu tố nữa.
ADyson

2

Bạn có thể sử dụng phương thức prop prop () để vô hiệu hóa hoặc kích hoạt phần tử biểu mẫu hoặc điều khiển động bằng cách sử dụng jQuery. Phương thức prop () yêu cầu jQuery 1.6 trở lên.

Thí dụ:

<script type="text/javascript">
        $(document).ready(function(){
            $('form input[type="submit"]').prop("disabled", true);
            $(".agree").click(function(){
                if($(this).prop("checked") == true){
                    $('form input[type="submit"]').prop("disabled", false);
                }
                else if($(this).prop("checked") == false){
                    $('form input[type="submit"]').prop("disabled", true);
                }
            });
        });
    </script>

1

Vô hiệu hóa:

$('input').attr('readonly', true); // Disable it.
$('input').addClass('text-muted'); // Gray it out with bootstrap.

Cho phép:

$('input').attr('readonly', false); // Enable it.
$('input').removeClass('text-muted'); // Back to normal color with bootstrap.

1

Vô hiệu hóa đúng cho loại đầu vào:

Trong trường hợp có loại đầu vào cụ thể ( Ví dụ: Kiểu nhập văn bản )

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

Đối với tất cả các loại đầu vào

$("input").attr('disabled', true);

1
Cảm ơn điều này đã giúp tôi cô lập với một tên đầu vào. $("input[name=method]").prop('disabled', true);
Harry Bosh

1

cái này hiệu quả với tôi

$("#values:input").attr("disabled",true);
$("#values:input").attr("disabled",false);

0

Tôi đã sử dụng câu trả lời @gnarf và thêm nó dưới dạng hàm

   $.fn.disabled = function (isDisabled) {
     if (isDisabled) {
       this.attr('disabled', 'disabled');
     } else {
       this.removeAttr('disabled');
     }
   };

Sau đó sử dụng như thế này

$('#myElement').disable(true);

0

2018, không có JQuery (ES6)

Vô hiệu hóa tất cả input:

[...document.querySelectorAll('input')].map(e => e.disabled = true);

Vô hiệu hóa inputvớiid="my-input"

document.getElementById('my-input').disabled = true;

Câu hỏi là với JQuery, đó chỉ là FYI.



0

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

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

 $( "#id" ).prop( "disabled", false );

-1
<html>
<body>

Name: <input type="text" id="myText">



<button onclick="disable()">Disable Text field</button>
<button onclick="enable()">Enable Text field</button>

<script>
function disable() {
    document.getElementById("myText").disabled = true;
}
function enable() {
    document.getElementById("myText").disabled = false;
}
</script>

</body>
</html>

1
Từ hàng đợi đánh giá : Tôi có thể yêu cầu bạn vui lòng thêm một số bối cảnh xung quanh câu trả lời của bạn. Câu trả lời chỉ có mã là khó hiểu. Nó sẽ giúp người hỏi và người đọc tương lai cả nếu bạn có thể thêm thông tin trong bài viết của mình.
RBT

-1

Trong jQuery Mobile:

Để vô hiệu hóa

$('#someselectElement').selectmenu().selectmenu('disable').selectmenu('refresh', true);
$('#someTextElement').textinput().textinput('disable');

Để kích hoạt

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
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.