最近、ユーザーがWebSocketを使用してデバイスをペアリングするゲームを開発しているときに、この問題に遭遇しました。残念ながら、上記の解決策はどれも機能しません。
つまり、このゲームでは、ユーザーが携帯電話のフォームを介してチャンネルに登録する必要がありました。サブスクライブすると、デバイスを振ると、デスクトップでシナリオが実行されます。問題は、誰かがiOSデバイスを振ると、「入力解除」アラートがポップアップすることでした。
これが私がこの問題のために見つけた唯一の2つの解決策です。
入力がフォーカスを失うのを防ぎます。これにより、入力がフォームの一部である場合、フォームの送信を防ぐ必要があります。また、アンカーを「クリック」する代わりに「タッチスタート」をリッスンし、タッチスタートイベントが伝播しないようにする必要があります。これにより、アンカーがフォーカスを獲得し、入力がフォーカスを失うのを防ぎます。このアプローチには確かにいくつかの欠点があります。
「キーダウン」イベントハンドラーをウィンドウに追加し、イベントが伝播しないようにします。これにより、iOSデバイスの入力に値が挿入されるのを防ぎます。また、キーコードを適切な文字にマップするオブジェクトを作成する必要がありました。入力に必要なのは6文字のコードだけだったので、数字だけが必要だったので、これが私が行き終えたルートです。数字だけでは足りない場合、これはお尻の痛みかもしれません。キーダウン時に、キーコードを介してその文字を取得し、入力の値を設定します。これにより、iOSは、キーボードを介して入力に値が挿入されたことがないため、元に戻すことはできないと思い込ませます。
キーダウンイベントが伝播しないようにしても、標準のAndroidブラウザーでの入力は妨げられないため、正常に機能することに注意してください。しかし、これはAndroidの問題ではないため、問題ありません。入力自体で入力イベントをリッスンし、このイベントを受信した場合はキーダウンリスナーを削除することで、重複する値が挿入されるのを防ぐことができます。
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);