ปิดการใช้งาน / เปิดใช้งานอินพุตด้วย jQuery หรือไม่


2291
$input.disabled = true;

หรือ

$input.disabled = "disabled";

วิธีมาตรฐานคืออะไร และในทางกลับกันคุณจะเปิดใช้งานอินพุตที่ปิดใช้งานอย่างไร



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

คำตอบ:


3810

jQuery 1.6+

ในการเปลี่ยนdisabledคุณสมบัติคุณควรใช้.prop()ฟังก์ชั่น

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

jQuery 1.5 และต่ำกว่า

.prop()ฟังก์ชั่นไม่ได้อยู่ แต่.attr()ไม่คล้ายกัน:

ตั้งค่าคุณลักษณะที่ปิดใช้งาน

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

เมื่อต้องการเปิดใช้งานอีกครั้งวิธีการที่เหมาะสมคือการใช้ .removeAttr()

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

ใน jQuery ทุกรุ่น

คุณสามารถพึ่งพาวัตถุ DOM จริงและอาจเร็วกว่าอีกสองตัวเลือกเล็กน้อยหากคุณจัดการกับองค์ประกอบเดียวเท่านั้น:

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

ข้อดีของการใช้.prop()หรือ.attr()วิธีการคือคุณสามารถกำหนดคุณสมบัติให้กับรายการที่เลือก


หมายเหตุ:ใน 1.6 มี.removeProp()วิธีการที่ฟังดูเหมือนเป็นอย่างมากremoveAttr()แต่ไม่ควรใช้กับคุณสมบัติดั้งเดิมเช่น'disabled' ข้อความที่ตัดตอนมาจากเอกสาร:

หมายเหตุ: อย่าใช้วิธีนี้เพื่อลบคุณสมบัติดั้งเดิมเช่นทำเครื่องหมายปิดใช้งานหรือเลือกไว้ สิ่งนี้จะลบคุณสมบัติทั้งหมดและเมื่อลบแล้วจะไม่สามารถเพิ่มองค์ประกอบอีกครั้งได้ ใช้. prop () เพื่อตั้งค่าคุณสมบัติเหล่านี้เป็นเท็จแทน

ในความเป็นจริงฉันสงสัยว่ามีการใช้งานที่ถูกต้องตามกฎหมายสำหรับวิธีนี้อุปกรณ์ประกอบฉากบูลีนจะทำในลักษณะที่คุณควรตั้งค่าให้เป็นเท็จแทนที่จะ "ลบ" พวกเขาเช่นคู่ "แอตทริบิวต์" ใน 1.5


9
โปรดอย่าลืมว่าหากคุณต้องการปิดใช้งานการควบคุมอินพุตแบบฟอร์มทั้งหมด - รวม ช่องทำเครื่องหมายวิทยุ textareas ฯลฯ - คุณจะต้องเลือกไม่เพียง':input' 'input'หลังเลือกองค์ประกอบ <input> จริงเท่านั้น
Cornel Masson

35
@CornelMasson input,textarea,select,buttonดีกว่าการใช้เล็กน้อย:input- :inputเนื่องจากตัวเลือกไม่มีประสิทธิภาพเพราะมันต้องเลือก*จากนั้นวนรอบแต่ละองค์ประกอบและตัวกรองด้วย tagname - ถ้าคุณผ่านตัวเลือก tagname 4 ตัวมันจะเร็วขึ้นมาก นอกจากนี้:inputไม่ใช่ตัวเลือก CSS มาตรฐานดังนั้นประสิทธิภาพที่เพิ่มขึ้นที่เป็นไปได้querySelectorAllจะหายไป
gnarf

3
นี่เป็นการป้องกันไม่ให้ผู้ใช้เข้าถึงหรือลบออกจากคำขอทางเว็บจริง ๆ หรือไม่
OneChillDude

4
การใช้สิ่ง.removeProp("disabled")นี้ทำให้เกิดปัญหา "การลบคุณสมบัติอย่างสมบูรณ์และไม่ได้เพิ่มอีก" ตามที่ระบุโดย @ThomasDavidBaker ในกรณีที่เบราว์เซอร์บางตัวเช่น Chrome ในขณะที่ทำงานได้ดีกับ Firefox บางตัว เราควรระวังที่นี่จริงๆ ใช้.prop("disabled",false)แทน
Sandeepan Nath

