Chuyển đổi thuộc tính bị vô hiệu hóa đầu vào bằng jQuery


189

Đây là mã của tôi:

$("#product1 :checkbox").click(function(){
    $(this)
        .closest('tr') // Find the parent row.
            .find(":input[type='text']") // Find text elements in that row.
                .attr('disabled',false).toggleClass('disabled') // Enable them.
                .end() // Go back to the row.
            .siblings() // Get its siblings
                .find(":input[type='text']") // Find text elements in those rows.
                .attr('disabled',true).removeClass('disabled'); // Disable them.
});

Làm thế nào để tôi chuyển đổi .attr('disabled',false);?

Tôi dường như không thể tìm thấy nó trên Google.


Bất kỳ lý do tại sao bạn không thể sử dụng tài sản bị vô hiệu hóa của lĩnh vực này? $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

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

Câu trả lời:


443
$('#el').prop('disabled', function(i, v) { return !v; });

Các .prop()phương pháp chấp nhận hai đối số:

  • Tên thuộc tính (bị vô hiệu hóa, được chọn, được chọn) bất cứ thứ gì đúng hoặc sai
  • Giá trị tài sản , có thể là:
    • ( trống ) - trả về giá trị hiện tại.
    • boolean (true / false) - đặt giá trị thuộc tính.
    • Hàm - Được thực thi cho từng phần tử tìm thấy, giá trị được trả về được sử dụng để đặt thuộc tính. Có hai đối số được thông qua; đối số đầu tiên là chỉ số (0, 1, 2, tăng cho mỗi phần tử tìm thấy). Đối số thứ hai là giá trị hiện tại của phần tử (true / false).

Vì vậy, trong trường hợp này, tôi đã sử dụng một hàm cung cấp cho tôi chỉ số (i) và giá trị hiện tại (v), sau đó tôi trả về giá trị ngược lại của giá trị hiện tại, do đó trạng thái thuộc tính bị đảo ngược.


2
Được nâng cấp là (tôi tin) .prop () là cách chính xác để làm điều này và được thêm chính xác cho mục đích thiết lập những thứ như khuyết tật = "bị vô hiệu hóa" + thanh lịch của nó
Morvael

5
Là gì iv?
Matt R

@MattR Tôi đã thêm một lời giải thích ngắn.
Arne

đây là một câu trả lời tuyệt vời
LeBlaireau

6
Là một bản cập nhật, điều này trông rất gọn gàng khi sử dụng các chức năng mũi tên:$('#el').prop('disabled', (i, v) => !v);
igneizard

101

Tôi đoán để có được sự so sánh trình duyệt đầy đủ disablednên được đặt theo giá trị disabledhoặc bị xóa!
Đây là một plugin nhỏ mà tôi vừa thực hiện:

(function($) {
    $.fn.toggleDisabled = function() {
        return this.each(function() {
            var $this = $(this);
            if ($this.attr('disabled')) $this.removeAttr('disabled');
            else $this.attr('disabled', 'disabled');
        });
    };
})(jQuery);

Ví dụ liên kết .

EDIT: đã cập nhật liên kết ví dụ / mã để duy trì khả năng liên kết!
EDIT 2:
Dựa trên nhận xét @lonesomeday, đây là phiên bản nâng cao:

(function($) {
    $.fn.toggleDisabled = function(){
        return this.each(function(){
            this.disabled = !this.disabled;
        });
    };
})(jQuery);

28
Điều này có thể hoạt động, nhưng nó sẽ chậm, vì bạn liên tục tạo các đối tượng jQuery mới. $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}là tất cả những gì bạn cần.
cô đơn

@lonesomeday: Tôi định đăng bài này nhưng tôi có xu hướng nghĩ rằng đây không phải là cách chính xác để đặt / hủy đặt disabledthuộc tính. Dù sao, nếu bạn có thể xác nhận rằng đây là một giải pháp đa trình duyệt..Tôi sẽ cập nhật câu trả lời của tôi.
nếu

2
Đối với bất kỳ nhân viên Google trong tương lai, giải pháp này hoạt động tốt như nhau đối với thuộc tính 'bắt buộc'.
skybondsor

proplà phương pháp tốt hơn kể từ 1.6 như Arne đã nói.
Ciro Santilli 郝海东 冠状 病 事件

19
    $ ('# hộp kiểm'). click (function () {
        $ ('# submit'). attr ('bị vô hiệu hóa' ,! $ (Cái này) .attr ('đã kiểm tra'));
    });


2
Lưu ý: chỉ hoạt động dưới jQuery 1.6. Sử dụng .prop () thay vì attr () trên cả hai lần xuất hiện để lấy lại giá trị boolean. Xem api.jquery.com/prop
Manuel Arwed Schmidt

5

Một tùy chọn đơn giản khác cập nhật khi nhấp vào hộp kiểm.

HTML:

<input type="checkbox" id="checkbox/>
<input disabled type="submit" id="item"/>

jQuery:

$('#checkbox').click(function() {
    if (this.checked) {
        $('#item').prop('disabled', false); // If checked enable item       
    } else {
        $('#item').prop('disabled', true); // If checked disable item                   
    }
});

Trong hành động: liên kết


6
Thoát khỏi ifkhối với$('#item').prop('disabled', this.checked);
Naeem Sarfraz

2

Khá lâu sau, và nhờ @arne, tôi đã tạo ra chức năng nhỏ tương tự này để xử lý nơi đầu vào bị vô hiệu hóa VÀ ẩn hoặc bật VÀ hiển thị:

function toggleInputState(el, on) {
  // 'on' = true(visible) or false(hidden)
  // If a field is to be shown, enable it; if hidden, disable it.
  // Disabling will prevent the field's value from being submitted
  $(el).prop('disabled', !on).toggle(on);
}

Sau đó, một đối tượng jQuery (chẳng hạn như $ ('input [name = "Something"]')) được chuyển đổi đơn giản bằng cách sử dụng:

toggleInputState(myElement, myBoolean)

1

Điều này khá đơn giản với cú pháp gọi lại của attr:

$("#product1 :checkbox").click(function(){
  $(this)
   .closest('tr') // find the parent row
       .find(":input[type='text']") // find text elements in that row
           .attr('disabled',function(idx, oldAttr) {
               return !oldAttr; // invert disabled value
           })
           .toggleClass('disabled') // enable them
       .end() // go back to the row
       .siblings() // get its siblings
           .find(":input[type='text']") // find text elements in those rows
               .attr('disabled',function(idx, oldAttr) {
                   return !oldAttr; // invert disabled value
               })
               .removeClass('disabled'); // disable them
});
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.