Các mã sau là xấu xí, nhưng nó thực hiện chính xác những gì bạn muốn (tôi nghĩ). Về cơ bản, tôi chặn tất cả các sự kiện onChange và chỉ xử lý chúng nếu có sự kiện onClick tương ứng dẫn đến giá trị thay đổi. Cũng lưu ý rằng các sự kiện thay đổi được xử lý trước khi các sự kiện nhấp chuột. EDIT: Chỉ cần relaized này không hoạt động trong chrome, vì vậy tôi đã thêm một số mã phát hiện trình duyệt để nó chỉ thực hiện trong firefox. LƯU Ý: Mã hiện tại sẽ không hoạt động nếu người dùng đã được gắn thẻ vào hộp chọn và thực hiện thay đổi bằng các phím lỗi, nhưng phương pháp bên dưới có thể dễ dàng điều chỉnh để xử lý trường hợp đó. Bạn chỉ cần xử lý các sự kiện quan trọng như mũi tên lên hoặc mũi tên xuống hoặc TAB hoặc ENTER theo cách tương tự khi các nhấp chuột được xử lý bên dưới, nhưng chỉ khi hộp chọn có tiêu điểm.
CHÚ Ý 2: Chơi với điều này nhiều hơn, hành vi rất lạ. Nếu bạn thoát ra khỏi lựa chọn, sự kiện onChange không được kích hoạt, nhưng nó được lưu lên. Nếu bất kỳ lúc nào bạn nhấp vào ở bất kỳ đâu trên màn hình, sự kiện onChange sẽ được kích hoạt cho giá trị bạn đang di chuột qua khi bạn thoát, ngay cả khi giá trị đó thực sự thay đổi ngay khi bạn thoát. Vì vậy, điều này là nhận được khôn lanh. Tôi nghĩ bạn có thể phải xử lý riêng 2 trường hợp. Một trường hợp để xử lý nhấp vào aways, và một để xử lý thoát ra ngoài (mà patrick trả lời).
Nó đang bị lông và tôi thấy không có cách nào thanh lịch để viết mã này. Cách ghi chú cho người dùng bên cạnh hộp văn bản có nội dung "Tùy chọn hiện đang được chọn của bạn, 1, không còn khả dụng". Sau đó, bạn có thể có một hộp chọn chỉ với các tùy chọn có sẵn.
<select name="select" size="1" onChange="handleChange()" onClick="handleClick()" >
<option>0</option>
<option selected disabled>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
<br />
<script>
var initialValue = document.getElementsByName('select')[0].selectedIndex;
var potentialChange;
var processClick;
function handleClick() {
//ignore this code if not firefox
if (navigator.userAgent.indexOf("Firefox") === -1)
return;
var curVal = document.getElementsByName('select')[0].selectedIndex;
if (!processClick)
return;
// a value change click occured, now we actually process it.
document.getElementsByName('select')[0].value = potentialChange;
}
function handleChange() {
// save the potential change, which will be used if a real click was detected
potentialChange = document.getElementsByName('select')[0].selectedIndex;
processClick = (potentialChange !== initialValue);
// undo the attempted change, in case of an escape or page click
// but only on firefox
if (navigator.userAgent.indexOf("Firefox")!=-1)
document.getElementsByName('select')[0].value = initialValue;
document.getElementsByName('select')[0].value = initialValue;
}
</script>
<a href="javaScript:alert(document.getElementsByName('select')[0].selectedIndex);">getSelected</a>
Mục đích của việc này là gì? Đối với tôi ít nhất là vô hiệu hóa và chọn âm thanh như họ nên được loại trừ lẫn nhau và mặc dù tôi không thể tìm thấy bất cứ nơi nào trong spec đó một cách rõ ràng nói rằng tôi không chắc chắn tại sao có một cái gì đó được lựa chọn và vô hiệu hóa có ý nghĩa. Bạn đang cố gắng làm gì với điều này? – Chris
Người dùng chọn thứ gì đó từ hộp. Quản trị viên có thể bật hoặc bỏ các mục khỏi hộp. Khi người dùng đã chọn và lưu một số giá trị, aftwerwards Quản trị sẽ vô hiệu hóa mục này, sau đó người dùng sẽ thấy cài đặt của anh ấy là mục đã chọn bị vô hiệu hóa. Người dùng mở hộp, nhưng không tìm thấy bất kỳ tùy chọn nào khác mà anh thích, vì vậy nhấn ESC. Nhưng SAVE tiếp theo sẽ thay đổi giá trị đã chọn. – oliholz
Ah. Tôi biết bạn đến từ đâu. Đối với mắt bên ngoài của tôi, có vẻ như giải pháp không cho phép người dùng tiếp tục có giá trị đã bị quản trị viên tắt một cách rõ ràng và cung cấp cho họ lựa chọn "không áp dụng" hoặc chỉ buộc họ chọn một giá trị mới. Tôi đã có một chút của một vở kịch mặc dù và không có xa hơn Alexander dưới đây. Firefox rõ ràng đang kích hoạt sự kiện thay đổi của nó khi bạn mất tập trung ngụ ý rằng trình duyệt cho rằng nó đã bị thay đổi. Có lẽ nếu giữ tùy chọn đó là trong thực tế hợp lệ thì bạn không muốn "vô hiệu hóa" nếu nó cũng "được chọn". Điều này dường như giải quyết vấn đề của bạn – Chris