ช่องทำเครื่องหมาย HTML สามารถตั้งค่าเป็นแบบอ่านอย่างเดียวได้หรือไม่


818

ฉันคิดว่ามันน่าจะเป็นไปได้ แต่เนื่องจากฉันไม่ได้ใส่เงินในที่ที่ปากของฉัน (ดังนั้นพูด) การตั้งค่าคุณลักษณะแบบอ่านอย่างเดียวดูเหมือนจะไม่ทำอะไรเลย

ฉันไม่ต้องการใช้ Disabled เนื่องจากฉันต้องการให้กล่องกาเครื่องหมายถูกส่งมาพร้อมกับส่วนที่เหลือของแบบฟอร์มฉันไม่ต้องการให้ลูกค้าเปลี่ยนรูปแบบได้ภายใต้สถานการณ์บางอย่าง


39
ไคลเอนต์ (ที่เป็นอันตราย) สามารถเปลี่ยนค่าของช่องทำเครื่องหมาย (หรือส่งคำขอโดยพลการ) ตรวจสอบให้แน่ใจเสมอว่าคุณทำการตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์อย่างถูกต้อง!
knittl

4
@knittl แต่ vistor ปกติไม่มีไคลเอนต์ (ที่เป็นอันตราย) และ Vistor ปกติไม่ต้องการเปลี่ยนข้อมูล (นั่นคือเหตุผลของreadonly)
Christian Gollhardt

3
@ knittl คุณดูเหมือนจะละทิ้งความรู้สึกทั้งหมดreadonly! ทำไมคุณลักษณะนี้จะมีอยู่!
Izhar Aazmi

10
@IzharAazmi: readonlyเป็นเพียงแอททริบิวต์ฝั่งไคลเอ็นต์เพื่อช่วยให้เบราว์เซอร์แสดงผลไซต์อย่างถูกต้องและสร้างคำขอที่ถูกต้องจากเบราว์เซอร์ เซิร์ฟเวอร์ไม่สามารถและไม่ควรรู้เกี่ยวกับreadonlyคุณลักษณะของหน้าที่แสดงผล จะต้องสมมติว่าคำขอมาจากที่ใดก็ได้ (และอาจมีเจตนาที่ประสงค์ร้าย); อย่าพึ่งพาอินพุตที่ผู้ใช้จัดหา ยังทำไมส่งค่าของช่องทำเครื่องหมายที่คุณไม่สามารถแก้ไขในการร้องขอ (ถ้าคุณตั้งค่าก่อนที่จะแสดงผลคุณรู้ค่าเมื่อส่งคำขอดังนั้นไม่จำเป็นต้องส่งในคำขอ)
knittl

4
@ knittl ฉันเห็นด้วย! แต่คุณเห็นreadonlyแอตทริบิวต์มีอยู่ด้วยเหตุผลบางอย่าง ไม่มีอะไรเกี่ยวข้องกับการติดตั้งฝั่งเซิร์ฟเวอร์อย่างแน่นอน แต่จะมีการบอกผู้ใช้ "เฮ้ค่านี้จะถูกสันนิษฐานไว้ที่นี่และ / แต่คุณไม่สามารถเปลี่ยนแปลงได้"
Izhar Aazmi

คำตอบ:


538

คุณสามารถใช้สิ่งนี้:

<input type="checkbox" onclick="return false;"/>

ใช้งานได้เนื่องจากการส่งคืน false จากเหตุการณ์คลิกหยุดการดำเนินการต่อเนื่องของห่วงโซ่


29
การส่งกลับค่าเท็จใน javascript จะป้องกันไม่ให้ห่วงโซ่การดำเนินการต่อไปสำหรับตัวคลิกหรือตัวจัดการคีย์ ไม่มีอะไรเกี่ยวข้องกับสถานะของช่องทำเครื่องหมาย
เจสสิก้าบราวน์

9
ป.ล. ... หากคุณต้องการให้ช่องทำเครื่องหมายอยู่ในสถานะที่ถูกต้องคุณต้องเพิ่มchecked="checked"ไม่ยุ่งกับจาวาสคริปต์ จาวาสคริปต์อยู่ตรงนั้นเพื่อบังคับให้คลิกเมาส์เพื่อเพิกเฉยบนวัตถุอินพุตไม่ใช่เพื่อตั้งค่าสถานะของช่องทำเครื่องหมาย
เจสสิก้าบราวน์

8
ไม่มีข้อบ่งชี้ที่มองเห็นได้ของสถานะ r / o ในกรณีนี้
Jesse Glick

11
ป้องกันไม่ให้ใช้ TAB เพื่อนำทางไปยังอินพุตถัดไป
user327961

7
ล้มเหลวอย่างสมบูรณ์หากปิดการใช้งานจาวาสคริปต์!
Doin

419

