• 締切済み

関数内の配列を関数外で使うにはどのような方法がありますか?

関数内の配列を関数外で使うにはどのような方法がありますか? 実際には以下のものです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "​http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">​ <html xmlns="​http://www.w3.org/1999/xhtml">​ <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Google AJAX Feed API テスト</title> <meta http-equiv="content-script-type" content="text/javascript" /> <script type="text/javascript" src="​http://www.google.com/jsapi?key=​【キーコード】"></script> <script type="text/javascript"> google.load("feeds", "1"); function initialize() { var feed = new google.feeds.Feed("【RSSアドレス】"); feed.setNumEntries(5); feed.load(function(result) { if (!result.error) { var container = document.getElementById("feed"); for (var i = 0; i < result.feed.entries.length; i++) { var entry = result.feed.entries[i]; var dd = new Date(entry.publishedDate); // now var yearNum = dd.getYear(); if (yearNum < 2000) yearNum += 1900; var date = yearNum + "."+(dd.getMonth()+1)+"."+dd.getDate()+" "; container.innerHTML += "<p>" + date +" <a href='" + entry.link + "' target='_blank'>" + entry.title + "</a></p>"; } } }); } google.setOnLoadCallback(initialize); </script> </head> <body> <div id="feed"></div> </body> </html> 最後の方の、container.innerHTMLを使わず配列として blogs.push(Date.parse(date),"<p>" + date +" <a href='" + entry.link + "' target='_blank'>" + entry.title + "</a></p>"); で、配列にpushして最後にdateでsortしたいのですが、どうでしょうか? 初心者なのでお手柔らかにお願いします!

みんなの回答

回答No.4

ちなみにどんなエラーがでますか? 行数と、メッセージ、エラーの出た行に書かれたコードを教えて下さい。 出来れば書き直したスクリプトも公開して頂ければ助かります。 該当のGoogleのAPIは使った事無いのですが、 単純にクラス内部で渡した Functionオブジェクトをコールしているだけだと思います。

nite2000
質問者

お礼

何度も、回答ありがとうございます。 以下が今のコードです。 尚、エラーはでていません。Firebugで確認するところ、blogsの中が空っぽでデータが表示されないだけみたいです。 恐れ入りますが、よろしくお願いします。 <script language="Javascript" type="text/javascript"> google.load('feeds', '1'); var blogs = Array(); function feeds_init() { var rss = new Array( 'http://dailynews.yahoo.co.jp/fc/rss.xml', 'http://dailynews.yahoo.co.jp/fc/computer/rss.xml', 'http://dailynews.yahoo.co.jp/fc/science/rss.xml', 'http://dailynews.yahoo.co.jp/fc/entertainment/rss.xml' ); var rssNum = rss.length + 1; var container = document.getElementById('feedControl'); for(var f = 0; f < rssNum ; f++) { var feed = new google.feeds.Feed(rss[f]); feed.setNumEntries(1); feed.load(function(result) { if (!result.error) { var text = ''; var entries = ''; for (var i = 0; i < result.feed.entries.length; i++) { var entry = result.feed.entries[i]; text+= '<span>' + entry.title + '</span>'; text+= '<span>' + entry.publishedDate + '</span>'; text+= '<span>' + entry.contentSnippet + '</span>'; entries+= '<div><a href="' + entry.link + '">' + text + '</a></div>'; var entryTime = Date.parse(entry.publishedDate); } blogs.push(new entryData(entryTime, '<div><p>' + result.feed.title + '</p>' + entries + '</div>')); } }); } //console.log(blogs); blogs.sort(cmp_data); for (var i = 0; i < blogs.length; ++i) { container.innerHTML+= blogs[i].data; } function entryData(date, data) { this.date = date; this.data = data; } function cmp_data(a, b) { return b[0] - a[0]; } } google.setOnLoadCallback(feeds_init); </script> ボディに以下。 <div id="feedControl">Loading...</div>

nite2000
質問者

補足

解決してしまったのでご報告いたします。 原因は、 読込が非同期だったのでblogs.sort以下が先に実行され 中身が空っぽだったみたいです。 解決方法は、 非同期のfor()で読込数をカウントして カウントが0になったらblogs.sort以下を呼び出すように 変更したところ上手くいきました。 afganhound様や、ほか回答してくださった方、ありがとうございました。

回答No.3

失礼しました。 var a = array(); ではなく var a = Array(); でした。 一応全文載せます <script type="text/javascript"> var a = Array(); function b(){ a[0] = "sample"; } b(); alert(a[0]); </script> window[変数名]での使用方法は以下のようにすればOKです。 <script type="text/javascript"> function b(){ var a = Array(); a[0] = "sample"; window["ary"] = a; } b(); alert(ary[0]); </script>

nite2000
質問者

お礼

回答ありがとうございます。 両方でやってみましたが、上手くいきませんでした。 blogs.pushをしてるのがGoogleのクラスの中だから外で反映しないのでしょうか? feed.load(function(result) {~blogs.push();~} 何度もすみません。orz

回答No.2

1の方の補足ですが。 var a = array(); function b(){ a[0] = "sample"; } b(); alert(a[0]); // "sample" 要するにfunction b(){}の外で var a = array() を宣言すれば、bの中でも外でも使えます。 外で宣言できない場合は、 ・returnで配列を返す。 もしくは ・window["配列名"] = 配列; とすると、使えます。(確か)

nite2000
質問者

お礼

回答ありがとうございます。 はい、グローバル変数にしても駄目でした。 ちなみに、var a = array();だと array is not definedになりました。 window["配列名"] = 配列;の場合 どのように呼び出すのでしょうか? 「window.配列名」ですか?

noname#84373
noname#84373
回答No.1

関数の外で変数を宣言すれば、どこでも

nite2000
質問者

お礼

回答ありがとうございます。 それは分かるのですが、上手くいきません。 原因がさっぱりです。どうしたものか。。。