Javascript | memo-memo Skip to content

memo-memo

web制作に便利そうな情報をメモるブログ

Archive

Tag: javascript

依然書いた、「Google AJAX Feed APIを使ってみた」の、応用版です。

複数のRSSを読み込んで、指定した文字が含まれている記事のみ表示します。

サンプルは、トヨタ、日産、ホンダの三社のRSSを取得して、「ハイブリッド」という文字が、記事のタイトルか内容に含まれている場合のみ、表示しています。

html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>RSSリーダーサンプル</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAARRyJD439CKrHDwanT8Fq0RROytLWb0IPRySwZrSZnSrYgPFbDRS8wX6SHXCMp5HCtXxVIHdRlc5bxQ"></script>
<script type="text/javascript">
google.load("feeds", "1");
</script>
<script type="text/javascript" src="js/main.js"></script>
</head>
<body>
<h1>RSSリーダーのサンプル</h1>

<div id="feed_area"></div>
</body>
</html>

 

js

// JavaScript Document

var rss_arr = new Array();
var delay = 500;
var keyword = "ハイブリッド";
//rssのリスト
var rss_list = ["http://www2.toyota.co.jp/toyotajp/toyota/jp/news_all_rss.xml",
		   "http://www.nissan.co.jp/NEWS/rss.xml",
		   "http://www.honda.co.jp/hotnews/rss/auto.rdf"];

google.setOnLoadCallback(function(){
	$("#feed_area").html("読み込み中...");
	for(var k = 0; k<rss_list.length; k++){
		var feed = new google.feeds.Feed(rss_list[k]);
		feed.setNumEntries(50);
		feed.load(function(result){
			if(!result.error){
				for(var i = 0; i<result.feed.entries.length; i++){
					if(result.feed.entries[i].title.match(keyword) || result.feed.entries[i].content.match(keyword)){
						var rss_obj = new Object();
						rss_obj = { title : result.feed.entries[i].title, url : result.feed.entries[i].link, cont : result.feed.entries[i].contentSnippet, date : new Date(result.feed.entries[i].publishedDate).getTime()};
						rss_arr.push(rss_obj);
					}
				}
			}
		});
	}
	setTimeout(arr_sort,delay);
});

function arr_sort(){
	rss_arr.sort(
		function(a,b){
			var a_date = a["date"];
			var b_date = b["date"];
			if(a_date > b_date) return -1;
			if(a_date < b_date) return 1;
			return 0;
		}
	);
	setTimeout(html_write, delay);
}

function html_write(){
	var html = "";
	for(var j = 0; j<rss_arr.length; j++){

		html += "<dl>";
		html += "<dt>";
		html += "<a href='";
		html += rss_arr[j]["url"];
		html += "' target='_blank'>";
		html += rss_arr[j]["title"];
		html += "</a>---";
		html += date_change(rss_arr[j]["date"]);
		html += "</dt>";
		html += "<dd>";
		html += rss_arr[j]["cont"];
		html += "</dd>"
		html += "</dl>";
	}

	$("#feed_area").html(html);
}

function date_change(n){
	var renewal_day = "";
	var date = new Date(n);
	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var day = date.getDay();
	renuwal_day = year + "年" + month + "月" + day + "日";
	return renuwal_day;
}

最終的に、htmlの、

<div id=”feed_area”></div>

に、取得して精査した記事を入力します。

var rss_arr = new Array();
var delay = 500;
var keyword = "ハイブリッド";
//rssのリスト
var rss_list = ["http://www2.toyota.co.jp/toyotajp/toyota/jp/news_all_rss.xml",
"http://www.nissan.co.jp/NEWS/rss.xml",
"http://www.honda.co.jp/hotnews/rss/auto.rdf"];

最初に、グローバル変数を宣言しています。
var rss_arrは、最終的に表示する記事を、各々連想配列として入力するための配列です。
var delayは、for文の処理を待つための時間です。
var keywordは、チェックする文字列です。
var rss_listは、取得するRSSのURLが格納された配列です。今回は、トヨタ、日産、ホンダのRSS。

google.setOnLoadCallback(function(){
	$("#feed_area").html("読み込み中...");
	for(var k = 0; k<rss_list.length; k++){
		var feed = new google.feeds.Feed(rss_list[k]);
		feed.setNumEntries(50);
		feed.load(function(result){
			if(!result.error){
				for(var i = 0; i<result.feed.entries.length; i++){
					if(result.feed.entries[i].title.match(keyword) || result.feed.entries[i].content.match(keyword)){
						var rss_obj = new Object();
						rss_obj = { title : result.feed.entries[i].title, url : result.feed.entries[i].link, cont : result.feed.entries[i].contentSnippet, date : new Date(result.feed.entries[i].publishedDate).getTime()};
						rss_arr.push(rss_obj);
					}
				}
			}
		});
	}
	setTimeout(arr_sort,delay);
});

この処理で、rssを読み込んで、精査して、連想配列を作って、出来た連想配列を配列に格納しています。

青文字のfor文は、変数rss_listの数だけ、(今回は3回)繰り返します。

