สิ่งนี้อาจไม่ตอบคำถามของคุณโดยตรง แต่ปัญหานี้สามารถแก้ไขได้โดยการปรับระดับการออกแบบที่เรียบง่าย ฉันเข้าใจว่าอาจไม่สามารถใช้กับกรณีการใช้งานได้ทั้งหมด 100% แต่ฉันขอแนะนำให้คุณลองนึกถึงการไหลของผู้ใช้แอปพลิเคชันของคุณอีกครั้ง
ฉันตัดสินใจที่จะทำสิ่งที่ง่ายกว่าการแฮ็กทางเลือกสำหรับการonChange()
ใช้กิจกรรมอื่น ๆ ที่ไม่ได้มีไว้สำหรับวัตถุประสงค์นี้ ( blur
,click
ฯลฯ )
วิธีที่ฉันแก้ไขมัน:
เพียงก่อนแท็กตัวเลือกตัวแทนจองล่วงหน้าเช่นเลือกที่ไม่มีค่า
ดังนั้นแทนที่จะใช้โครงสร้างต่อไปนี้ซึ่งต้องการทางเลือก hack-y:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
พิจารณาใช้สิ่งนี้:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
ดังนั้นวิธีนี้รหัสของคุณจะง่ายขึ้นมากและonChange
จะทำงานตามที่คาดไว้ทุกครั้งที่ผู้ใช้ตัดสินใจที่จะเลือกอย่างอื่นที่ไม่ใช่ค่าเริ่มต้น คุณสามารถเพิ่มแอdisabled
ททริบิวต์ลงในตัวเลือกแรกได้หากคุณไม่ต้องการให้พวกมันเลือกอีกครั้งและบังคับให้พวกเขาเลือกบางอย่างจากตัวเลือกซึ่งจะทำให้เกิดonChange()
ไฟไหม้
ในช่วงเวลาของคำตอบนี้ฉันกำลังเขียนแอปพลิเคชัน Vue ที่ซับซ้อนและฉันพบว่าตัวเลือกการออกแบบนี้ทำให้รหัสของฉันง่ายขึ้นมาก ฉันใช้เวลาหลายชั่วโมงในการแก้ไขปัญหานี้ก่อนที่จะตัดสินใจด้วยโซลูชันนี้และฉันไม่จำเป็นต้องเขียนโค้ดอีกมาก อย่างไรก็ตามถ้าฉันไปกับทางเลือกที่แฮ็กฉันจะต้องพิจารณากรณีขอบเพื่อป้องกันการยิงสองครั้งของการร้องขอ ajax ฯลฯ นี่ยังไม่ยุ่งพฤติกรรมเบราว์เซอร์เริ่มต้นเป็นโบนัสที่ดี (ทดสอบบนมือถือ เบราว์เซอร์เช่นกัน)
บางครั้งคุณเพียงแค่ต้องย้อนกลับไปและคิดเกี่ยวกับภาพรวมเพื่อหาทางออกที่ง่ายที่สุด