READONLYไม่ทำงานบนช่องทำเครื่องหมายเพราะจะป้องกันไม่ให้คุณแก้ไขค่าของเขตข้อมูลแต่ด้วยช่องทำเครื่องหมายคุณจะแก้ไขสถานะของเขตข้อมูลจริง(ใน | | ปิด)

จากfaqs.org :

สิ่งสำคัญคือต้องเข้าใจว่าพร้อมกันเพียงป้องกันผู้ใช้จากการเปลี่ยนค่าของฟิลด์ไม่ใช่จากการโต้ตอบกับฟิลด์ ในช่องทำเครื่องหมายตัวอย่างเช่นคุณสามารถตรวจสอบหรือปิดพวกเขา (เช่นการตั้งค่าตรวจสอบสถานะ) แต่คุณไม่ได้เปลี่ยนค่าของสนาม

หากคุณไม่ต้องการใช้disabledแต่ยังต้องการส่งค่าวิธีการส่งค่าเป็นเขตข้อมูลที่ซ่อนอยู่และเพียงพิมพ์เนื้อหาไปยังผู้ใช้เมื่อพวกเขาไม่ตรงตามเกณฑ์การแก้ไข? เช่น

// user allowed change
if($user_allowed_edit)
{
    echo '<input type="checkbox" name="my_check"> Check value';
}
else
{
    // Not allowed change - submit value..
    echo '<input type="hidden" name="my_check" value="1" />';
    // .. and show user the value being submitted
    echo '<input type="checkbox" disabled readonly> Check value';
}

135
ใช้งานได้ แต่มันเป็น .. สกปรกดีอ่านอย่างเดียวบนช่องทำเครื่องหมายควรทำสิ่งที่สัญชาตญาณบอก
levhita

8
สัญชาตญาณหลอกเราดังที่ ConroyP อธิบาย
Aneves

120
สัญชาตญาณไม่หลอกเรามันหลอกคนที่ใช้กล่องกาเครื่องหมายด้วยวิธีนี้
Califf

@ConroyP -> "มันป้องกันไม่ให้คุณแก้ไขค่าของฟิลด์ แต่ด้วยช่องทำเครื่องหมายคุณจะแก้ไขสถานะของฟิลด์ (ใน | | ปิด)" นั่นเป็นเหตุผลที่อ่อนแอจริงๆสำหรับการตัดสินใจของคนจน 'รัฐ' และ 'คุณค่า' นั้นสำหรับพวกเราส่วนใหญ่เช่นเดียวกับ 'toMAYto' และ 'toMAHto' ตามที่คุณเห็นได้จากการโหวตของคนที่ไม่เห็นด้วย
McAuley

343

นี่คือช่องทำเครื่องหมายที่คุณไม่สามารถเปลี่ยนแปลงได้:

<input type="checkbox" disabled="disabled" checked="checked">

เพียงเพิ่มdisabled="disabled"เป็นแอตทริบิวต์


แก้ไขเพื่อแก้ไขความคิดเห็น:

หากคุณต้องการให้ข้อมูลถูกโพสต์กลับกว่าโซลูชันง่ายๆคือใช้ชื่อเดียวกันกับอินพุตที่ซ่อนอยู่:

<input name="myvalue" type="checkbox" disabled="disabled" checked="checked"/>
<input name="myvalue" type="hidden" value="true"/>

วิธีนี้เมื่อตั้งค่าช่องทำเครื่องหมายเป็น 'ปิดใช้งาน' จะทำหน้าที่เพียงเพื่อจุดประสงค์ในการแสดงข้อมูลเท่านั้นแทนที่จะเป็น 'ลิงก์' กับข้อมูล ในการโพสต์กลับค่าของอินพุตที่ซ่อนอยู่จะถูกส่งเมื่อปิดใช้งานช่องทำเครื่องหมาย


331
โปรดทราบว่าช่องทำเครื่องหมาย "ปิดใช้งาน" จะไม่ส่งค่าผ่านข้อมูล POST
biphobe

66
@powtac คุณไม่สามารถระบุว่าเขาต้องการให้ข้อมูลโพสต์ตัวอย่างของคุณไม่ทำเช่นนั้น
David Mårtensson

70
ไม่มีวิธีที่คำตอบนี้ควรมี 105 upvotes มันเทียบกับทุกอย่างที่รัฐเปิด
JM4

15
@nathanhayfield: โดยตรรกะนั้นฉันควรจะสามารถโพสต์คำตอบที่เป็นประโยชน์เกี่ยวกับหัวข้อใด ๆและรับ upvotes :(
Michael Bray

24
@MichaelBray ฉันเดาว่าจะได้รับอัปโหลดมากมายเพราะผู้คนจำนวนมากต้องการทราบวิธีการทำเครื่องหมายในช่องอย่างเดียวเพื่อพวกเขาทำสิ่งนี้: 1) Google "ช่องทำเครื่องหมายอ่านอย่างเดียว" 2) ดูว่าชื่อของคำถามนี้ตรงกับสิ่งที่พวกเขาต้องการทำและคลิก 3) เลื่อนลงจนกว่าพวกเขาจะพบคำตอบนี้ 4) ความสุขและ upvote
Mark Byers

