Thêm thuộc tính bị vô hiệu hóa vào thành phần đầu vào bằng Javascript


141

Tôi có một hộp đầu vào và tôi muốn nó bị vô hiệu hóa và đồng thời ẩn nó để tránh các vấn đề khi chuyển biểu mẫu của tôi.

Cho đến nay tôi có đoạn mã sau để ẩn đầu vào của mình:

$(".shownextrow").click(function() { 
    $(this).closest("tr").next().show().find('.longboxsmall').hide();
});

Đây là đầu vào bị ẩn do kết quả:

<input class="longboxsmall" type="text" />

Làm thế nào tôi cũng có thể thêm thuộc tính bị vô hiệu hóa vào đầu vào?

Câu trả lời:


306

$("input").attr("disabled", true); kể từ ... tôi không biết gì nữa.

Đó là tháng 12 năm 2013 và tôi thực sự không biết phải nói gì với bạn.

Đầu tiên là luôn luôn .attr(), sau đó là luôn luôn .prop(), vì vậy tôi quay lại đây để cập nhật câu trả lời và làm cho nó chính xác hơn.

Sau đó một năm, jQuery đã thay đổi suy nghĩ của họ một lần nữa và tôi thậm chí không muốn theo dõi điều này.

Câu chuyện dài, tính đến thời điểm hiện tại, đây là câu trả lời tốt nhất: "bạn có thể sử dụng cả hai ... nhưng nó phụ thuộc."

Thay vào đó, bạn nên đọc câu trả lời này: https://stackoverflow.com/a/5876747/257493

Và ghi chú phát hành của họ cho sự thay đổi đó được bao gồm ở đây:

Không nên sử dụng .attr () hay .prop () để nhận / cài đặt giá trị. Sử dụng phương thức .val () thay vào đó (mặc dù sử dụng .attr ("value", "somevalue") sẽ tiếp tục hoạt động, như đã làm trước 1.6).

Tóm tắt về cách sử dụng ưa thích

Phương thức .prop () nên được sử dụng cho các thuộc tính / thuộc tính boolean và cho các thuộc tính không tồn tại trong html (như window.location). Tất cả các thuộc tính khác (những thuộc tính bạn có thể thấy trong html) có thể và nên tiếp tục được thao tác với phương thức .attr ().

Hay nói cách khác:

".prop = công cụ phi tài liệu"

".attr" = công cụ tài liệu

... ...

Tất cả chúng ta có thể học một bài học ở đây về tính ổn định của API ...


3
+1 để làm cho văn bản cập nhật đủ lớn để tôi chú ý
Vael Victus

@VaelVictus Không quá nhanh. Tôi rất tiếc phải nói rằng họ đã thay đổi nó một năm sau khi tôi đăng bài này ... và tôi quên mất câu trả lời này. Đọc câu trả lời này: stackoverflow.com/a/5876747/257493
Ẩn danh

1
Sự khác biệt về tài liệu / phi tài liệu giữa .prop và .attr là vô cùng hữu ích và tôi chưa bao giờ thấy bối cảnh được đóng khung theo cách cô đọng như vậy trước đây. Nhiều đánh giá cao!
vô song

51

Mã làm việc từ các nguồn của tôi:

THẾ GIỚI HTML

<select name="select_from" disabled>...</select>

THẾ GIỚI

var from = jQuery('select[name=select_from]');

//add disabled
from.attr('disabled', 'disabled');



//remove it
from.removeAttr("disabled");

2
Lưu ý cho những người đến đây từ Google, trực tiếp từ jQuery :As of jQuery 1.6, the .attr() method returns undefined for attributes that have not been set. To retrieve and change DOM properties such as the checked, selected, or disabled state of form elements, use the .prop() method
Erenor Paz

16

Nếu bạn đang sử dụng jQuery thì có một vài cách khác nhau để đặt thuộc tính bị vô hiệu hóa.

var $element = $(...);
    $element.prop('disabled', true);
    $element.attr('disabled', true); 

    // The following do not require jQuery
    $element.get(0).disabled = true;
    $element.get(0).setAttribute('disabled', true);
    $element[0].disabled = true;
    $element[0].setAttribute('disabled', true);

Thế còn $element.eq(0)[0].disabled = true;? :-P
qwertynl

1
Vâng, đó là để nâng cao cho tôi, tôi không đi xa để cải thiện hiệu suất.
iConnor

+1. Mặc dù nó là một chút dư thừa. Nếu bạn đang xử lý một NodeList / mảng các phần tử thì thật ngu ngốc khi chọn chúng theo chỉ mục như thế. Lặp lại hoặc chỉ đơn giản là chỉ chọn các yếu tố bạn cần có ý nghĩa hơn.

13
$(element).prop('disabled', true); //true|disabled will work on all
$(element).attr('disabled', true); 
element.disabled = true;
element.setAttribute('disabled', true);

Tất cả các bên trên là giải pháp hoàn toàn hợp lệ. Chọn một trong những phù hợp với nhu cầu của bạn tốt nhất.


1
Cảm ơn bạn đã cung cấp một giải pháp không yêu cầu jQuery.
Elias Zamaria

12

Bạn có thể lấy phần tử DOM và đặt thuộc tính bị vô hiệu hóa trực tiếp.

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').hide()[0].disabled = 'disabled';
});

hoặc nếu có nhiều hơn một, bạn có thể sử dụng each()để đặt tất cả chúng:

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').each(function() {
               this.style.display = 'none';
               this.disabled = 'disabled';
          });
});

5

Chỉ cần sử dụng attr()phương thức của jQuery

$(this).closest("tr").next().show().find('.longboxsmall').attr('disabled', 'disabled');

3
và xóa trạng thái bị vô hiệu hóa bằng cách sử dụng.removeAttr('disabled');
ruhong

2

Vì câu hỏi là hỏi làm thế nào để làm điều này với JS Tôi đang cung cấp một triển khai JS vanilla.

var element = document.querySelector(".your-element-class-goes-here");
// it's a good idea to check whether the element exists
if (element != null && element != undefined) {
  element.disabled = "disabled";
}

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.