このエントリの続きです。今回はHotPepperAPIを使って適当なお店の名前と住所とキャッチコピーをゲッツします。
いきなりハマる
普通にXMLをE4Xで解釈して trace(dataXML.shop[i].catch) と書くとエラーが出ます。これはどういうことか。クーピーさんのこのエントリによれば、catch というのは try~catch の名前とバッティングしてしまうから、らしいです。で、解決方法も書いてあるんですがよくわかりません。
trace(xml.ns::["catch"][0]); // 出力 :: Flasher 募集中!
こういう書き方でいいらしいんですけど、このns::をどこにつけたらいいのかが、このエントリからはサッパリ分かりません。たとえば、xml本体が dataXML.shop[i].catch だった場合はどこにns::をつけるの? ということです。
JSONというとこんな↓のが思いつきます。
var myJSONObject =
{
"キーワード": "説明"
};
でもこれだと、キーワードに対する説明がひとつしか持てません。そこで、説明の部分を配列にしてみました。
var words:Object = {
"箱根":["地名","外国人に人気の観光地"],
"アイス":["食べ物","夏といえばこれ"]
}
var w :String= "アイス"
if(words[w]){
var type=words[w][0]
var comment=words[w][1]
trace(w+"は"+type+"で、"+comment+"です")
}
こうすると、「アイスは食べ物で、夏といえばこれです」とか「箱根は地名で、外国人に人気の観光地です」とか、キーワードに対して説明を2つ以上持たせられます。
っていう超アホな話なんですけど、自分で思いついたものってブログに書きたくなるよねぇー、というだけです。
これがあると何が嬉しいかというと、適当なキーワードを選ぶと、そのキーワードの属性や説明や付属情報など、いろいろをまとめやすいということです。さらにはwords[w][2]とかにフレームラベルを入れておいて、画面のmcをそのフレームにgotoさせるとかね。
objectの形にするか連想配列にするか、本当はずっと迷っていて、1対1のJSON形式のデータをいくつも重ねてテーブル扱いしようかと思ってたけどJSONって関数も書けるし汎用!ってことに気付いてから、上の形式にしました。
via:
ExternalInterfaceでActionScriptの関数呼び出し失敗への対策 – blog.katsumata.tv
ExternalInterfaceのはまりどころを再検証 -tech.kayac.com
jsとswfを繋げるためにExのcallとaddCallbackを使いまくるんですが、ときどきaddCallbackが動作しないことがあります。
これのために土日月を費やしてしまいました。
//swf.objidはFlashを書き出しているSWFObjectの第二引数
function call0(){
var player = document.all? window[swf.objid] : document[swf.objid];
player.OverlayCallBack0()
}
普通はこれでFlash側の OverlayCallBack0() 関数が動くはずなんですが、うんともすんとも言いません。そこで、もう諦めて「ブッダ」読んで寝ようと思ったときに
try{
call0();
}catch(e){
alert(e)
}
ってやってみたら、alertされて「TypeError:player.OverlayCallBack0 is not a Function.」と表示されました。これはエラーがキャッチされた証拠です。で、このエラーは何かというと、flash側の用意ができていないよ、ということらしい。Firebugコンソールで普通に「call0()」とタイプするとちゃんとFlashは動きます。どういうこっちゃ。
上記のエントリでは、JSの関数を実行したいときはASから呼べ、と書いてありますが逆にASをJSから確実に呼びたいときはどうすればいいんでしょうねぇ? Flash自体はローディングを用意してあるので、ロードが完了したらcallbackして、その先の処理を進めているから、Flashがロードできていない状態というのはありえないわけです。じゃあなぜ??
ASを呼ぶにはASから? JSを呼ぶのはASから、というのは楽ですが、ASを呼ぶためのJSが is not a Function. なのは意味不明です。。。。