63
<input type="checkbox" onclick="this.checked=!this.checked;">

แต่คุณต้องตรวจสอบความถูกต้องของข้อมูลบนเซิร์ฟเวอร์เพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลง


4
ฉันพบว่านี่เป็นทางออกที่ดีที่สุด; นอกจากนี้ฉันสามารถเรียกรหัสอีกชิ้นหนึ่ง (พูดบางอย่าง jquery-stuff) เพื่อแสดงสัญญาณเล็ก ๆ ที่ดีว่า "คุณไม่สามารถเปลี่ยนแปลงได้จนกว่าคุณจะทำ x แรก" ดังนั้นสิ่งที่ชอบ: "... onclick = 'this.checked =! this.checked; javascript: theCheckboxWasClicked ();' ... "
Bane

นี่ไม่ได้เป็นสีเทาเช่นเดียวกับคำตอบจาก powtac ดังนั้นมันจึงได้คะแนนของฉัน
EHarpham

นี่เป็นแฮ็คเล็ก ๆ น้อย ๆ แต่มันเป็นแฮ็คเล็ก ๆ ที่มีความคิดสร้างสรรค์และสมบูรณ์แบบเกือบจะสง่างาม
รัสเซล

ทางออกที่ดีที่สุด ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง
Scottie

3
ตามที่ระบุไว้ข้างต้นสิ่งนี้ไม่ทำงานเมื่อดับเบิลคลิกใน IE ฉันใช้: onchange = "this.checked = true;"
Ritikesh

57

อีก "วิธีแก้ปัญหาง่าย ๆ ":

<!-- field that holds the data -->
<input type="hidden" name="my_name" value="1" /> 
<!-- visual dummy for the user -->
<input type="checkbox" name="my_name_visual_dummy" value="1" checked="checked" disabled="disabled" />

disabled = "disabled" / disabled = true


1
วิธีนี้จะช่วยแก้ปัญหาทั้งหมด: สร้างช่องทำเครื่องหมายแบบอ่านอย่างเดียวส่งข้อมูล POST และแสดงภาพแบบอ่านอย่างเดียว (ตรงกันข้ามกับโซลูชันจาวาสคริปต์ทั้งหมด)
Dalibor Frivaldsky

2
คุณสามารถย่อหย่อนnameและvalueคุณลักษณะจากกล่องจำลองของคุณได้เช่นกัน="checked"และ="diabled"ค่าติดตั้งอาจถูกส่งไปด้วย w3.org/TR/html-markup/input.checkbox.html
Sampo Sarrala - codidact.org

ที่สำคัญที่สุดโซลูชันนี้เป็น HTML แบบเก่าธรรมดาและไม่ต้องใช้ Javascript
GlennG

45

นี่นำเสนอปัญหาการใช้งานเล็กน้อย

หากคุณต้องการที่จะแสดงช่องทำเครื่องหมาย แต่ไม่ปล่อยให้มันถูกโต้ตอบด้วยทำไมถึงต้องเป็นช่องทำเครื่องหมาย?

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

เช่นบางสิ่งเช่นนี้:

var form = document.getElementById('yourform');
form.onSubmit = function () 
{ 
    var formElems = document.getElementsByTagName('INPUT');
    for (var i = 0; i , formElems.length; i++)
    {  
       if (formElems[i].type == 'checkbox')
       { 
          formElems[i].disabled = false;
       }
    }
}

22
อีกตัวเลือกหนึ่งคือการแสดงช่องทำเครื่องหมายที่ถูกปิดใช้งาน (หรือรูปภาพหรืออะไรก็ได้ที่แสดงถึงการทำเครื่องหมาย / ไม่ถูกตรวจสอบ) และมีอินพุตที่ซ่อนอยู่ซึ่งเป็นสิ่งที่เซิร์ฟเวอร์ดำเนินการ
Juan Mendes

5
ไม่ใช่ปัญหาการใช้งานเมื่อคุณได้รับแบบฟอร์มที่การตัดสินใจของคุณบางอย่างมีผลต่ออินพุตอื่น (aka: การตั้งค่าที่ไม่สามารถสัมผัสได้หากคุณไม่เลิกทำการกระทำแรก) ฉันเกลียดเมื่อมีคนพยายามเปลี่ยนความคิดของผู้คนแทนที่จะตอบ (นี่ไม่ใช่เรื่องของคุณ @FlySwat คุณตอบแล้ว)
Pherrymason

7
จุดประสงค์คือใช้ช่องทำเครื่องหมายเป็นฟิลด์แสดงผล "ค่านี้เป็นจริง" ซึ่งง่ายต่อการสแกนตารางมากกว่ากลุ่ม "true" / "false" -s แน่นอนว่าคุณสามารถใช้ไอคอนได้ แต่ดูเหมือนว่ามีช่องทำเครื่องหมายในรูปแบบเพื่อใช้งาน
Olie

