สลับการปิดใช้งานแอตทริบิวต์การใช้ jQuery


191

นี่คือรหัสของฉัน:

$("#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.
});

ฉันจะสลับได้.attr('disabled',false);อย่างไร

ฉันดูเหมือนจะไม่พบมันบน Google


เหตุผลใดที่คุณไม่สามารถใช้คุณสมบัติที่ปิดใช้งานของฟิลด์ได้ $("input").get(0).disabled = isFalse;// jsfiddle.net/uAfhj
Shanimal

ฉันพบปลั๊กอินDependsOnซึ่งคุณอาจพบว่ามีประโยชน์
Onshop

คำตอบ:


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

.prop()วิธีการยอมรับสองอาร์กิวเมนต์:

  • ชื่อคุณสมบัติ(ปิดใช้งานตรวจสอบเลือก) ทุกอย่างที่เป็นจริงหรือเท็จ
  • มูลค่าทรัพย์สินสามารถ:
    • ( ว่าง ) - ส่งคืนค่าปัจจุบัน
    • บูลีน (จริง / เท็จ) - ตั้งค่าคุณสมบัติ
    • ฟังก์ชั่น - จะถูกดำเนินการสำหรับองค์ประกอบที่พบแต่ละค่าที่ส่งคืนจะใช้ในการตั้งค่าคุณสมบัติ มีสองข้อโต้แย้งที่ส่งผ่าน; อาร์กิวเมนต์แรกคือดัชนี (0, 1, 2, เพิ่มสำหรับแต่ละองค์ประกอบที่พบ) อาร์กิวเมนต์ที่สองคือมูลค่าปัจจุบันขององค์ประกอบ (จริง / เท็จ)

ดังนั้นในกรณีนี้ฉันใช้ฟังก์ชั่นที่ให้ดัชนี (i) และค่าปัจจุบัน (v) จากนั้นฉันคืนค่าตรงกันข้ามกับค่าปัจจุบันดังนั้นสถานะคุณสมบัติจึงกลับด้าน


2
เพิ่มขึ้นเป็น (ฉันเชื่อว่า) .prop () เป็นวิธีที่ถูกต้องในการทำเช่นนี้และได้รับการเพิ่มอย่างแม่นยำเพื่อวัตถุประสงค์ในการตั้งค่าสิ่งต่าง ๆ เช่นพิการ = "ปิดการใช้งาน" + สง่างาม
Morvael

5
คืออะไรiและv?
Matt R

@MattR ฉันได้เพิ่มคำอธิบายสั้น ๆ
Arne

นี่เป็นคำตอบที่ยอดเยี่ยม!
LeBlaireau

6
เป็นการอัปเดตสิ่งนี้ดูเรียบร้อยมากโดยใช้ฟังก์ชั่นลูกศร:$('#el').prop('disabled', (i, v) => !v);
igneosaur

101

ฉันคาดว่าจะได้รับการเปรียบเทียบเบราว์เซอร์เต็มรูปแบบdisabledควรกำหนดโดยค่าdisabledหรือลบออก!
นี่คือปลั๊กอินเล็ก ๆ ที่ฉันเพิ่งทำ:

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

การเชื่อมโยงตัวอย่าง

แก้ไข: อัปเดตลิงค์ตัวอย่าง / รหัสเพื่อรักษาความสามารถในการลูกโซ่!
แก้ไข 2:
จากความคิดเห็น @lonesomeday นี่คือรุ่นที่ปรับปรุง:

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

28
สิ่งนี้อาจใช้งานได้ แต่มันจะช้าเพราะคุณสร้างวัตถุ jQuery ใหม่ตลอดเวลา $.fn.toggleDisabled = function(){ return this.each(function(){ this.disabled = !this.disabled; });}คือทั้งหมดที่คุณต้องการ
lonesomeday

@lonesomeday: ฉันจะโพสต์สิ่งนี้ แต่ฉันมักจะคิดว่านี่ไม่ใช่วิธีที่ถูกต้องในการตั้งค่า / ยกเลิกการตั้งค่าdisabledแอตทริบิวต์ อย่างไรก็ตามหากคุณสามารถยืนยันได้ว่านี่เป็นโซลูชันข้ามเบราว์เซอร์ .. ฉันจะอัปเดตคำตอบของฉัน
ifaour

2
สำหรับผู้ใช้ Google ในอนาคตโซลูชันนี้ใช้งานได้ดีกับแอตทริบิวต์ 'ต้องมี'
skybondsor

propเป็นวิธีที่ดีกว่าตั้งแต่ 1.6 ตามที่ Arne พูด
Ciro Santilli 郝海东冠状病六四事件法轮功

19
    $ ( '# ช่องทำเครื่องหมาย'). คลิก (ฟังก์ชั่น () {
        $ ('# submit'). attr ('ปิดการใช้งาน',! $ (this) .attr ('ทำเครื่องหมาย'));
    });


2
หมายเหตุ: ทำงานได้ต่ำกว่า jQuery 1.6 ใช้. prop () แทนที่จะเป็น attr () ทั้งสองครั้งเพื่อรับค่าบูลีนกลับมา ดูapi.jquery.com/prop
Manuel Arwed Schmidt

5

อีกตัวเลือกง่าย ๆ ที่อัปเดตเมื่อคลิกที่ช่องทำเครื่องหมาย

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

ในการดำเนินการ: ลิงค์


7
กำจัดifบล็อกด้วย$('#item').prop('disabled', this.checked);
Naeem Sarfraz

2

ค่อนข้างนานในภายหลังและด้วย @arne ฉันได้สร้างฟังก์ชั่นเล็ก ๆ ที่คล้ายกันนี้เพื่อจัดการกับสิ่งที่อินพุตควรถูกปิดใช้งานและซ่อนอยู่หรือเปิดใช้งานและแสดง:

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

ดังนั้นวัตถุ jQuery (เช่น $ ('input [name = "something"]')) จะถูกเปลี่ยนโดยใช้:

toggleInputState(myElement, myBoolean)

1

สิ่งนี้ค่อนข้างง่ายด้วยไวยากรณ์การโทรกลับของ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
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.