ค่าของอินพุตที่ปิดใช้งานจะไม่ถูกส่ง


224

นี่คือสิ่งที่ฉันพบโดย Firebug ใน Firefox

มันเหมือนกันในเบราว์เซอร์อื่นหรือไม่?

ถ้าเป็นเช่นนั้นอะไรคือสาเหตุของสิ่งนี้


23
คุณสามารถตั้งค่าแอตทริบิวต์ 'อ่านได้อย่างเดียว' ตัวอย่างเช่น Chrome แสดงผลเป็นฟิลด์ที่ถูกปิดใช้งาน แต่ส่งไป
peterrus

คำตอบ:


189

ใช่เบราว์เซอร์ทั้งหมดไม่ควรส่งอินพุตที่ปิดใช้งานเนื่องจากเป็นแบบอ่านอย่างเดียว

ข้อมูลเพิ่มเติม (ส่วน 17.12.1)

นิยามคุณสมบัติ

ปิดใช้งาน [CI] เมื่อตั้งค่าสำหรับการควบคุมฟอร์มแอตทริบิวต์ Boolean นี้จะปิดใช้งานการควบคุมสำหรับการป้อนข้อมูลผู้ใช้ เมื่อตั้งค่าแล้วแอททริบิวต์ที่ปิดใช้งานจะมีผลต่อองค์ประกอบดังนี้:

  • ตัวควบคุมที่ปิดใช้งานไม่ได้รับการโฟกัส
  • ตัวควบคุมที่ปิดใช้งานถูกข้ามในการนำทางแบบแท็บ
  • การควบคุมที่ปิดใช้งานไม่สามารถทำได้สำเร็จ

องค์ประกอบต่อไปนี้สนับสนุนคุณลักษณะที่ปิดใช้งาน: BUTTON, INPUT, OPTGROUP, OPTION, SELECT และ TEXTAREA

คุณลักษณะนี้ได้รับการสืบทอด แต่การประกาศในท้องถิ่นจะแทนที่ค่าที่สืบทอด

วิธีการแสดงองค์ประกอบที่ถูกปิดใช้งานขึ้นอยู่กับตัวแทนผู้ใช้ ตัวอย่างเช่นตัวแทนผู้ใช้บางรายการ "เป็นสีเทา" ปิดใช้งานรายการเมนูป้ายชื่อปุ่ม ฯลฯ

ในตัวอย่างนี้องค์ประกอบ INPUT ถูกปิดใช้งาน ดังนั้นจึงไม่สามารถรับอินพุตของผู้ใช้ได้และจะไม่ส่งค่าของมันพร้อมกับแบบฟอร์ม

<INPUT disabled name="fred" value="stone">

บันทึก. วิธีเดียวในการแก้ไขค่าของแอททริบิวต์ที่ปิดใช้งานคือการใช้สคริปต์


86
วิธีแก้ปัญหา: เพิ่ม<input type="hidden">องค์ประกอบที่มีชื่อ / ค่าเดียวกับอินพุตที่ปิดใช้งาน
John Kugelman

ข้อมูลใดที่เบราว์เซอร์ทำอะไรและไม่เชื่อฟัง?
Allisone

82
ใช้ readonly = "readonly" แทน :) ดูstackoverflow.com/questions/7357256/…
Adrien Be

1
@Allisone: Firefox และ Chrome ดูเหมือนว่าจะเชื่อฟังสิ่งนี้ (ไม่ได้ส่งอินพุตที่ปิดใช้งาน) ไม่ได้ลองกับเบราว์เซอร์อื่น
Adrien

1
@JohnKugelman ทำไมชื่อเดียวกัน คนพิการจะไม่ถูกส่งต่อไป .. อาจให้ชื่อจริงแก่คนที่ซ่อนอยู่และใช้ชื่ออื่นสำหรับคนพิการ
Arth

286

disabled อินพุตจะไม่ส่งข้อมูล

ใช้readonlyคุณลักษณะ:

<input type="text" readonly />

แหล่งที่มาที่นี่


@FrankFang โอเค แต่เมื่อฉันส่งข้อมูลไปยังเทมเพลตของกลุ่ม Laravel มันจะไม่ทำงาน ไม่สามารถส่งข้อมูลแบบนั้นได้
ssi-anik

@ ssi-anik ใช้readonlyงานได้เพียงตรวจสอบให้แน่ใจว่าคุณผ่าน "ชื่อ" attr ไปยังอินพุต
BenNov

26

คุณสามารถใช้สามสิ่งในการเลียนแบบการปิดการใช้งาน:

  1. HTML: readonlyคุณลักษณะ (เพื่อให้ค่าปัจจุบันในอินพุตสามารถนำมาใช้ในการส่งแบบฟอร์มนอกจากนี้ผู้ใช้ไม่สามารถเปลี่ยนค่าอินพุต)

  2. CSS: 'pointer-events':'none'(บล็อกผู้ใช้จากการคลิกอินพุต)

  3. HTML: tabindex="-1"(บล็อกผู้ใช้เพื่อนำทางไปยังอินพุตจากแป้นพิมพ์)


22

พวกเขาไม่ได้ส่งเพราะนั่นคือสิ่งที่มันพูดว่าในข้อกำหนดของ W3C

17.13.2 การควบคุมที่ประสบความสำเร็จ

การควบคุมที่ประสบความสำเร็จคือ "ถูกต้อง" สำหรับการส่ง [snip]

  • การควบคุมที่ถูกปิดใช้งานไม่สามารถทำได้สำเร็จ

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


2

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


1

มีสองคุณสมบัติคือreadonlyและdisabledที่สามารถทำให้การป้อนข้อมูลแบบอ่านอย่างเดียว แต่มีความแตกต่างเล็กน้อยระหว่างพวกเขา

<input type="text" readonly />
<input type="text" disabled />
  • readonlyแอตทริบิวต์ทำให้ป้อนข้อความของคุณคนพิการและผู้ใช้จะไม่สามารถที่จะเปลี่ยนมันอีกต่อไป
  • ไม่เพียง แต่จะdisabledแอตทริบิวต์ทำให้การป้อนข้อความของคุณปิดการใช้งาน (ไม่เปลี่ยนแปลง) แต่ยังไม่สามารถที่จะส่ง

วิธีการ jQuery (1):

$("#inputID").prop("readonly", true);
$("#inputID").prop("disabled", true);

วิธีการ jQuery (2):

$("#inputID").attr("readonly","readonly");
$("#inputID").attr("disabled", "disabled");

วิธี JavaScript:

document.getElementById("inputID").readOnly = true;
document.getElementById("inputID").disabled = true;

PS disabledและreadonlyเป็นแอตทริบิวต์ html มาตรฐาน นำมาใช้กับpropjQuery 1.6


0

การควบคุมการเลือกยังคงสามารถคลิกได้แม้จะอยู่บน Attrib แบบอ่านอย่างเดียว

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

จากนั้นสร้าง jquery เมื่อเลือกการเปลี่ยนแปลง

$('#your_select_id').change(function () {
    $('#your_hidden_selectid').val($('#your_select_id').val());
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.