Gần đây tôi đã chạy vào vấn đề này trong khi phát triển một trò chơi mà một cặp người sử dụng thiết bị sử dụng WebSockets. Thật không may, không có giải pháp nào được đề cập ở trên.
Tóm lại, trò chơi liên quan đến người dùng đăng ký kênh thông qua biểu mẫu trên điện thoại của họ. Sau khi đăng ký, họ sẽ lắc thiết bị và một kịch bản sẽ phát ra trên màn hình của họ. Vấn đề là bất cứ khi nào ai đó lắc thiết bị iOS, cảnh báo "hoàn tác nhập" sẽ bật lên.
Dưới đây là hai giải pháp mà tôi đã tìm thấy cho vấn đề này.
Ngăn đầu vào của bạn khỏi bị mất tiêu điểm. Điều này sẽ yêu cầu bạn ngăn chặn việc gửi biểu mẫu nếu đầu vào là một phần của biểu mẫu. Bạn cũng phải nghe "touchstart" thay vì "click" trên bất kỳ neo nào và ngăn sự kiện touchstart truyền bá. Điều này sẽ ngăn không cho neo đó tập trung và đầu vào của bạn khỏi mất tập trung. Cách tiếp cận này có một số nhược điểm cho chắc chắn.
Thêm trình xử lý sự kiện "keydown" vào cửa sổ và ngăn sự kiện lan truyền. Điều này ngăn không cho bất kỳ giá trị nào được chèn vào đầu vào trên thiết bị iOS. Tôi cũng đã phải tạo một đối tượng ánh xạ mã phím tới ký tự thích hợp. Đây là con đường tôi đã kết thúc vì tất cả những gì tôi cần trong đầu vào của tôi là mã 6 ký tự nên tôi chỉ cần số. Nếu bạn cần nhiều hơn chỉ là con số này có thể là một nỗi đau trong ass. Khi nhấn phím, hãy lấy ký tự đó qua mã khóa và đặt giá trị của đầu vào. Điều này khiến cho iOS nghĩ rằng không có giá trị nào được chèn vào đầu vào thông qua bàn phím nên không có gì để hoàn tác.
Hãy nhớ ngăn ngừa sự kiện keydown truyền bá không ngăn đầu vào trên trình duyệt android cổ phiếu, vì vậy nó sẽ hoạt động bình thường. Nhưng đó là OK vì đây không phải là một vấn đề android. Bạn có thể ngăn không cho các giá trị trùng lặp được chèn vào bằng cách lắng nghe sự kiện đầu vào trên chính đầu vào và xóa trình nghe keydown nếu sự kiện này được nhận.
var codes = {
48: 0,
49: 1,
50: 2,
51: 3,
52: 4,
53: 5,
54: 6,
55: 7,
56: 8,
57: 9
},
myInput = document.getElementById("myInput");
var keydownHelper = function (e) {
e.preventDefault();
myInput.removeEventListener("input", inputHelper);
var val = myInput.value;
// Delete
if (e.keyCode === 8 && val.length) {
myInput.value = val.slice(0, val.length - 1);
return;
}
// If not a number, do nada
if (typeof codes[e.keyCode] === "undefined") { return; }
val += codes[e.keyCode];
myInput.value = val;
};
var inputHelper = function (e) {
e.preventDefault();
window.removeEventListener("keydown", keydownHelper);
};
myInput.addEventListener("input", inputHelper);
window.addEventListener("keydown", keydownHelper);
Cảm ơn bạn đã chia sẻ! Tôi không ở vị trí để thiết lập một trường hợp thử nghiệm ngay bây giờ, nhưng câu trả lời của bạn dường như được nghiên cứu rất tốt và làm những gì tôi đã yêu cầu trong câu hỏi ban đầu, vì vậy tôi chấp nhận nó là đúng nếu không có ai bất kỳ phản đối nào :) –