我最近在开发用户使用 WebSocket 配对设备的游戏时遇到了这个问题。不幸的是,上述解决方案都不起作用。
简而言之,游戏涉及用户通过手机上的表单订阅频道。订阅后,他们会摇晃设备,然后在他们的桌面上播放一个场景。问题是,只要有人摇晃 iOS 设备,就会弹出“撤消键入”警报。
这是我为这个问题找到的仅有的两个解决方案。
防止您的输入永远失去焦点。如果输入是表单的一部分,这将要求您阻止表单提交。您还必须在任何锚点上侦听“touchstart”而不是“click”,并防止 touchstart 事件传播。这将防止该锚获得焦点,并且您的输入不会失去焦点。这种方法肯定有一些缺点。
向窗口添加“keydown”事件处理程序并防止事件传播。这可以防止任何值被插入到 iOS 设备上的输入中。我还必须创建一个将键码映射到正确字符的对象。这是我结束的路线,因为我在输入中只需要一个 6 个字符的代码,所以我只需要数字。如果您需要的不仅仅是数字,这可能会让人头疼。在按下键时,通过键码捕获该字符并设置输入的值。这使 iOS 误以为从未通过键盘向输入中插入任何值,因此没有任何内容可以撤消。
请记住,阻止 keydown 事件传播并不会阻止在现有的 android 浏览器上输入,因此它会正常运行。但这没关系,因为这不是安卓问题。您可以通过侦听输入本身的输入事件并在收到此事件时移除 keydown 侦听器来防止插入重复值。
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);