1
โดยทั่วไปฉันใช้วิธีนี้ แต่บางครั้งผู้ใช้โดยเฉพาะอย่างยิ่งในการเชื่อมต่อที่ช้าดูปุ่มอินพุตที่เปิดใช้งานหลังจากการส่งแบบฟอร์มและตัดสินใจที่จะเล่นกับมัน
systempuntoout

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

38
<input type="checkbox" readonly="readonly" name="..." />

ด้วย jquery:

$(':checkbox[readonly]').click(function(){
            return false;
        });

มันอาจจะเป็นความคิดที่ดีที่จะให้คำแนะนำแบบภาพ (css, text, ... ) เพื่อให้ตัวควบคุมไม่ยอมรับอินพุต


สิ่งนี้ใช้ไม่ได้กับ ie6 สำหรับฉันตัวกรองแอตทริบิวต์อ่านอย่างเดียวทำงานไม่ถูกต้อง ฉันเอามันออกมาจากตัวกรองและใส่คุณสมบัติการตรวจสอบในร่างกายของฟังก์ชั่นและมันทำงานได้ดีใน ie6
gt124

3
ฉันใช้ "data-readonly = true" แทนคุณสมบัติมาตรฐานและทำงานได้ดีในเบราว์เซอร์ทั้งหมด ฉันชอบโซลูชันนี้มากกว่าคนอื่น ๆ ที่ +1 ดังกล่าวข้างต้น
peipst9lker

1
ตัวเลือกควร$(':checkbox[readonly]')เลือกช่องทำเครื่องหมายผู้สมัครทั้งหมดเนื่องจากreadonlyค่าของแอตทริบิวต์เป็นตัวเลือก
Izhar Aazmi

21

ฉันใช้สิ่งนี้เพื่อให้ได้ผลลัพธ์:

<input type=checkbox onclick="return false;" onkeydown="return false;" />

ในกรณีของฉันใช้งานได้โดยไม่มีเครื่องหมายอัฒภาคไม่เช่นนั้น
Mwiza

12

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

$(document).ready(function() {
    $(":checkbox").bind("click", false);
});

สิ่งนี้จะทำให้ช่องทำเครื่องหมายอ่านได้อย่างเดียวซึ่งจะเป็นประโยชน์ในการแสดงข้อมูลแบบอ่านอย่างเดียวให้กับลูกค้า


1
คำถามจะถามถึงช่องทำเครื่องหมายแบบอ่านอย่างเดียวไม่ใช่สำหรับช่องทำเครื่องหมาย นี่คือคำตอบที่ถูกต้องที่สุด
NileshChauhan

9
onclick="javascript: return false;"

อืม ... นี่ใช้งานได้กับกรณีที่เป็นเท็จ / ไม่ถูกตรวจสอบ แต่onclick="javascript: return true;"เพียงทำให้มันเป็นช่องทำเครื่องหมายปกติ คำแนะนำ? ขอบคุณ!
Olie

@Olie เพิ่มcheckedแอตทริบิวต์และเก็บไว้falseในสถานที่
Qwertiy

7

คำตอบล่าช้า แต่คำตอบส่วนใหญ่ดูเหมือนจะซับซ้อนเกินไป

ตามที่ฉันเข้าใจแล้ว OP ต้องการ:

  1. ช่องทำเครื่องหมายอ่านอย่างเดียวเพื่อแสดงสถานะ
  2. ค่าส่งคืนพร้อมแบบฟอร์ม

ควรสังเกตว่า:

  1. OP ต้องการให้ไม่ใช้แอdisabledททริบิวเพราะพวกเขา 'ต้องการให้เช็กบ็อกซ์ที่เลือกถูกส่งมาพร้อมกับส่วนที่เหลือของฟอร์ม'
  2. ช่องทำเครื่องหมายที่ไม่ได้ทำเครื่องหมายจะไม่ถูกส่งไปพร้อมกับฟอร์มเนื่องจากอ้างจาก OP ใน 1 ข้างต้นบ่งชี้ว่าพวกเขารู้แล้ว โดยทั่วไปแล้วค่าของช่องทำเครื่องหมายจะมีอยู่หากตรวจสอบแล้วเท่านั้น
  3. ช่องทำเครื่องหมายที่ปิดใช้งานระบุไว้อย่างชัดเจนว่าไม่สามารถเปลี่ยนแปลงได้โดยการออกแบบดังนั้นผู้ใช้จึงไม่น่าจะพยายามเปลี่ยนแปลง
  4. ค่าของช่องทำเครื่องหมายไม่ได้ จำกัด อยู่ที่การระบุสถานะของมันเช่นyesหรือfalseแต่อาจเป็นข้อความใดก็ได้

