วิธีหลีกเลี่ยงการส่งฟิลด์อินพุตที่ถูกซ่อนโดยจอแสดงผล: ไม่มีไปยังเซิร์ฟเวอร์?


89

ลองนึกภาพว่าคุณมีรูปแบบที่คุณสลับการเปิดเผยข้อมูลหลายช่อง และถ้าฟิลด์ไม่ปรากฏขึ้นคุณก็ไม่ต้องการให้มีการร้องขอ

คุณรับมือกับสถานการณ์นี้อย่างไร?

คำตอบ:


129

การตั้งค่าองค์ประกอบฟอร์มเป็นปิดใช้งานจะหยุดการทำงานไปยังเซิร์ฟเวอร์เช่น:

<input disabled="disabled" type="text" name="test"/>

ในจาวาสคริปต์จะมีความหมายดังนี้:

var inputs = document.getElementsByTagName('input');
for(var i = 0;i < inputs.length; i++) {
    if(inputs[i].style.display == 'none') {
        inputs[i].disabled = true;
    }
}
document.forms[0].submit();

ใน jQuery:

   $('form > input:hidden').attr("disabled",true);
   $('form').submit();

16
ด้วยของ jQuery เลือกหลอก:inputแทนinputนอกจากนี้คุณยังสามารถปิดการใช้งานทั้งหมดselectและtextareaองค์ประกอบ
แดเนียล Rikowski

8
ใน jQuery> = 1.6 attr("disabled", true)คุณควรใช้prop("disabled", true) api.jquery.com/prop
ยอ

2
@ dominicbri7 - สำหรับ jQuery 1.6 แนะนำให้ใช้.prop()แทน.attr()เพื่อรับ AND การตั้งค่าทั้งคุณสมบัติที่ปิดใช้งานและตรวจสอบ .attr()ในบางกรณีการตรวจสอบและหรือการตั้งค่าโดยใช้จะส่งคืนผลลัพธ์ที่ไม่ต้องการ โปรดอ่านเอกสาร jQuery ก่อนแสดงความคิดเห็นว่า yorch อ้างถึงอะไร
zgr024

@ zgr024 ดีลบความคิดเห็นของฉัน
dominicbri7

2
@DanielRikowski มีอะไรกับ jQuery ที่นี่ jQuery มีเรื่องไร้สาระ มาคุยกัน Vanilla JS
Pacerier

13

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

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


7

หากคุณต้องการปิดใช้องค์ประกอบทั้งหมดหรือบางองค์ประกอบภายในองค์ประกอบหลักที่ซ่อนอยู่คุณสามารถใช้

$("div").filter(":hidden").children("input[type='text']").attr("disabled", "disabled");

ตัวอย่างนี้http://jsfiddle.net/gKsTS/ปิดใช้งานกล่องข้อความทั้งหมดภายใน div ที่ซ่อนอยู่


นี่เป็นวิธีแก้ปัญหาที่ดีมากเช่นเดียวกับการวนซ้ำผ่าน div ที่ซ่อนอยู่และปิดใช้งานทั้งหมด มันควรจะได้รับ +1 มากขึ้น
yeppe

6

สิ่งที่เกี่ยวกับ:

$('#divID').children(":input").prop("disabled", true); // disable

และ

$('#divID').children(":input").prop("disabled", false); // enable

เพื่อสลับอินพุตลูกทั้งหมด (เลือกช่องทำเครื่องหมายอินพุตพื้นที่ข้อความ ฯลฯ ) ภายใน div ที่ซ่อนอยู่


นี่เป็นทางออกที่ยอดเยี่ยมหากคุณต้องการรับปัจจัยการผลิตทั้งหมด ทำงานดี
doz87

3

วิธีแก้ปัญหาที่ง่ายมาก (แต่ไม่ใช่วิธีที่สะดวกที่สุดเสมอไป) คือการลบแอตทริบิวต์ "name" - มาตรฐานกำหนดให้เบราว์เซอร์ไม่ส่งค่าที่ไม่มีชื่อและเบราว์เซอร์ทั้งหมดที่ฉันรู้จักปฏิบัติตามกฎนี้


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

1

ฉันจะลบค่าออกจากอินพุตหรือถอดอ็อบเจ็กต์อินพุตออกจาก DOM ดังนั้นจึงไม่มีการโพสต์ตั้งแต่แรก

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