- PR -

appletから配列を引数にしてjavascriptの関数をコールしたい

1
投稿者投稿内容
会議室デビュー日: 2004/08/20
投稿数: 16
投稿日時: 2005-05-16 09:09
いつも参考にさせていただいています。

appletからLiveConnect(JSObject)を用いて、JavaScriptの関数をコールしています。
JavaScriptに引数として配列を渡そうとすると、「未定義のエラー」というものが帰ってきました。
エラーが出るソースは以下になります。

■JAVA側
String tmp[] = new String[tmpNum];
for (i = 0; i < tmpNum; i++) {
  tmp[i] = Integer.toString(i);
}
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", new Object[]{Integer.toString(tmpNum), tmp});
/* tmpNumはアプレットが呼び出されるたびに値が決定されます(配列の要素数は一意ではありません)*/

■JavaScript側
function SampleMethod(num, val) {
  var str="";
  for (i = 0; i < num; i++) {
    str = str + String(val[i]) + ", ";//ここでエラーが出力される
  }
  alert(str);
}

JavaScriptの 「str = str + String(val[i]) + ", ";」 の部分で「未定義のエラー」が表示されます。
ためしにと思い、上記JavaScriptのソースをalert(val);に変更してみると、表示されたポップアップには「[Ljava.lang.String;@11298d」というものがアラート文に表示されました。
ポインタのアドレス?が文字列に変換されて、JavaScriptに渡っているような感じがします。
どうにかして引数に配列を渡すことはできないでしょうか。
ご教授宜しくお願いいたします。


大変失礼なことだと重々承知しておりますが、急を要しますので以下のサイトでも投稿させていただいております。申し訳ございません。
結果が分り次第、両方のサイトに結果を反映いたします。宜しくお願い申し上げます。
WEB相談室様
http://www.parkcity.ne.jp/~chaichan/bin/qanda.cgi?modefg=9
投稿No.6015
未記入
会議室デビュー日: 2005/04/06
投稿数: 15
投稿日時: 2005-05-16 11:08
Javaの配列とJavaScript の配列は違うので
JavaScrpt用の配列で渡してあげるのはいかがでしょうか?

val をカンマ区切りの文字列で渡してあげて
new Array(val)
となるような・・・

# いい加減すぎたので書き直しました。済みません。

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-05-16 11:25 ]
会議室デビュー日: 2004/08/20
投稿数: 16
投稿日時: 2005-05-16 13:22
ご回答ありがとうございます。

引用:
val をカンマ区切りの文字列で渡してあげて
new Array(val)
となるような・・・



を汲みまして、以下のようなソースにて実行してみました。

■JAVA側
String tmp = "";
for (i = 0; i < tmpNum; i++) {
  tmp = tmp + Integer.toString(i);
  if (i != tmpNum - 1) {
    tmp = tmp + ",";
  }
}
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", new Object[]{Integer.toString(tmpNum), tmp});
/* tmpNumはアプレットが呼び出されるたびに値が決定されます(配列の要素数は一意ではありません)*/

■JavaScript側
function SampleMethod(num, val) {
  var tmp = Array.apply(null, val);
  var str="";
  for (i = 0; i < num; i++) {
    str = str + String(tmp[i]) + ", ";
  }
  alert(val);
  alert(str);
}

結果ですが、カンマ区切りの文字列は表示されたものの(alert(val)の部分)JavaScript側の
var tmp = Array.apply(null, val);
の部分で、「Arrayオブジェクトがありません」というエラーメッセージが表示されました。

また、
var tmp = Array.apply(null, val);
の部分を
var tmp = new Array();
tmp = val;
と置き換えたところ、alert(str)の部分で「undifined/undifined/・・・」という文が表示されました。
やはりカンマ区切りの文字列としてしか受け取らないみたいです。

JavaScript側でカンマをセパレータとして区切らないといけないのでしょうか・・・
未記入
会議室デビュー日: 2005/04/06
投稿数: 15
投稿日時: 2005-05-16 13:38
var tmp = new Array(val);

こっちです。
JavaScript でぐぐってください。
会議室デビュー日: 2004/08/20
投稿数: 16
投稿日時: 2005-05-16 14:52
未記入様、ご回答ありがとうございます。それから理解不足で申し訳ありません。

JavaScript側のソースを以下のように変更して試してみました。
■JavaScript側
function SampleMethod(num, val) {
  var tmp = new Array(val);
  var str="";
  for (i = 0; i < num; i++) {
    str = str + String(tmp[i]) + "/";
  }
  alert(val);
  alert(str);
}
結果と致しましては、alert(str)の部分で、「1,2,3,4,…/undifined/undifined/…」という風に出力されました。
やはり、カンマ区切りの文字列として扱われたようです。
(私のソースミスならば申し訳ございません。ご指摘下さい。)


WEB相談室様
http://www.parkcity.ne.jp/~chaichan/bin/qanda.cgi?modefg=9
投稿No.6015
のほうで1つ結果が出ましたのでご紹介させていただきます。

方法としましては、JAVAからコールするJavaScriptの関数にargumentsオブジェクトを用いて実引数を渡す方法です。ソースは以下のようになっております。
■JAVA側
String tmp[] = new String[tmpNum + 1];
tmp[0] = Integer.toString(tmpNum);
for (i = 0; i < tmpNum; i++) {
  tmp[i + 1] = Integer.toString(i);
}
JSObject win = JSObject.getWindow(this);
win.call("SampleMethod", tmp);

■JavaScript側
function SampleMethod() {
  var str;
  num = arguments[0];
  for (i = 0; i < num; i++) {
    str = str + String(arguments[i + 1]) + ", ";
  }
  alert(str);
}

配列を渡すという固定観念が、いけませんでした。
また、皆様にも配列引数にするという観念を多少でも植え付けてしまったことに反省します。

未記入様、ならびに目を通してくださいました皆様、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)