ดังนั้นเนื่องจากreadonlyคุณสมบัติไม่ทำงานทางออกที่ดีที่สุดที่ไม่ต้องมีจาวาสคริปต์คือ:

  1. ช่องทำเครื่องหมายถูกปิดใช้งานโดยไม่มีชื่อหรือค่า
  2. หากจะทำเครื่องหมายที่ช่องทำเครื่องหมายเป็นช่องทำเครื่องหมายฟิลด์ที่ซ่อนพร้อมชื่อและค่าที่เก็บไว้บนเซิร์ฟเวอร์

ดังนั้นสำหรับช่องทำเครื่องหมายที่เลือก:

<input type="checkbox" checked="checked" disabled="disabled" />
<input type="hidden" name="fieldname" value="fieldvalue" />

สำหรับช่องทำเครื่องหมายที่ไม่ได้ทำเครื่องหมาย:

<input type="checkbox" disabled="disabled" />

ปัญหาหลักของอินพุตที่ปิดใช้งานโดยเฉพาะอย่างยิ่งช่องทำเครื่องหมายคือคอนทราสต์ไม่ดีซึ่งอาจเป็นปัญหาสำหรับบางคนที่มีความบกพร่องทางการมองเห็น มันอาจเป็นการดีกว่าที่จะระบุค่าด้วยคำธรรมดาเช่นStatus: noneหรือStatus: implementedแต่รวมถึงการป้อนข้อมูลที่ซ่อนอยู่ด้านบนเมื่อใช้หลังเช่น:

<p>Status: Implemented<input type="hidden" name="status" value="implemented" /></p>


7

คำตอบปัจจุบันส่วนใหญ่มีปัญหาเหล่านี้อย่างน้อยหนึ่งปัญหา:

  1. ตรวจสอบเฉพาะสำหรับเมาส์ไม่ใช่แป้นพิมพ์
  2. ตรวจสอบเฉพาะเมื่อโหลดหน้าเว็บ
  3. ขอการเปลี่ยนแปลงหรือส่งกิจกรรมที่ไม่เคยมีใครเคยทำมาก่อนหากมีสิ่งอื่นที่เกี่ยวข้อง
  4. ต้องการอินพุตที่ซ่อนอยู่หรือองค์ประกอบ / คุณสมบัติพิเศษอื่น ๆ ที่คุณต้องเลิกทำเพื่อเปิดใช้งานช่องทำเครื่องหมายอีกครั้งโดยใช้ javascript

ต่อไปนี้ง่ายและไม่มีปัญหาเหล่านั้น

$('input[type="checkbox"]').on('click keyup keypress keydown', function (event) {
    if($(this).is('[readonly]')) { return false; }
});

หากช่องทำเครื่องหมายอ่านได้เท่านั้นจะไม่เปลี่ยนแปลง หากไม่เป็นเช่นนั้นก็จะ มันใช้ jquery แต่คุณอาจใช้มันอยู่แล้ว ...

มันได้ผล.



6

หากคุณต้องการให้ส่งไปยังเซิร์ฟเวอร์ด้วยฟอร์ม แต่ไม่สามารถใช้งานได้กับผู้ใช้คุณสามารถใช้pointer-events: noneใน css ( ใช้ได้กับเบราว์เซอร์ที่ทันสมัยทั้งหมดยกเว้น IE10- และ Opera 12- ) และตั้งค่าดัชนีแท็บ  -1เป็นป้องกันการเปลี่ยนผ่านแป้นพิมพ์ นอกจากนี้โปรดทราบว่าคุณไม่สามารถใช้labelแท็กได้เมื่อคลิกที่แท็กจะเป็นการเปลี่ยนสถานะอย่างไรก็ตาม

input[type="checkbox"][readonly] {
  pointer-events: none !important;
}

td {
  min-width: 5em;
  text-align: center;
}

td:last-child {
  text-align: left;
}
<table>
  <tr>
    <th>usual
    <th>readonly
    <th>disabled
  </tr><tr>
    <td><input type=checkbox />
    <td><input type=checkbox readonly tabindex=-1 />
    <td><input type=checkbox disabled />
    <td>works
  </tr><tr>
    <td><input type=checkbox checked />
    <td><input type=checkbox readonly checked tabindex=-1 />
    <td><input type=checkbox disabled checked />
    <td>also works
  </tr><tr>
    <td><label><input type=checkbox checked /></label>
    <td><label><input type=checkbox readonly checked tabindex=-1 /></label>
    <td><label><input type=checkbox disabled checked /></label>
    <td>broken - don't use label tag
  </tr>
</table>


ให้ฉันทำซ้ำประโยคสุดท้ายของคุณ (ฉันพลาดและเสียเวลาอันมีค่า): เทคนิคของคุณไร้ประโยชน์หากมี <label> (ใน Firefox มันทำงานได้อย่างสมบูรณ์แบบจริงๆแล้วปัญหาอยู่ที่ Chrome)
Niccolo M.

