人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

iOS-UIWebViewで表示したサイトのフォーカスを取得したいです。

現在iOSアプリ開発の勉強をすすめています。
UIWebViewにwebサイトを表示させ、テキストボックス等にフォーカスが当たった場合に、フォーカスされているinput要素をobjective-c側で取得したくて以下のように記述してみましたが、うまく取得できません。

NSString *hoge = [_webView stringByEvaluatingJavaScriptFromString:@"document.activeElement.id;"];
NSString *hoge = [_webView stringByEvaluatingJavaScriptFromString:@"document.getSelection().focusNode;"];

どのように実装すれば取得できるのでしょうか?
#表示するwebサイトのinput要素の内容は、アプリ側で知らなくてもいいようにしたいです。

●質問者: くぼう
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● gizmo5
●500ポイント ベストアンサー

フォーカスされているinput要素の何を取得したいんでしょうか?
入力されているデータのことだったら、こんな感じの処理ではどうでしょう。

NSString *js = @"document.activeElement.value";
NSString *hoge = [_webView stringByEvaluatingJavaScriptFromString:js];

普通のdiv要素などにフォーカスが当たっているとundefinedという文字列が返されます。


くぼうさんのコメント
ありがとうございます。 >フォーカスされているinput要素の何を取得したいんでしょうか? idやnameなど、そのinput要素(テキストボックスやテキストエリア)を識別するものを取得したいです。 頂いたアドバイスを参考に、以下のように実装してみましたが、NSLogでは何も表示されませんでした。 NSString *hoge = [_webView stringByEvaluatingJavaScriptFromString:@"document.activeElement.value"]; NSLog(@"%@", hoge); NSLog(@"%@", hoge);部分にブレイクポイントを設定しhogeの中身を確認したところ以下のようになっていました。 NSString* hoge NSObject NSObject Class isa __NSCFConstanString Class [0] Value <error:unknown Class> 何かヒント等頂ければ助かります。

gizmo5さんのコメント
ログに何も表示されないということは空文字列が返ってきてるということではないですか? 私の回答のソースは input に設定されているデータを取得するものです。 idやname属性も同様に取得できるはずですが、HTML として記述されている必要があります。 formに含まれるinputだとしたら、name属性は記述されていると思います。

くぼうさんのコメント
説明が足りず申し訳ありません。 テキストボックスに値を入力し、document.activeElement.valueを実行しましたが値を取得することができませんでした。 同様にdocument.activeElement.idやdocument.activeElement.nameも値を取得することができませんでした。 テキストボックスにキャレットが表示されていることから、フォーカスしているように見えるのですがonblur属性やonfocus属性を駆使して明示的に指定する必要があるのでしょうか?

gizmo5さんのコメント
自分で書いたHTMLではなく、どっかのサイトのページの内容をアプリからいじろうとしていると思っているのですけれどもあってますか? いろんなことをいっぺんにやろうとして、何が悪いのかわからずに混乱しているように見えます。 まずは問題を一つ一つ切り分けることから始めたらどうでしょう。 ・javascriptのコードが正しいかどうか パソコンのブラウザで対象のサイトを開き、実行しようとしているjavascriptのコードをbookmarkletかブラウザのデバッグの機能で実行して期待通りに動くかどうか。 ・iOSアプリからjavascriptのコードが正しく呼べているかどうか "window.alert('hello')" のような動いて当然なjavascriptのコードを呼び出してみて正しく動作するかどうか。

くぼうさんのコメント
アドバイスありがとうございます。 >自分で書いたHTMLではなく、どっかのサイトのページの内容をアプリからいじろうとしていると思っているのですけれどもあってますか? はい。その通りです。 >・javascriptのコードが正しいかどうか bookmarkletを作成し、以下の環境で試してみました。 ・bookmarkletの内容(3つのパターンを試しました。) 1.javascript:alert(document.activeElement.value); 2.javascript:alert(document.activeElement.id); 3.javascript:alert(document.activeElement.name); ・動作環境 mac OS X 10.8.3 Safari 6.0.4 正常に動作しました。 >・iOSアプリからjavascriptのコードが正しく呼べているかどうか 以下の実装に変更し実行してみました。 [_webView stringByEvaluatingJavaScriptFromString:@"alert('hello world');"]; 正常に動作しました。 やはりUIWebViewだと動作してくれないということなんでしょうか。。

gizmo5さんのコメント
>> やはりUIWebViewだと動作してくれないということなんでしょうか。。 << そんなことはありません。 activeElement はたいていのブラウザでは期待通りに動作しますし、コードの断片しか書いていませんが、こういった情報を書いている人もいます。 http://www.tmpmudai.net/?p=320 それぞれの要素が動作するようだということであれば、疑わしいのは組み合わせというか実行しているタイミングでは。 ・stringByEvaluatingJavaScriptFromString は、いつどのようなタイミングで呼び出しているのでしょうか ・stringByEvaluatingJavaScriptFromString を実行したときにフォーカスがinputから外れている可能性は無いか あと、bookmarkletは自分で実行したい環境でやってみないと意味が無いのでMACではなくiphoneもしくはipadなど、実行したいアプリが動く環境で試してみてください。

くぼうさんのコメント
>bookmarkletは自分で実行したい環境でやってみないと意味が無いのでMACではなくiphoneもしくはipadなど、実行したいアプリが動く環境で試してみてください。 そうですよね。。。 実行したところ問題なく動作しました。 >stringByEvaluatingJavaScriptFromString は、いつどのようなタイミングで呼び出しているのでしょうか キーボードが表示されるタイミングで呼び出しています。 具体的にはUIKeyboardWillShowNotificationのタイミングで実装しています。 ここまで書いていて気付いてUIKeyboardDidShowNotificationに変更したところ無事動作しました! 単純な事でしたが視野が狭くなっていたようです。。 本当にありがとうございます。

gizmo5さんのコメント
うまくいって良かったですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