2009-05-18

opensocial-jquery 1.0.2 をリリースしましたのでざっくりと紹介します。

こんばんは。なかじまんです。opensocial-jquery 1.0.2 をリリースしましたので、ざっくりと紹介します。

キャッシュ制御

jQuery.container.cache を使って、外部データのキャッシュ有無を、まとめて切り替えられるようにしました。開発中のデバッグで役に立つんじゃないかと期待しています。

jQuery.container.cache = false とすると、次のとおり、gadgets.io.makeRequest、gadgets.io.getProxyUrl、gadgets.flash.embedCachedFlash, embedFlash など、外部データのキャッシュをすべて無効にできます。

$.container.cache = false; // nocache=1

// gadgets.io.makeRequest
$.getJSON('http://example.com/data.json',
function(data, status) {}
);

// gadgets.io.getProxyUrl
$('<img/>').attr('src',
$.proxy('http://example.com/data.gif')
);

// gadgets.flash.embedCachedFlash, embedFlash
$('#container').flash('http://example.com/data.swf');

jQuery.container.cache は URL パラメータの nocache と連動します。nocache=1 のときは false となり、それ以外のときは true となります。nocache=1 のときは、自動的にキャッシュが無効になるため、明示的に jQuery.container.cache を使う機会は少ないかもしれません。

mixi Platform の改善

jQuery.ajax とショートカットを使って、外部データを取得できるようになりました。mixi の gadgets.io.makeRequest は、コールバックするデータに HTTP ステータスコードを表す rc プロパティを含まないため、正常と判断できず、常にエラーとなっていたようです。

jQuery.container を使って mixi Platform かどうかを判別できるようにしました。

if ($.container.mixi) {
// // This container is mixi.
}

さらに HTML 要素に対して、mixi Platform を表すクラスを自動的に追加し、CSS のクラスを使って mixi Platform だけの CSS を適用できるようにしました。

.mixi div.photo img {
/* This container is mixi Platform. */
}

Google Friend Connect ガジェットの対応

Google Friend Connect ガジェットに対応しました。OpenSocial API に加え Google Friend Connect 固有の @admins セレクタを使って、管理者のプロフィールを取得できます。

$.getData('/people/@owner/@admins', {},
function(people) {}
);

jQuery.container を使って Google Friend Connect かどうかを判別できるようにしました。

if ($.container.friendconnect) {
// // This container is Google Friend Connect.
}

さらに HTML 要素に対して、Google Friend Connect を表すクラスを自動的に追加し、CSS のクラスを使って Google Friend Connect だけの CSS を適用できるようにしました。

.friendconnectdiv.photo img {
/* This container is Google Friend Connect. */
}

なお、Google Friend Connect API (インページ)には対応していません。検討中です。

JSDeferred の強化

JSDeferred のクラスメソッドを jQuery.deferred, jQuery.parallel, jQuery.wait, jQuery.next, jQuery.call として使えるようにしました。また、JSDeferred のインスタンスメソッドとして JSDeferred.wait、jQuery.ajax とショートカットを追加しました。

opensocial-jquery は opensocial.DataRequest のバッチリクエストをサポートしませんが、jQuery.parallel を使うことで、いくつかのリクエストをまとめることができます。

$.parallel([
$.get('http://www.yahoo.co.jp/'),
$.getData('/people/@viewer/@self'),
$.getData('/people/@viewer/@friends')
]).next(function(data) {
console.log(data[0]); // http://www.yahoo.co.jp/
console.log(data[1]); // /people/@viewer/@self
console.log(data[2]); // /people/@viewer/@friends
}).error(function(e) {
console.log(''+e);
});

opensocial-jquery は、すべてのリクエストを jQuery.ajax とショートカットで表現するため、上記のように gadgets.io.makeRequest と opensocial.DataRequest をまとめてリクエストできたりします。いずれかでエラーが発生すれば error メソッドに流れますので、エラーハンドリングも手軽です。

5 件のコメント:

naoto5959 さんのコメント...

はじめましてこんにちは、越川と申します。

いつもopensocial-jquery利用させていただいております。突然のコメント失礼します。

さて、下記の部分なのですが

nocache=1 のときは false となり、それ以外のときは true となります。nocache=1 のときは、自動的にキャッシュが無効になるため、明示的に jQuery.container.cache を使う機会は少ないかもしれません。

opensocial-jquery.jsの
L3852を見ると
cache: nocache == '1'
となっているので、逆の振る舞いをしてしまっているように見えます。

実際、nocache=1のときにmakeRequestの結果をcacheしていて気づきました。

もう、すでに認識されているようでしたら申し訳ないです!

それでは、ご確認ください、よろしくお願いします。

Unknown さんのコメント...

越川さん。なかじまんです。コメントありがとうございます。

$.container.cache が逆になっているの全く気が付いていませんでした。

完全な思い込みです。テストとその結果の見方も逆になってました。

さっそくですが、修正&テストして、リポジトリに 1.0.2a を格納しました。もしよろしかったら使ってください。

http://opensocial-jquery.googlecode.com/svn/trunk/features/opensocial-jquery/

ちょっと恥ずかしい感じですが、助かりました。今後ともよろしくお願いします。

naoto5959 さんのコメント...

なかじまんさん

越川です。対応ありがとうございます!

興味本位なのですが
makeRequestやproxyの部分の条件文で

opt_params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 0;

としないで

opt_params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 1;

とするのは何か理由があるんですか?

どちらにせよ、opt_params[gadgets.io.RequestParameters.REFRESH_INTERVAL] を短く設定してもmixiではキャッシュsれてしまうようです。。。

それでは今後ともよろしくお願いします。

Unknown さんのコメント...

gadgets.io.makeRequest のソースコードの中で、次のような箇所がありました。

if (httpMethod === "GET" && refreshInterval > 0) {

そのため、あえて 0 以上の 1 を指定しています。

mixi はキャッシュを無効にできないのですね(できなくなった?)。

jQuery.ajax の cache を使うと、リクエストパラメータにタイムスタンプを自動付与できるので、この振る舞いを使って、キャッシュを無効にできるかとも思います。

http://docs.jquery.com/Ajax/jQuery.ajax#options

naoto5959 さんのコメント...

なるほど、勉強になりました。
ありがとうございました。

jQuery.ajax の cacheも試してみます!