@NiccoloM. แต่ถ้าคุณรู้ว่ามันอ่านได้อย่างเดียวทำไมต้องห่อมันไว้ในฉลาก? นอกจากนี้คุณสามารถใส่ป้ายกำกับหลังจากนั้นและใช้forแอตทริบิวต์ input[type="checkbox"][readonly] + label { pointer-events: none !important; }ในกรณีที่คุณสามารถใช้
Qwertiy

@KevinBui คุณลบlabelและเพิ่มแล้วtabindexหรือยัง? คุณจะตั้งโฟกัสไปที่องค์ประกอบที่ไม่สามารถโฟกัสได้เพื่อกดเว้นวรรคบนมันได้อย่างไร?
Qwertiy


5

คำตอบบางส่วนของที่นี่ดูเหมือนเป็นวงเวียนเล็กน้อย แต่นี่คือการแฮ็กขนาดเล็ก

<form id="aform" name="aform" method="POST">
    <input name="chkBox_1" type="checkbox" checked value="1" disabled="disabled" />
    <input id="submitBttn" type="button" value="Submit" onClick='return submitPage();'>
</form>

จากนั้นใน jQuery คุณสามารถเลือกหนึ่งในสองตัวเลือก:

$(document).ready(function(){
    //first option, you don't need the disabled attribute, this will prevent
    //the user from changing the checkbox values
    $("input[name^='chkBox_1']").click(function(e){
        e.preventDefault();
    });

    //second option, keep the disabled attribute, and disable it upon submit
    $("#submitBttn").click(function(){
        $("input[name^='chkBox_1']").attr("disabled",false);
        $("#aform").submit();
    });

});

ตัวอย่าง: http://jsfiddle.net/5WFYt/


3
และนี่ไม่ใช่ "วงเวียน" ??
KoZm0kNoT

nah มันค่อนข้างตรง .. มันไม่กระชับ
sksallaj

4

การสร้างคำตอบข้างต้นหากใช้ jQuery นี่อาจเป็นทางออกที่ดีสำหรับอินพุตทั้งหมด:

<script>
    $(function () {
        $('.readonly input').attr('readonly', 'readonly');
        $('.readonly textarea').attr('readonly', 'readonly');
        $('.readonly input:checkbox').click(function(){return false;});
        $('.readonly input:checkbox').keydown(function () { return false; });
    });
</script>

ฉันใช้สิ่งนี้กับ Asp.Net MVC เพื่อตั้งองค์ประกอบแบบฟอร์มบางอย่างเท่านั้น ด้านบนใช้ได้กับข้อความและกล่องกาเครื่องหมายโดยการตั้งค่าคอนเทนเนอร์หลักใด ๆ เป็น .readonly เช่นสถานการณ์ต่อไปนี้:

<div class="editor-field readonly">
    <input id="Date" name="Date" type="datetime" value="11/29/2012 4:01:06 PM" />
</div>
<fieldset class="flags-editor readonly">
     <input checked="checked" class="flags-editor" id="Flag1" name="Flags" type="checkbox" value="Flag1" />
</fieldset>

4
<input type="radio" name="alwaysOn" onchange="this.checked=true" checked="checked">
<input type="radio" name="alwaysOff" onchange="this.checked=false" >

4

ฉันรู้ว่า "ปิดใช้งาน" ไม่ใช่คำตอบที่ยอมรับได้เนื่องจาก op ต้องการให้โพสต์ อย่างไรก็ตามคุณจะต้องตรวจสอบค่าในฝั่งเซิร์ฟเวอร์เสมอหากคุณมีชุดตัวเลือกแบบอ่านอย่างเดียว นี่เป็นเพราะคุณไม่สามารถหยุดผู้ใช้ที่เป็นอันตรายจากการโพสต์ค่าโดยใช้คุณลักษณะการอ่านอย่างเดียว

ฉันแนะนำให้เก็บค่าดั้งเดิม (ฝั่งเซิร์ฟเวอร์) และตั้งค่าเป็นปิดใช้งาน จากนั้นเมื่อพวกเขาส่งแบบฟอร์มให้ละเว้นค่าใด ๆ ที่โพสต์และรับค่าดั้งเดิมที่คุณเก็บไว้

มันจะมีลักษณะและประพฤติเหมือนเป็นค่าที่อ่านได้อย่างเดียว และมันจัดการ (ละเว้น) โพสต์จากผู้ใช้ที่เป็นอันตราย คุณกำลังฆ่านก 2 ตัวด้วยหินก้อนเดียว


3

ฉันจะแสดงความคิดเห็นต่อคำตอบของ ConroyP แต่ต้องใช้ 50 ชื่อเสียงที่ฉันไม่มี ฉันมีชื่อเสียงพอที่จะโพสต์คำตอบอื่น ขอโทษ

