Google Wave API開発ガイド(前編)
株式会社鳥人間
郷田まり子
2009/10/1
プレビュー公開が始まったGoogle Wave「超」入門
株式会社鳥人間
郷田まり子
2009/10/1
投票Gadgetを作ってみた
以下のサンプル「投票Gadget」は、Wave参加者が賛成/反対に票を投じるというものです。
投じられた票をカウントし、投票した人のアイコンを並べます。後から気が変わったら票を入れ直すこともできます。
サンプルの「投票Gadget」 |
ボタンを含んだテーブルと、Waveオブジェクトを使用したJavaScriptを含んだXMLを書きます。
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="VoteGadget">
<Require feature="wave"/>
</ModulePrefs>
<Content type="html">
<![CDATA[
<table border="1" style="empty-cells:show;">
<!-- 投票ボタンの行 -->
<tr>
<td>賛成の人<input type="button" value="投票" onclick="vote(true)"/></td>
<td>反対の人<input type="button" value="投票" onclick="vote(false)"/></td>
<td>まだの人</td>
</tr>
<!-- 票数カウントの行 -->
<tr>
<td><span id="labelCountAgree"></span></td>
<td><span id="labelCountDisagree"></span></td>
<td id="labelCountNotyet"></td>
</tr>
<!-- 投票した人のアイコンを表示する行 -->
<tr>
<td id="agreeIcons"></td>
<td id="disagreeIcons"></td>
<td id="notyetIcons"></td>
</tr>
</table>
<script type="text/javascript">
var icons = {}; //ユーザーアイコンを保存しておくオブジェクト
// 初期化処理
function init(){
if (wave && wave.isInWaveContainer()) {
//State更新時の処理を登録
wave.setStateCallback(stateUpdated);
// 参加者の更新処理を登録
wave.setParticipantCallback(participantUpdated);
}
}
//初期化処理を登録する
gadgets.util.registerOnLoadHandler(init);
// 参加者情報が更新されたときの処理
function participantUpdated(){
var participants = wave.getParticipants(); // 参加者の配列を取得
for (var i = 0, l = participants.length; i < l; i++) {
var id = participants[i].getId();
// アイコンを更新、新しい参加者のアイコンは新たに生成する
var icon = icons[id] || document.createElement('IMG');
icon.src = participants[i].getThumbnailUrl();
// icons オブジェクトに登録
icons[id] = icon;
}
}
// 投票ボタンを押したときの処理
function vote(agree){
var state = wave.getState(); //Stateオブジェクトを取得
//Stateに、ユーザーIDをkey、賛否をvalueとして格納
state[wave.getViewer().getId()] = (agree) ? "agree" : "disagree";
//Stateの更新を送信
wave.getState().submitDelta(state);
}
//Stateが更新されたときの処理
function stateUpdated(){
var participants = wave.getParticipants(); // 参加者の配列を取得
var countAgree = 0;
var countDisagree = 0;
for (var i = 0, l = participants.length; i < l; i++) {
var id = participants[i].getId();
var icon = icons[id];
var cell;
//どのセルにアイコンを入れるかの判定、賛成者・反対者のカウント
if ('agree' == wave.getState().get(id)) {
cell = document.getElementById('agreeIcons');
countAgree++;
}else if ('disagree' == wave.getState().get(id)) {
cell = document.getElementById('disagreeIcons');
countDisagree++;
} else
cell = document.getElementById('notyetIcons');
cell.appendChild(icon); //アイコンを移動
}
// 賛成者・反対者の数を表示
document.getElementById('labelCountAgree').innerHTML= countAgree + '人';
document.getElementById('labelCountDisagree').innerHTML= countDisagree + '人';
}
</script>
]]>
</Content>
</Module>
まず、init関数の中で、State更新時と参加者更新時それぞれのコールバック関数をセットします。
// 初期化処理
function init(){
if (wave && wave.isInWaveContainer()) {
//State更新時の処理を登録
wave.setStateCallback(stateUpdated);
// 参加者の更新処理を登録
wave.setParticipantCallback(participantUpdated);
}
}
参加者に変更があったときは、参加者それぞれのアイコンを更新します。
// 参加者情報が更新されたときの処理
function participantUpdated(){
var participants = wave.getParticipants(); // 参加者の配列を取得
for (var i = 0, l = participants.length; i < l; i++) {
var id = participants[i].getId();
// アイコンを更新、新しい参加者のアイコンは新たに生成する
var icon = icons[id] || document.createElement('IMG');
icon.src = participants[i].getThumbnailUrl();
// icons オブジェクトに登録
icons[id] = icon;
}
}
投票ボタンを押したときには、 vote関数を呼びます。ここでStateオブジェクトの更新を行っています。Stateオブジェクトには、投票した人のIDをキー、賛否を値として登録します。そして、submitDeltaメソッドによって、Stateオブジェクトを送信します。
// 投票ボタンを押したときの処理
function vote(agree){
var state = wave.getState(); // State オブジェクトを取得
// State に、ユーザIDをkey、賛否をvalueとして格納
state[wave.getViewer().getId()] = (agree) ? "agree" : "disagree";
// State の更新を送信
wave.getState().submitDelta(state);
}
参加者の誰かがStateの更新を行うと、それは参加者全員に通知されます。参加者全員のクライアントサイドで、stateUpdated関数が呼ばれ、その中で、Stateから値を取得して票をカウントし、アイコンをしかるべき場所に移動させ、表が更新されます。
// State が更新されたときの処理
function stateUpdated(){
var participants = wave.getParticipants(); // 参加者の配列を取得
var countAgree = 0;
var countDisagree = 0;
for (var i = 0, l = participants.length; i < l; i++) {
var id = participants[i].getId();
var icon = icons[id];
var cell;
//どのセルにアイコンを入れるかの判定、賛成者・反対者のカウント
if ('agree' == wave.getState().get(id)) {
cell = document.getElementById('agreeIcons');
countAgree++;
}
else if ('disagree' == wave.getState().get(id)) {
cell = document.getElementById('disagreeIcons');
countDisagree++;
} else
cell = document.getElementById('notyetIcons');
cell.appendChild(icon); //アイコンを移動
}
// 賛成者・反対者の数を表示
document.getElementById('labelCountAgree').innerHTML = countAgree + '人';
document.getElementById('labelCountDisagree').innerHTML = countDisagree + '人';
}
これで、リアルタイム投票を行うGadgetができました。
1つのWaveに同じ種類のGadgetを複数埋め込むこともできます。その場合、Stateはそれぞれ別個のものとなるので、議題ごとに投票Gadgetを埋め込んでオンライン会議もできます。
次ページでは、Embed開発の基礎知識について解説します。
1-2-3-4 |
INDEX | ||
Google Wave API開発ガイド(前編) プレビュー公開が始まったGoogle Wave「超」入門 |
||
Page1 ついにプレビュー公開が始まった「Google Wave」とは Google Waveって結局、何ができるの? Waveの3つのカタチGadget、Robot、Embed |
||
Page2 Google Wave Gadget開発の基礎知識 |
||
Page3 投票Gadgetを作ってみた |
||
Page4 Google Wave Embed開発の基礎知識 今後次々と充実? Embed APIのこれから |
リッチクライアント&帳票 全記事一覧へ |
HTML5 + UX フォーラム 新着記事
- GASで棒、円、折れ線など各種グラフを作成、変更、削除するための基本 (2017/7/12)
資料を作る際に、「グラフ」は必要不可欠な存在だ。今回は、「グラフの新規作成」「グラフの変更」「グラフの削除」について解説する - GET/POSTでフォームから送信された値をPHPで受け取る「定義済みの変数」【更新】 (2017/7/10)
HTMLのフォーム機能についておさらいし、get/postメソッドなどの内容を連想配列で格納するPHPの「定義済みの変数」の中身や、フォーム送信値の取り扱いにおける注意点について解説します【PHP 7.1含め2017年の情報に合うように更新】 - PHPのfor文&ループ脱出のbreak/スキップのcontinue【更新】 (2017/6/26)
素数判定のロジックからbreak文やcontinue文の利点と使い方を解説。for文を使ったループ処理の基本とwhile文との違い、無限ループなども併せて紹介します【PHP 7.1含め2017年の情報に合うように更新】 - Spreadsheetデータの選択、削除、挿入、コピー、移動、ソート (2017/6/12)
Spreadsheetデータの選択、挿入、削除、コピー、移動、ソートに使うメソッドの使い方などを解説する
|
|