0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Swift】WebKitでbackspaceを押すと前のページに戻る仕様の対処法

Posted at

はじめに

タイトルの通りです。
MacApp開発時に見つけた問題ですがiPadでキーボード接続時にも起きると思います。(未検証)

タグにJavaScriptとあるようにjsを使って解決します。
swift側で解決する方法があれば教えてください。

実行環境

  • MacOS 13.1
  • Xcode 14.2
  • swift 5.7.2

ソースコード

NavigationDelegate.swift
// "WebViewController"は各自命名したclassに合わせて変更してください
extension WebViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.addEventListener('keydown',function(a){var b=a.target.nodeName.toLowerCase();'Backspace'!==a.key||'input'===b&&!'range checkbox radio color submit reset button image file hidden'.split(' ').includes(a.target.type.toLowerCase())||'textarea'===b||a.preventDefault()},!1);")
    }
}

解説

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)
を使い遷移開始時にjsを実行します。

jsのコードは圧縮しています、圧縮前のコードはこちらです。

document.addEventListener("keydown", function (e) {
    var nodeName = e.target.nodeName.toLowerCase();
    var type = e.target.type.toLowerCase();
    var typeList = ["range", "checkbox", "radio", "color", "submit", "reset", "button", "image", "file", "hidden"];
    if (e.key === "Backspace") {
      if (!(nodeName === "input" && !typeList.includes(type) || nodeName === "textarea")) {
        e.preventDefault();
      }
    }
  },
  false
);

textareaと一部のinputではバックスペースが入力できないと困るのでそれ以外の時に無効化する処理を入れています。

これでテキスト入力時以外はバックスペースを無効化します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?