Điều này đang thúc đẩy tôi hạt. Một trong những khó khăn của nó để giải thích nhưng tôi sẽ có một đi.Tôi gặp sự cố với sự kiện keydown và tự động hoàn tất trong Firefox trên mac
Tôi có một trường nhập văn bản trên trang đầu của trang web của tôi. Tôi đã mã hóa một người quan sát sự kiện keydown mà kiểm tra keyCode và nếu nó ENTER (hoặc equiv), nó sẽ kiểm tra giá trị đầu vào (email). Nếu email hợp lệ và duy nhất trong DB, nó sẽ gửi biểu mẫu. Công cụ cơ bản, hoặc vì vậy bạn sẽ nghĩ.
Nếu tôi nhập địa chỉ email của mình vào trường và nhấn enter, nó hoạt động tốt trong tất cả các trình duyệt. Tuy nhiên, nếu tôi gõ vài chữ cái đầu tiên, và sau đó sử dụng các phím mũi tên để chọn email từ hộp thả xuống lịch sử (hy vọng bạn biết ý tôi ở đây), và sau đó nhấn enter kết quả là khác nhau. Giá trị của trường biểu mẫu đang được ghi lại chỉ bằng vài chữ cái tôi đã nhập và do đó xác thực không thành công. Có vẻ như khi tôi nhấn phím enter để "chọn" email từ trình đơn thả xuống lịch sử, trình duyệt sẽ làm gián đoạn điều đó như thể tôi đang gõ.
Trong Chrome và Safari, nó hoạt động như mong muốn. Vì nó có nghĩa là khi bạn nhấn enter để "chọn" email từ danh sách thả xuống lịch sử, tất cả những gì nó làm là đặt địa chỉ email đó vào hộp văn bản. Chỉ khi nhấn phím ENTER lần thứ hai, nó sẽ kích hoạt trình quan sát sự kiện và email được xác thực.
Hy vọng ai đó có thể làm sáng tỏ lý do tại sao điều này xảy ra ... Cảm giác ruột của tôi là một điều trình duyệt và sẽ là thứ tôi không thể sửa được.
Cảm ơn Lee
EDIT: Để thêm làm rõ câu hỏi của tôi cho tôi thêm rằng Im bằng cách sử dụng "KeyDown" sự kiện để ghi lại khoảnh khắc khi vào phím được nhấn. Tôi đã thử sự kiện "keyup" và điều này giải quyết vấn đề của tôi ở trên, nhưng sau đó tôi không thể dường như ngừng các hình thức trình của chính nó. Sự kiện "keyup" kích hoạt SAU hành vi mặc định, do đó, nó không phải là lựa chọn đúng cho việc này.
EDIT THÊM:
Cảm ơn bạn một lần nữa, và btw, tiếng Anh của bạn là tuyệt vời (để đáp ứng với nhận xét của bạn về tiếng Anh xấu).
Tôi đã thay đổi xử lý sự kiện của tôi từ này:
$("emailInputBox").observe("keydown", function(event) {
return submitViaEnter(event, submitSignupFormOne);
});
này:
$("emailInputBox").observe("keydown", function(event) {
setTimeout(submitViaEnter.curry(event, submitSignupFormOne),0);
});
submitViaEnter
:
function submitViaEnter(event, callback) {
var code = event.keyCode;
if (code == Event.KEY_RETURN) {
event.stop();
return callback(event);
}
return true;
}
Dường như làm việc nhưng vấn đề bây giờ là trình duyệt được phép thực hiện hành động mặc định trước khi chạy submitViaEnter
chức năng có nghĩa là biểu mẫu đang được gửi khi tôi nhấn ENTER.
Cảm ơn !! Ive đã làm việc xung quanh nó bằng cách vô hiệu hóa chức năng tự động hoàn thành cho biểu mẫu nhưng tôi không thích nó. Bạn có biết "thời gian chờ" là gì không, và nếu có, bạn có thể xây dựng được không? Cảm ơn bạn lần nữa. –
@LeeRM: trong trình xử lý gọi hàm setTimeout (handler2, 0) và di chuyển mã xác nhận của bạn vào | Hàm handler2() {} |. – Nickolay
Tôi hiểu rồi. Im xin lỗi nếu Im đang dày ở đây. Chỉ khi tôi nghĩ rằng Im đang làm tốt công cụ này ... Kết quả của việc này là gì? Tôi biết nó khắc phục được vấn đề mà tôi có nhưng làm thế nào? Tôi thích hiểu những gì đang xảy ra. Cảm ơn sự giúp đỡ của bạn! –