6
ทั้ง .prop หรือ .attr นั้นเพียงพอสำหรับการปิดการใช้งานองค์ประกอบ anchor; .prop จะไม่ทำให้ 'การควบคุม' เป็นสีเทา (.attr ทำเช่นนั้น แต่ href ยังคงทำงานอยู่) คุณต้องเพิ่มตัวจัดการเหตุการณ์คลิกที่เรียกว่า PreventDefault ()
Jeff Lowery

61

เพียงเพื่อประโยชน์ของการประชุมใหม่ && ทำให้สามารถปรับไปข้างหน้าได้ (เว้นแต่สิ่งที่เปลี่ยนแปลงไปอย่างมากด้วย ECMA6 (????):

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

และ

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

12
Jikes! ทำไมแทน$(document).on('event_name', '#your_id', function() {...}) $('#your_id').on('event_name', function() {...})ตามที่อธิบายไว้ในเอกสาร jQuery .on ()คณะผู้แทนอดีตการใช้งานและฟังทุก event_nameเหตุการณ์ที่ฟองขึ้นไปและการตรวจสอบพวกเขาสำหรับการจับคู่document #your_idหลังฟังเฉพาะ$('#your_id')เหตุการณ์เท่านั้นและที่ปรับขนาดได้ดีขึ้น
Peter V. Mørch

23
งานเดิมสำหรับองค์ประกอบที่แทรกเข้าไปใน DOM ณ จุดใด ๆ หลังเฉพาะสำหรับสิ่งที่หลงเหลืออยู่ในขณะนั้น
crazymykl

1
@crazymykl ถูกต้อง แต่คุณไม่ควรเพิ่มองค์ประกอบที่มีรหัสที่มีอยู่แล้วในหน้าของคุณ
SepehrM

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

บางครั้งคุณต้องปิดการใช้งาน / เปิดใช้งานองค์ประกอบแบบฟอร์มเช่นอินพุตหรือ textarea Jquery ช่วยให้คุณทำสิ่งนี้ได้อย่างง่ายดายด้วยการตั้งค่าคุณลักษณะที่ปิดใช้งานเป็น "ปิดการใช้งาน" ตัวอย่างเช่น:

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

ในการเปิดใช้งานองค์ประกอบที่ถูกปิดใช้งานคุณจะต้องลบแอตทริบิวต์ "disabled" ออกจากองค์ประกอบนี้หรือปล่อยให้เป็นสตริง ตัวอย่างเช่น:

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

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

อ้างอิง: http://garmoncheg.blogspot.fr/2011/07/how-to-disableenable-element-with.html


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

หรือ

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

2
แน่นอนคำถามที่ถามสำหรับ jQuery และนี่คือการเปลี่ยนสถานะใน JavaScript ธรรมดา แต่มันใช้งานได้
พื้นฐาน 6

1
สิ่งนี้จะเปลี่ยนสถานะใน JavaScript แต่ก็ยังคงใช้ตัวเลือก jQuery เพื่อรับอินพุตแรก
cjsimon

3
แต่ฉันไม่คิดว่าเรากำลังทำสารานุกรมแห่ง jquery ที่นี่ถ้าคำตอบใช้ได้ผลก็ดี
Sajjad Shirazy

8

คุณสามารถใส่รหัสนี้ในที่อื่นทั่วโลก:

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

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

จากนั้นคุณสามารถเขียนสิ่งที่ชอบ:

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

3
ในขณะที่การห่อฟังก์ชั่นมีประโยชน์คุณควรใช้propและไม่ได้ attrมีdisabledคุณสมบัติเพื่อให้ทำงานได้อย่างถูกต้อง (สมมติว่า jQuery 1.6 หรือสูงกว่า)
Gone Coding

1
@TrueBlueAussie ข้อเสียของการใช้attrคืออะไร ผมใช้โค้ดข้างต้นในบางโครงการและเท่าที่ผมจำได้ว่ามันทำงาน ok
Nicu Surdu

1
ข้อยกเว้นที่ชัดเจนคือการควบคุมด้วยคุณสมบัติที่อยู่เบื้องหลัง ที่มีชื่อเสียงที่สุดคือcheckedทรัพย์สินของช่องทำเครื่องหมาย การใช้attrจะไม่ให้ผลลัพธ์เดียวกัน
Gone Coding

7

หากคุณเพียงต้องการกลับสถานะปัจจุบัน (เช่นพฤติกรรมปุ่มสลับ):

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

1
ขอบคุณฉันมีสิ่งเดียวกันสำหรับสลับเป็น; $ ("อินพุต"). prop ('ปิดใช้งาน', ฟังก์ชัน (i, v) {return! v;});
Floww

5

คุณสามารถเปิด / ปิดใช้งานองค์ประกอบใด ๆ ได้หลายวิธี:

วิธีที่ 1

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

วิธีที่ 2

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

หากคุณใช้ jQuery 1.7 ขึ้นไปให้ใช้ prop () แทน attr ()

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

หากคุณต้องการเปิดใช้งานองค์ประกอบใด ๆ คุณเพียงแค่ทำสิ่งที่ตรงกันข้ามกับสิ่งที่คุณทำเพื่อปิดการใช้งาน อย่างไรก็ตาม jQuery มีวิธีอื่นในการลบคุณลักษณะใด ๆ

วิธีที่ 1

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

วิธีที่ 2

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

วิธีที่ 3

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

ถ้าคุณใช้ jQuery 1.7 ขึ้นไปให้ใช้ prop () แทน attr () นั่นคือ. นี่คือวิธีที่คุณเปิดใช้งานหรือปิดใช้งานองค์ประกอบใด ๆ โดยใช้ jQuery


2

อัพเดตสำหรับปี 2561:

ตอนนี้มีความจำเป็นในการ jQuery ไม่มีและจะได้รับในขณะที่ตั้งแต่document.querySelector หรือdocument.querySelectorAll(สำหรับองค์ประกอบหลาย) ทำผลงานได้เกือบจะเหมือนกันตรงตามที่ $ บวกคนที่ชัดเจนมากขึ้นgetElementById,getElementsByClassName ,getElementsByTagName

ปิดใช้งานหนึ่งฟิลด์ของคลาส "อินพุตช่องทำเครื่องหมาย"

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

หรือหลายองค์ประกอบ

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

1
คำถามถามโดยเฉพาะเกี่ยวกับ jQuery ... แต่คำพูดของคุณถูกต้องและควรรู้ว่า jQuery ไม่จำเป็นต้องใช้สำหรับเรื่องนี้เมื่อมีองค์ประกอบหลายอย่างอีกต่อไป
ADyson

2

คุณสามารถใช้วิธี jQuery prop () เพื่อปิดใช้งานหรือเปิดใช้งานองค์ประกอบแบบฟอร์มหรือควบคุมแบบไดนามิกโดยใช้ jQuery วิธี prop () ต้องใช้ jQuery 1.6 ขึ้นไป

ตัวอย่าง:

<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

ปิดการใช้งาน:

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

เปิดใช้งาน:

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

1

ปิดใช้งานจริงสำหรับประเภทอินพุต:

ในกรณีที่มีประเภทอินพุตเฉพาะ ( เช่นอินพุตประเภทข้อความ )

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

สำหรับประเภทอินพุตทุกประเภท

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

1
ขอบคุณสิ่งนี้ช่วยให้ฉันแยกชื่ออินพุต $("input[name=method]").prop('disabled', true);
Harry Bosh


0

ฉันใช้คำตอบ @gnarf และเพิ่มเป็นฟังก์ชัน

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

จากนั้นใช้แบบนี้

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

0

2561 โดยไม่มี JQuery (ES6)

ปิดการใช้งานทั้งหมดinput:

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

ปิดการใช้งานinputด้วยid="my-input"

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

คำถามอยู่กับ JQuery เป็นเพียง FYI




-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
จากคิวการตรวจทาน : ฉันขอให้คุณเพิ่มบริบทเพิ่มเติมให้กับคำตอบของคุณได้ไหม คำตอบแบบรหัสเท่านั้นยากที่จะเข้าใจ มันจะช่วยผู้ถามและผู้อ่านในอนาคตทั้งสองหากคุณสามารถเพิ่มข้อมูลเพิ่มเติมในโพสต์ของคุณ
RBT

-1

ใน jQuery Mobile:

สำหรับปิดการใช้งาน

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

สำหรับการเปิดใช้งาน

$('#someselectElement').selectmenu().selectmenu('enable').selectmenu('refresh', true);
$('#someTextElement').textinput('enable');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.