緑文字で、google apiに、RSSを指定して、取得する記事数を指定しています。

if(!result.error){

以降が、読み込んだRSSに対する処理です。

黄色文字は、取得した記事分の繰り返し処理です。

赤文字のif文の条件が、記事のタイトルか記事の本文に、「ハイブリッド」という言葉があるかないかです。

もしあったら、そのつど新しいオブジェクトを作成して、連想配列を作って、記事のタイトルとURLと、記事の本文と、更新日を格納しています。更新日は、その後の処理でソートさせたいので、getTime()で、数値に変換しています。ひょっとしたら、変換しなくてもソート出来るかも?出来た連想配列を、配列rss_arrに格納します。

黒文字のsetTimeout(arr_sort,delay)で、for文の処理をちょっと待ってから、関数arr_sortを実行しています。

function arr_sort(){
	rss_arr.sort(
		function(a,b){
			var a_date = a["date"];
			var b_date = b["date"];
			if(a_date > b_date) return -1;
			if(a_date < b_date) return 1;
			return 0;
		}
	);
	setTimeout(html_write, delay);
}

function html_write(){
	var html = "";
	for(var j = 0; j<rss_arr.length; j++){
		html += "<dl>";
		html += "<dt>";
		html += "<a href='";
		html += rss_arr[j]["url"];
		html += "' target='_blank'>";
		html += rss_arr[j]["title"];
		html += "</a>---";
		html += date_change(rss_arr[j]["date"]);
		html += "</dt>";
		html += "<dd>";
		html += rss_arr[j]["cont"];
		html += "</dd>"
		html += "</dl>";
	}

	$("#feed_area").html(html);
}

function date_change(n){
	var renewal_day = "";
	var date = new Date(n);
	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var day = date.getDay();
	renuwal_day = year + "年" + month + "月" + day + "日";
	return renuwal_day;
}

関数arr_sortは、配列の中身を、連想配列のdateでソートしています。

ソートに関しては、この記事がとっても参考になりました。

さらにsetTimeoutで処理を待って、htmlに書き出す関数html_writeを実行しています。

html += date_change(rss_arr[j]["date"])

は、そのまま出力すると数値なので、関数date_changeで、日付のフォーマットを作ってます。

rssリーダーサンプル

// JavaScript Document

var rss_arr = new Array();
var delay = 500;
var keyword = “ハイブリッド”;
//rssのリスト
var rss_list = ["http://www2.toyota.co.jp/toyotajp/toyota/jp/news_all_rss.xml",
"http://www.nissan.co.jp/NEWS/rss.xml",
"http://www.honda.co.jp/hotnews/rss/auto.rdf"];

google.setOnLoadCallback(function(){
$(“#feed_area”).html(“読み込み中…”);
for(var k = 0; k<rss_list.length; k++){
var feed = new google.feeds.Feed(rss_list[k]);
feed.setNumEntries(50);
feed.load(function(result){
if(!result.error){
for(var i = 0; i<result.feed.entries.length; i++){
if(result.feed.entries[i].title.match(keyword) || result.feed.entries[i].content.match(keyword)){
var rss_obj = new Object();
rss_obj = { title : result.feed.entries[i].title, url : result.feed.entries[i].link, cont : result.feed.entries[i].contentSnippet, date : new Date(result.feed.entries[i].publishedDate).getTime()};
rss_arr.push(rss_obj);
}
}
}
});
}
setTimeout(arr_sort,delay);
});

function arr_sort(){
rss_arr.sort(
function(a,b){
var a_date = a["date"];
var b_date = b["date"];
if(a_date > b_date) return -1;
if(a_date < b_date) return 1;
return 0;
}
);
setTimeout(html_write, delay);
}

function html_write(){
var html = “”;
for(var j = 0; j<rss_arr.length; j++){

html += “<dl>”;
html += “<dt>”;
html += “<a href=’”;
html += rss_arr[j]["url"];
html += “‘ target=’_blank’>”;
html += rss_arr[j]["title"];
html += “</a>—”;
html += date_change(rss_arr[j]["date"]);
html += “</dt>”;
html += “<dd>”;
html += rss_arr[j]["cont"];
html += “</dd>”
html += “</dl>”;
}

$(“#feed_area”).html(html);
}

function date_change(n){
var renewal_day = “”;
var date = new Date(n);
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDay();
renuwal_day = year + “年” + month + “月” + day + “日”;
return renuwal_day;
}

javascriptで、ブラウザにクッキーを保存、取得する方法。
まず、クッキーを保存する方法。

var cName = "test";
var cData = "hoge";
var cDay = "30";
	if(!navigator.cookieEnabled){    // クッキーが利用可能かどうか
		return;
	}
	var sday = new Date();
	sday.setTime(sday.getTime() + (cDay * 1000 * 60 * 60 * 24));
	s2day = sday.toGMTString();
	document.cookie = cName + "=" + escape(cData) + ";expires=" + s2day;

こんな感じ。
この場合、「test=hoge」が、30日間保存される。
これを、ある程度汎用的な関数にすると、

function cookieWrite(cName , cData , cDay){
	if(!navigator.cookieEnabled){    // クッキーが利用可能かどうか
		return;
	}
	var sday = new Date();
	sday.setTime(sday.getTime() + (cDay * 1000 * 60 * 60 * 24));
	s2day = sday.toGMTString();
	document.cookie = cName + "=" + escape(cData) + ";expires=" + s2day;
}

こんな感じになる。
呼び出し方は、

cookieWrite("sample","abc",10)

こんな感じ。この場合、「sample=abc」が、10日間保存される。
次は呼び出し方。

var cookie_memory = "";
var read_cookie = document.cookie;
 var read_cookie_split = read_cookie.split("; ");
 for(var i=0; i<read_cookie_split.length; i++){
 var read_cookie_split2 = read_cookie_split[i].split("=");    
 if (read_cookie_split2[0] == "test"){
 var cookie_memory = read_cookie_split2[1];
 }
 }

まずは、オレンジ文字の「var cookie_memory」で、最終的に必要なクッキーのデータを格納する変数を定義しておく。

次に、青文字の「var read_cookie = document.cookie;」で、ブラウザに保存されているクッキーを全部取得する。

次に、赤文字の「var read_cookie_split = read_cookie.split(“; “);」で、配列にする。クッキーは、「test=hoge; sample=abc」こんな感じで、複数の場合は「; 」で切っている。read_cookie_split[0]は、「test=hoge」。read_cookie_split[1]は、「sample=abc」が格納されている。

次に、緑文字のfor文。一つ前の段階で、「; 」で切ったデータを、さらに「=」で切る。そのデータが、var read_cookie_split2に配列として入る。この時点で、例えばクッキーが「test=hoge」の時は、read_cookie_split2[0]は、「test」、read_cookie_split2[1は、「hoge」が格納されている。

後は、if文で、必要なデータの時は、変数cookie_memoryに格納してしまえば良し。それ以外の、必要じゃないデータの時はスルーさせれば良し。

もう少しブラッシュアップ出来るかもしれないけど、とりあえずこんな感じでいけました。

後、ブラウザで記録されているクッキーを表示させるには、URL欄に

javascript:document.cookie;

と打てばよし。

今回のコードを作るのに、以下のページを参照させて頂きました。詳しい説明も載っています。


今まで、使った事が無かったので、使ってみました。
heightLine.js
使い方は、
まず、heightLine.jsを、読み込んで、揃えたいブロック要素に、class=”heightLine”と書くだけ。
例えば、下記の様な感じ。

<div id="container">
<div id="left" class="heightLine"></div>
<div id="right" class="heightLine"></div>
</div>

こんな感じに使う。

2カラムとか、3カラムのサイトをコーディングする時に便利。

総ミリ秒が格納されている変数nTimeを、1000で割った余りがミリ秒になり、nTimeを1000で割った整数分を、もう一度nTimeに格納し直す。
次に、nTimeを60で割った余りが秒になり、nTimeを60で割った整数分を、もう一度nTimeに格納し直す。
次に、nTimeを60で割った余りが分になり、nTimeを60で割った整数分が、時になる。
言葉で記述するのは、ちょっと難しいので、下記コード参照

var nTime = 45296789;//総ミリ秒
var milliseconds = nTime % 1000;
nTime = Math.floor(nTime / 1000);
var seconds = nTime % 60;
nTime = Math.floor(nTime / 60);
var minutes = nTime % 60;
var hours = Math.floor(nTime / 60);

こんな感じ。後は、milliseconds、seconds、minutes、hoursに格納した値を整形すれば良し。
この考え方は、汎用的に色々なスクリプトで応用出来そうな気がする。

今まで、全然知らなかったけど、どうやら連想配列は、Array型では無いらしい。

http://js.tank.jp/javascript/post.html

http://d.hatena.ne.jp/amachang/20070202/1170386546

例えば、

var arr = ["Takahashi","28"];
var obj = {name:'Yamada', old:24};
alert(arr.length);
alert(obj.length);

上記の様なjavascriptを書いたとき、青字のalert(arr.length);は、普通に、配列の中の個数をalertする。(今回は、2が出力される。)

一方、赤字のalert(obj.length);は、undefinedが出力される。

どうやら、連想配列は、Object型らしい。

よく、配列の中にあるものを、for文の繰り返しで、中にあるものを全部処理するっていう感じの文を書くけれど、

例
for (var i; i<hairetu.lenth; i++ ){
~ここに処理~
}

連想配列の場合は、for in文を使う事で、中にあるもの全部に対して、処理が出来る。例えば、

var obj = new Object();
obj.name = 'Yamada';
obj.old = 24;
for(var soe in obj){
document.write(soe+":"+obj[soe]+"<br />");
}

こんな感じで、実行する。

for in文に関して、詳しくは、下記のサイトに乗ってます。

http://www.ajaxtower.jp/js/for/index8.html

どうやら、若干連想配列の指定の仕方に違いはあるかもだけど、ActionScriptでも、同じようなことがいえそうです。

その辺は、後でまた調べてみよう。