ปัญหาเกี่ยวกับคำตอบของ ConroyP ก็คือช่องทำเครื่องหมายจะไม่สามารถเปลี่ยนได้โดยไม่ได้รวมไว้ในหน้า แม้ว่า Electrons_Ahoy ไม่ได้กำหนดมาก แต่คำตอบที่ดีที่สุดคือคำที่ช่องทำเครื่องหมายที่เปลี่ยนไม่ได้จะมีลักษณะคล้ายกันหากไม่เหมือนกับช่องทำเครื่องหมายที่เปลี่ยนแปลงได้เช่นในกรณีที่ใช้คุณลักษณะ "ปิดใช้งาน" วิธีการแก้ปัญหาซึ่งกล่าวถึงเหตุผลสองประการที่ Electrons_Ahoy ให้ไว้เพราะไม่ต้องการใช้คุณลักษณะ "ปิดใช้งาน" นั้นไม่จำเป็นว่าจะไม่ถูกต้องเพราะใช้คุณลักษณะ "ปิดใช้งาน"

สมมติว่าตัวแปรบูลีนสองตัวคือ $ checked และ $ disabled:

if ($checked && $disabled)
    echo '<input type="hidden" name="my_name" value="1" />';
echo '<input type="checkbox" name="my_name" value="1" ',
    $checked ? 'checked="checked" ' : '',
    $disabled ? 'disabled="disabled" ' : '', '/>';

ช่องทำเครื่องหมายจะปรากฏเป็นตรวจสอบว่าการตรวจสอบ $ เป็นจริง ช่องทำเครื่องหมายจะปรากฏเป็นไม่ถูกตรวจสอบถ้า $ ตรวจสอบเป็นเท็จ ผู้ใช้สามารถเปลี่ยนสถานะของช่องทำเครื่องหมายหาก $ ปิดใช้งานเป็นเท็จ พารามิเตอร์ "my_name" จะไม่ถูกโพสต์เมื่อไม่ได้เลือกช่องทำเครื่องหมายโดยผู้ใช้หรือไม่ พารามิเตอร์ "my_name = 1" ถูกโพสต์เมื่อมีการทำเครื่องหมายในช่องทำเครื่องหมายโดยผู้ใช้หรือไม่ ฉันเชื่อว่านี่คือสิ่งที่ Electrons_Ahoy กำลังมองหา


3

ไม่ได้ช่องทำเครื่องหมายอินพุตไม่สามารถอ่านได้อย่างเดียว

แต่คุณสามารถทำให้พวกเขาอ่านด้วย javascript!

เพิ่มรหัสนี้ทุกที่ทุกเวลาเพื่อให้ช่องทำเครื่องหมายทำงานได้อย่างเดียวตามที่คาดการณ์ไว้โดยป้องกันไม่ให้ผู้ใช้แก้ไขมันในทางใดทางหนึ่ง

