Điều này có thể không trả lời trực tiếp câu hỏi của bạn, nhưng vấn đề này có thể được giải quyết bằng các điều chỉnh mức thiết kế đơn giản. Tôi hiểu điều này có thể không áp dụng 100% cho tất cả các trường hợp sử dụng, nhưng tôi khuyên bạn nên cân nhắc lại việc suy nghĩ lại luồng người dùng của ứng dụng của bạn và nếu có thể thực hiện đề xuất thiết kế sau.
Tôi quyết định làm điều gì đó đơn giản hơn so với hack lựa chọn thay thế cho onChange()
sử dụng các sự kiện khác mà không thực sự có nghĩa là cho mục đích này ( blur
, click
, vv)
Cách tôi giải quyết nó:
Đơn giản chỉ cần đặt trước một thẻ tùy chọn giữ chỗ, chẳng hạn như chọn không có giá trị với nó.
Vì vậy, thay vì chỉ sử dụng cấu trúc sau, yêu cầu thay thế hack-y:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Cân nhắc sử dụng cái này:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Vì vậy, theo cách này, mã của bạn đơn giản hơn rất nhiều và onChange
sẽ hoạt động như mong đợi, mỗi khi người dùng quyết định chọn thứ gì đó không phải là giá trị mặc định. Bạn thậm chí có thể thêm disabled
thuộc tính vào tùy chọn đầu tiên nếu bạn không muốn họ chọn lại và buộc họ chọn thứ gì đó từ các tùy chọn, do đó sẽ gây ra onChange()
hỏa hoạn.
Tại thời điểm trả lời này, tôi đang viết một ứng dụng Vue phức tạp và tôi thấy rằng lựa chọn thiết kế này đã đơn giản hóa mã của tôi rất nhiều. Tôi đã dành hàng giờ cho vấn đề này trước khi tôi giải quyết vấn đề này và tôi đã không phải viết lại rất nhiều mã của mình. Tuy nhiên, nếu tôi đã sử dụng các giải pháp thay thế hacky, tôi sẽ cần phải tính đến các trường hợp cạnh, để ngăn việc bắn hai lần yêu cầu ajax, v.v. Điều này cũng không làm rối tung hành vi mặc định của trình duyệt như một phần thưởng tuyệt vời (đã thử nghiệm trên thiết bị di động trình duyệt cũng vậy).
Đôi khi, bạn chỉ cần lùi lại một bước và suy nghĩ về bức tranh lớn để có giải pháp đơn giản nhất.