個人的にやりたかったこと
例えばというHTML要素があったりなかったりして、それの存在チェックによって処理を切り替えたい。evaluateJavaScriptを使用すれば任意のjavascrriptが実行できるのでそれでチェックできるはず。
evaluateJavaScriptを使用してdivタグの要素を取得する
1 2 3 4 5 6 7 8 9 10 11 | var webview: WKWebView = WKWebView() // ...... WKWebView周りの処理 webView.evaluateJavaScript( "document.getElementById(\"divArea\")" , completionHandler: { (html, error) -> Void in print(html ) if html != nil { // ... } }) |
htmlの中身は以下
取り出し方がわからない...
html Any? some
payload_data_0 Builtin.RawPointer
payload_data_1 Builtin.RawPointer
payload_data_2 Builtin.RawPointer
payload_data_0 Builtin.RawPointer
payload_data_1 Builtin.RawPointer
payload_data_2 Builtin.RawPointer
evaluateJavaScriptを使用してBool値を受け取る
ならばnullと比較すればどうか?
javascriptなのでnilじゃないよ!
1 2 3 4 5 6 7 8 | webView.evaluateJavaScript( "document.getElementById(\"divArea\") == null" , completionHandler: { (html, error) -> Void in print(html") // Optional(1) print(html as ? String") // nil print(html as ? Bool") // true print(html as ? Int") // 1 }) |
てっきり文字列で帰ってくると思っていたのでちょっとハマる。
evaluateJavaScriptを使用して浮動小数点数を受け取る
もう少し調べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | webView.evaluateJavaScript( "0.1" , completionHandler: { (html, error) -> Void in print(html) // Optional(0.1) print(html as ? String) // nil print(html as ? Int) // Optional(0) print(html as ? Double) // (0.10000000000000001) if html as ? String != nil { self .keyChain.setString( "1" , forKey: "loggedin" ) } else { self .keyChain.setString( "" , forKey: "loggedin" ) } }) |
0.1の取り出し方がわからないがなんとなく仕組みはわかってきた。
evaluateJavaScriptを使用してテキストフィールドの値を受け取る
テキストフィールドの中に数値や文字が入っていたらどうなるんだろう?
<input type="text" id="textField">
がある画面に対して以下のjavascriptを実行する
1 2 3 4 5 6 | webView.evaluateJavaScript( "document.getElementById(\"textField\").value" , completionHandler: { (html, error) -> Void in print(html as ? String) // Optional( "13577" ) print(html as ? Int) // nil }) |
数値でなく文字列で返ってくるらしい
まとめ
・javascriptの演算はjavascriptの仕様に準ずる
・HTMLの要素は文字列として取得される
ということ?
わかってしまえばそこまで複雑でもない
ただしDOM要素の変換の仕方と浮動小数点数の扱いがよくわからなかった