Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

JavaScript WebService 小技集

第4回:twitter の JavaScript Badge をIEで表示するとおかしい件に対応してみる

投稿日:


twitter 流行ってますね。みなさんも使っていますか?
オレはというと…ポツリポツリと呟いています。
friends は2人しかいません orz
twitter は SNS 的な使い方もできるツールなのですが、SNS よりも遥かにゆるく「低機能」なので自分としては本当にその時のステータスをブログパーツとしてこのブログに貼り付けるために使っています。
で、このブログパーツ(アチラでは Badge と呼びますね)なんですが、twitterには標準で4つの Badge が用意されていてブロガー達に重宝されているようです。内2つは Flash バージョンなんですがデザインが気に食わなかったので JavaScript 版にちょっとテコ入れをして使う事にしました。
・・・ってか写真展示に関する Tip’s を公開するスペースじゃなかったのか?ここは。
スミマセン。興味の向くままノープランで書いております(苦笑)

1)IE で Badge を見ると「NaN」とかなっている

badge の 中にある relative_time 関数は「about * hours ago」とか表示してくれるんだけど、IE の場合は JavaScript に問題があって、「NaN days ago」とかなっちゃう。
原因は relative_time 関数内1行目の Date.parse だ。
Date.parse は日付文字列を Date 型にパースしてくれるんだけど、引数で渡す文字列によってはうまく日付として扱ってくれない。しかも、ブラウザによって解釈が違う。
この Badge で relative_time 関数に渡される日付文字列はJSONPから返されているのだけど、こんなフォーマットだ。

"Wed Apr 25 12:35:05 +0000 2007"

これを JavaScript で解釈しやすい下記のフォーマットに変換してみる。

"Apr 25, 2007 12:35:05"

修正は Date.parse の前に下記2行を足すだけ。

function relative_time(time_value) {
time_values = time_value.split(" ");
time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3];
var parsed_date = Date.parse(time_value);

1行目では、” “スペースで配列に分解、
2行目では、並び替えをしている。(曜日とミリ秒はいらない)
これで「NaN」は解決しました。

2)9時間ズレてますけど

twitterサーバは米国(?)で UTC 、JavaScriptを動かしているのは日本で JST 、ありがちなネタです。 relative_time 関数で経過秒数である delta 変数の計算のあとに、差分を吸収するためのコードを追加します。

var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
delta = delta + (relative_to.getTimezoneOffset()*60);

getTimezoneOffset()ってのが差分を出してくれる関数。日本だと9時間だから -540 (分)が返る。単位は秒数だから 60 をかけた。
これで修正は終わりです。
一応完成したコードをのせておきます。

<script type="text/javascript">
function relative_time(time_value) {
time_values = time_value.split(" ");
time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3];
var parsed_date = Date.parse(time_value);
var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
delta = delta + (relative_to.getTimezoneOffset()*60);
if(delta < 60) {
return 'less than a minute ago';
} else if(delta < 120) {
return 'about a minute ago';
} else if(delta < (45*60)) {
return (parseInt(delta / 60)).toString() + ' minutes ago';
} else if(delta < (90*60)) {
return 'about an hour ago';
} else if(delta < (24*60*60)) {
return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
} else if(delta < (48*60*60)) {
return '1 day ago';
} else {
return (parseInt(delta / 86400)).toString() + ' days ago';
}
}
function twitterCallback(obj) {
var id = obj[0].user.id;
document.getElementById('my_twitter_status').innerHTML = obj[0].text;
document.getElementById('my_twitter_status_time').innerHTML = relative_time(obj[0].created_at);
}
</script>
<span id="my_twitter_status"></span> <span id="my_twitter_status_time"></span>
<script type="text/javascript" src="http://www.twitter.com/statuses/user_timeline/{YourID}.json?callback=twitterCallback&count=1"></script>

関連エントリー

 ・第6回:TinyURL の遷移先が怖くて開けない場合の対処法
 ・第5回:twitter の JavaScript Badge を改造する
ブログランキング←この記事が役に立った場合はクリックで応援して下さい!

-JavaScript, WebService, 小技集

