JavaScriptのデバッグ (JSへの配列の渡し方)

497 views
Skip to first unread message

chessbit

unread,
Jan 11, 2010, 2:00:12 AM1/11/10
to 日本Androidの会
WebView内のJavaScriptについての質問です。

JS側で動的に(Java側から)配列を受け取るために試行錯誤していますが、うまく行っていません。
その原因を突き止めたいのですが、デバッグする方法がわからず困っています
WebView内でのJSをデバッグする方法をご存知の方がいらっしゃいましたら教えて頂けないでしょうか。


具体的には ['abc'] のような文字列を JS側で eval する方法を採っています。
Java側は単純に文字列を return しています。

public String foo(){
return "['abc']";
}

一方、JS側ではJava側のオブジェクト xxx を文字列として扱う分には問題ありませんが、eval するとそこで止まってしまうようです。が、
どういうエラーなのかはデバッグする方法がわからず確証が持てません。

xxx.foo() => 文字列 ['abc'] が返る
eval(xxx.foo()) => エラー

xxx.foo() に toString() や valueOf() をつけたりしてみましたが、解決しませんでした。

別の方法を含め、何かご存知の方、アドバイスをお願いします。

kabayan

unread,
Jan 14, 2010, 4:12:24 AM1/14/10
to 日本Androidの会
kabayanです。

まずはWebViewの中で

str = "[abc]";
eval(str);

でちゃんとevalできるかを確認してみてはいかがでしょう?

pie

unread,
Jan 15, 2010, 9:55:34 AM1/15/10
to 日本Androidの会
はじめて投稿します。
私も WebView から Java の関数をコールして文字列を受け取るようなアプリを作っていますが、
Java から帰ってくる値は、String オブジェクトと微妙に動作が違うような気がします。

回避方法ですが、次の方法はどうでしょうか
eval(new String(xxx.foo()).toString());

Javascript で動作する単独アプリケーションを作ったら開発が簡単でいいと思ったのですが、
確かにデバッグはかえって面倒になりましたね。
地道にalert()をいれて表示させたり、SQLite に書き込み関数を作って呼び出したりしてます。


On 1月11日, 午後4:00, chessbit <ray...@gmail.com> wrote:

chessbit

unread,
Jan 16, 2010, 2:24:59 AM1/16/10
to 日本Androidの会
ご返信ありがとうございます。

結局、foo() の戻り値から括弧を取り除き CSV風文字列にして
eval("[" + xxx.foo() + "]");
として、解決しました。

Pieさんの仰るように通常のStringオブジェクトと微妙に違うが、文字列と + すると通常の String オブジェクトが返ってくる・・・と
理解しました。

微妙に納得できていないのですが、ひとまず解決です。
ありがとうございました。

TM

unread,
Jan 19, 2010, 6:28:44 AM1/19/10
to 日本Androidの会
はじめまして。

解決してなによりですが、個人的にちょっと気になったので調べてみました。
JSにはStringオブジェクトと、いわゆるプリミティブ型の文字列があるのは知っていました。

しかし自動型変換するはずだからどちらでもevalできていいはずなのにおかしいな、と思ったのです。
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/String
に以下のようにすばらしい記述がありました。
抜粋します。

String オブジェクトは String.valueOf() でプリミティブである文字列に変換することが可能です。

String プリミティブと String オブジェクトは、Javascript として評価されたとき、異なる結果を与えます。プリミティブは
ソースコードとして扱われ、一方、String オブジェクトは、文字がそのまま連続した状態のオブジェクトとして扱われます。例:

s1 = "2 + 2"; // String プリミティブを生成します
s2 = new String("2 + 2"); // String オブジェクトを生成します
eval(s1); // 数字の 4 を返します
eval(s2); // 文字列の "2 + 2" を返します
eval(s2.valueOf()); // 数字の 4 を返します

抜粋おわり。

えーっ、って感じですが。。

Reply all
Reply to author
Forward
0 new messages