jQuery(document).on('click', function(e){
      // check for type, avoid selecting the element for performance
      if(e.target.type == 'checkbox') {
          var el = jQuery(e.target);
          if(el.prop('readonly')) {
              // prevent it from changing state
              e.preventDefault();
          }
      }
});
input[type=checkbox][readonly] {
    cursor: not-allowed;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" checked readonly> I'm readonly!</label>

คุณสามารถเพิ่มสคริปต์นี้ได้ตลอดเวลาหลังจากโหลด jQuery

มันจะทำงานสำหรับองค์ประกอบที่เพิ่มแบบไดนามิก

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

มีไอเอฟเอสจำนวนมากที่จะไม่ส่งผลต่อประสิทธิภาพของหน้าเว็บ


3

เพียงใช้แท็กที่ปิดใช้งานง่ายเช่นนี้ด้านล่าง

<input type="checkbox" name="email"  disabled>

6
"แท็กที่ปิดใช้งาน" จะไม่ส่งข้อมูลนี้
Przemysław Kaczmarczyk


2

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

$(':checkbox').click(function () {
    if (typeof ($(this).attr('readonly')) != "undefined") {
        return false;
    }
});

สิ่งที่ยอดเยี่ยมเกี่ยวกับรหัสนี้คือช่วยให้คุณสามารถเปลี่ยนแอตทริบิวต์ "อ่านได้อย่างเดียว" ทั่วรหัสของคุณโดยไม่ต้องทำซ้ำทุกช่องทำเครื่องหมาย

มันใช้งานได้กับปุ่มตัวเลือกเช่นกัน


1

เหตุผลหลักที่ผู้ใช้ต้องการช่องทำเครื่องหมายแบบอ่านอย่างเดียวและ (รวมถึง) กลุ่มวิทยุแบบอ่านอย่างเดียวคือเพื่อให้ข้อมูลที่ไม่สามารถเปลี่ยนแปลงได้สามารถนำเสนอกลับไปยังผู้ใช้ในรูปแบบที่ป้อน

ตกลงถูกปิดการใช้งานจะทำเช่นนี้ - การควบคุมที่ถูกปิดใช้งานไม่น่าจะเป็นไปไม่ได้ในการนำทางแป้นพิมพ์ นี่คือ Hangup ที่ใหญ่ที่สุดใน HTML ที่ฉันรู้


1

มีส่วนทำให้ช้ามาก ... แต่อย่างไรก็ตาม เมื่อโหลดหน้าเว็บให้ใช้ jquery เพื่อปิดใช้งานช่องทำเครื่องหมายทั้งหมดยกเว้นช่องที่เลือกไว้ในปัจจุบัน จากนั้นตั้งค่ารายการที่เลือกในปัจจุบันเป็นแบบอ่านอย่างเดียวเพื่อให้มีลักษณะคล้ายกับรายการที่ถูกปิดใช้งาน ผู้ใช้ไม่สามารถเปลี่ยนค่าและค่าที่เลือกยังคงส่ง


1

สายไปปาร์ตี้มาก แต่ฉันพบคำตอบสำหรับ MVC (5) ฉันปิดการใช้งานช่องทำเครื่องหมายและเพิ่ม HiddenFor ก่อนช่องทำเครื่องหมายดังนั้นเมื่อมีการโพสต์หากพบว่าเขตข้อมูลที่ซ่อนอยู่ก่อนและใช้ค่านั้น มันใช้งานได้

 <div class="form-group">
     @Html.LabelFor(model => model.Carrier.Exists, new { @class = "control-label col-md-2" })
         <div class="col-md-10">
              @Html.HiddenFor(model => model.Carrier.Exists)
              @Html.CheckBoxFor(model => model.Carrier.Exists, new { @disabled = "disabled" })
              @Html.ValidationMessageFor(model => model.Carrier.Exists)
          </div>
 </div>

1

ฉันจะใช้คุณลักษณะอ่านอย่างเดียว

<input type="checkbox" readonly>

จากนั้นใช้ CSS เพื่อปิดการโต้ตอบ:

input[type='checkbox'][readonly]{
    pointer-events: none;
}

โปรดทราบว่าการใช้คลาส pseudo: อ่านอย่างเดียวไม่สามารถใช้งานได้ที่นี่

input[type='checkbox']:read-only{ /*not working*/
    pointer-events: none;
}

0

ฉันไม่ต้องการให้ลูกค้าสามารถเปลี่ยนแปลงได้ภายใต้สถานการณ์ที่แน่นอน

ด้วยตนเองเองจะไม่ทำงาน คุณอาจจะสามารถทำสิ่งที่ขี้ขลาดกับ CSS แต่เรามักจะทำให้พวกเขาปิดการใช้งาน

คำเตือน: หากพวกเขาโพสต์กลับมาแล้วลูกค้าสามารถเปลี่ยนระยะเวลา คุณไม่สามารถพึ่งพาแบบอ่านอย่างเดียวเพื่อป้องกันผู้ใช้จากการเปลี่ยนแปลงบางอย่าง สามารถใช้พู้ทำเล่นหรือใช้ html w / firebug หรือสิ่งอื่น ๆ


คุณถูกต้องทั้งหมดนั่นคือเหตุผลที่ฉันตรวจสอบด้านเซิร์ฟเวอร์ด้วยว่าการตั้งค่านี้เป็นเพียงการปรับปรุงประสบการณ์ของผู้ใช้ในฝั่งไคลเอ็นต์
levhita

0

วิธีการแก้ปัญหาของฉันเป็นสิ่งที่ตรงกันข้ามกับโซลูชันของ FlySwat แต่ฉันไม่แน่ใจว่าจะใช้งานได้กับสถานการณ์ของคุณหรือไม่ ฉันมีกลุ่มช่องทำเครื่องหมายและแต่ละกล่องมีตัวจัดการ onClick ที่ส่งแบบฟอร์ม (ใช้สำหรับเปลี่ยนการตั้งค่าตัวกรองสำหรับตาราง) ฉันไม่ต้องการอนุญาตให้มีการคลิกหลายครั้งเนื่องจากการคลิกที่ตามมาหลังจากการคลิกครั้งแรกจะถูกละเว้น ดังนั้นฉันจึงปิดการใช้งานช่องทำเครื่องหมายทั้งหมดหลังจากคลิกครั้งแรกและหลังจากส่งแบบฟอร์ม:

onclick="document.forms['form1'].submit(); $('#filters input').each(function() {this.disabled = true});"

ช่องทำเครื่องหมายอยู่ในองค์ประกอบขยายที่มี ID ของ "ตัวกรอง" - ส่วนที่สองของรหัสคือคำสั่ง jQuery ที่วนซ้ำผ่านช่องทำเครื่องหมายและปิดใช้งานแต่ละรายการ ด้วยวิธีนี้ค่าช่องทำเครื่องหมายจะยังคงส่งผ่านทางแบบฟอร์ม (เนื่องจากมีการส่งแบบฟอร์มก่อนที่จะปิดการใช้งาน) และจะป้องกันผู้ใช้จากการเปลี่ยนแปลงพวกเขาจนกว่าจะโหลดหน้าใหม่

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