執筆者:


  1. 第5回:twitter の JavaScript Badge を改造する

    しつこく twitter ネタでまいります。 前回の記事で JavaScript…

  2. みずさわ より:

    はじめまして。
    同じ問題を抱えておりましたが、知識不足で自力では修正方法がわからず、ぐぐってこちらの情報にたどり着きました。
    おかげさまで無事解決。
    どうもありがとうございました。

  3. yager より:

    >みずさわさん
    はじめまして。
    みなさん困ってないのかなぁなんて余計な心配をしていたりしました。
    お役に立ててこれほど嬉しい事はありません。
    感謝のお言葉、大変励みになりました!

  4. みずさわ より:

    ご自分で色々作ったりカスタマイズしていらっしゃって、
    すごいなぁと思いました。
    さすがプロ、って感じです。
    他に困ってる方いないのかなぁ?ってのは不思議ですよね。
    Flash版をお使いの方が多いのかもしれませんね。
    またお邪魔させていただきます(^-^)

  5. CEFA::Blog より:

    Twitter: Javascript Badge の日付表示部分の修正

    自分が普段からIE使っていない事もあって放置しっぱなしだった当問題ですが、解決策を提示してくれているサイトさんがありましたので参考に。

  6. yager より:

    >みずさわさん
    Flash版は良く見かけますね。でも、あのデザイン好きじゃないんです。
    JavaScriptの方はコメントだけで、経過時間は表示しない人がほとんどですね。
    まあ、この不具合のせいかもしれませんが。
    プロ!?いや、どうなんでしょう。
    とりあえず、頑張ります(?)

  7. taro より:

    はじめまして。
    私もJavaScriptで時間表示がされない事で悩んでいました。
    同じページにJava版とFlash版と2つ並べて表示するなんて言う
    おかしな状態にして様子を見ていました。
    JavaScriptはとても苦手で、どれだけコードを眺めても
    何がいけないのか判らず諦めようかと思った頃に
    検索でここにたどり着きました。
    今はちゃんと経過時間が表示されてほっとしています。
    本当にありがとうございました。
    経過時間を表示しないって手もあったんですね。
    でも「このコメントいつのよ?」と思われるのも切ないので
    表示できたことがとても嬉しいです。

  8. yager より:

    >taroさん
    はじめまして。コメントどうもです。
    そちらでも無事に表示できたようで、嬉しい限りです。
    大きな反響があったので、逆に色々な環境でちゃんと動いているのか、
    不安な部分があったりしたんですが、大丈夫のようですね。
    JavaScriptはエラーになった時の、原因究明が難しい言語だと思われていますが、
    alert()で表示されるとか原始的な方法でもいいので、1つ1つデバッグしていくと
    必ず問題の個所が特定できるので根気よくやる事が大事ですね。

  9. BITMAP より:

    「Twitter」を利用してみた

    「Twitter」というネットサービスを利用してみた。 これはコミュニケーション…

  10. Twitter Badges の貼り方変更

    「Twitterはじめてみました。」でブログに貼り付けた Twitter Badges。
    ブログのヘッダー部分に貼り付けていると、Twitterが重…

  11. 第6回:TinyURL の遷移先が怖くて開けない場合の対処法

    twitter や、mixi でよく使われている、 TinyURL というWEB…

comment

メールアドレスが公開されることはありません。

関連記事

Twitter @Anywhereをブログのコメントシステムにする方法

Welcome to @Anywhere | dev.twitter.com もはや、WEB界隈ではコミュニケーションプラットフォームとして定着しつつあるTwitterですが、先週、自分のサイトにJa …

MovableTypeでカテゴリーを整理した一部始終

先日、ブログデザイン勉強会に参加したこともありますが、本格的にリニューアルを考えています。 勉強会ではブランディングとかデザインによるイメージ作りがメインになりそうなので、それとは別に機能的な部分のリ …

no image

第15回:見ているページをAnother HTML-lintで文法チェックするブックマークレット

サイトを作ったら、見た目の確認も重要ですがマークアップの文法チェックも重要です。別にW3C信者という訳ではありませんがSEOの面でもstrictなHTMLの方が良さそうなのでできる限り対応した方が良い …

やまざきメソッド ジェネレーターを作りました

先日、社内SNSの日報に一際目を引く所感が書かれていました。 それは、デザイナーやまざきさんの日報だったのですが、下記のようなものでした。 コレを見た自分は驚愕しました。 「超見やすいじゃん!」 コレ …

Googleドキュメントのフォーム機能からGoogle Apps Scriptを使ってメール送信

【2014/12/26:追記】 この記事はGoogleの仕様変更などで内容が古くなっていたため、最新の情報で書き換えました。 リンク先の記事を参照してください。 Googleドライブのフォーム機能から …

スポンサードリンク

スポンサードリンク