Upload
katsuyuki-seino
View
2.639
Download
4
Embed Size (px)
DESCRIPTION
Ajax基礎講座 Ajaxの基本およびプログラミングをjQuery等のライブラリを使用しない生のコードで解説しています。
Citation preview
1 Ajaxの概要 1.1 Ajaxの特徴 1.2 Ajaxを利用したWebアプリケーション例 2. Ajax初めてのプログラム 2.1 XHTMLでの画面定義 2.2 CSSでのスタイル指定 2.3 DOMモデルでのイベント処理 2.4 XMLHttpRequestで非同期通信 2.5 Ajax非同期通信でのデータ表示例 2.6 GET/POSTと同期/非同期の組み合わせパターン [PC実習] 非同期通信でのデータ表示画面作成 3. AjaxでのデータCRUD(登録・参照・更新・削除)処理 3.1 Ajaxでのマスタ登録画面作成方法 3.2 Ajaxでのマスタ参照画面作成方法 3.2 Ajaxでのマスタ更新画面作成方法 [PC実習] Ajaxでのマスタ登録画面作成 Ajaxでのマスタ参照画面作成
基礎編 目次
2
4. Prototype.jsのAjaxフレームワーク 4.1 Ajax.Requestでの非同期通信 4.2 Ajax.Updaterでの非同期通信 4.3 Periodical.Updaterの非同期通信 [PC実習] Ajax.Requestでのマスタ参照画面修正 Ajax.Updaterでのマスタ登録画面修正 4.4 Form.serializeでの登録機能 4.5 $()関数とイテレータでの参照機能 [PC実習] Form.serializeでのマスタ参照画面修正 $()関数とイテレータでの参照画面修正 5.フォームコントロールへのAjax適用 5.1 Ajaxでのラジオボタン処理 5.2 Ajaxでのチェクボックス処理 5.3 Ajaxでのプルダウンメニュー処理 [PC実習] 参照画面をプルダウンメニュー検索に変更 6. .XMLとスタイルシートを使用したデータ交換と操作 6.1 XMLデータ受信での画面表示 6.2 XMLとスタイルシート受信での画面表示 6.3JSONデータ受信での画面表示 6.4XMLデータ受信JSON変換でのデータ表示
3
Ajaxとは
4
Ajax(Asynchronous JavaScript + XML)=A New Approach to Web Applications 2005年2月18日 adaptive pathの Jesse James Garrett のエッセイに初登場
http://www.adaptivepath.com/publications/essays/archives/000385.php
Ajaxの始まり
5
1.XHTMLとCSSを利用したWeb標準での画面構成にする。 standards-based presentation using XHTML and CSS; 2.DOMを使用してイベントでの相互作用と動的な画面表示を行う。 dynamic display and interaction using the Document Object Model; 3.XMLとXSLTを使用したデータ交換と操作を行う。 data interchange and manipulation using XML and XSLT; 4.XMLHttpRequestを使用し非同期でサーバとのメッセージ交換を行う。 asynchronous data retrieval using XMLHttpRequest; 5.JavaScriptによって総ての機能を統合する。 and JavaScript binding everything together.
By:Jesse James Garrett
Adaptive path
Ajaxの定義
Ajax命名者のJesse James Garrettによる
6
Web
GUI
Ajaxモデルでの処理の流れ
JavaScript (Ajaxエンジン)
⑤ 演算処理 ④ 表示制御
サーバ
① イベント処理
② サーバ通信
③ UI表示 XHTML+CSS ・XHTML 画面構成 ・CSS 表示制御
・テキストデータ ・XMLデータ
GET/POST
DOM
7
MODEL
VIEW
CONTROLLER
XML
DB プレゼンテーション
Web UI
AjaxモデルでのWebシステム (SPI=Single Page Interface)
Webクライアント CGI系プログラム
ビジネスロジック
ユーザPC サーバサイド
データアクセス
Ajaxエンジン
Webブラウザ
GET/POST
テキスト XML
データストア
XHR
8
DB
データアクセス
ビジネスロジック
プレゼンテーション
Web
UI-1
従来モデルでのWebシステム (MPI=Multi Page Interface)
Web
UI-2
ユーザPC サーバサイド
HTML画面
GET/POST
9
C/Sクライアント
汎用機ダム端末
Ajaxクライアント
Webクライアント
UIリッチ度
ネットワーク・管理
SOAP
REST
ライブラリ
W3C
UI機能の変遷
10
使用されるソフトウエア技術=Web標準
Ajaxを構成する要素技術は、ほぼ総てがW3C勧告準拠
⇒プラグイン等の設定なして動作可能 ⇒将来の永続的サポートが保障される
[W3C = World Wide Web Consortium]
WWWで利用される技術の標準化をすすめる団体。WWW技術に関わりの深い企業、 大学・研究所、個人などが集まって、1994年10月に発足した。 W3Cの設立には マサチューセッツ工科大学(MIT)やWWWが開発された欧州合同素粒子原子核研究 機構(CERN)などが大きな役割を果たしている。現在では、 ・マサチューセッツ工科大学計算機科学研究所(MIT/LCS)、 ・フランス国立情報処理自動化研究所(INRIA)、 ・日本の慶應義塾大学SFC研究所(Keio-SFC) がホスト機関としてW3Cを共同運営している。 なお、2003年1月にはこのうちINRIAがホストから抜ける予定で、INRIAに代わって 欧州情報処理数学研究コンソーシアム(ERCIM)が欧州からのホスト機関として参加 する。ERCIMはINRIAやFraunhofer-Gesellschaftなど、欧州各国の研究機関からな る組織。
11
Ajax適用の 代表的サイト
12
Ajax適用の代表的サイト
コンシューマ向けサイト ・Ajaxの代表サイトとされるコンシューマサイト Googleマップス、Googleインクリメンタルサーチ ・DynamicHTMLとの類似 画像ファイルのダウンロード ・マッシュアップ(Web2.0) ・既存ソフトとの機能融合(相乗効果)
13
1) Netflix http://www.netflix.com/BrowseSelection?lnkctr=nmhbs
⇒AjaxとDynamicHTMLの境界
14
2) Googleマップ http://maps.google.co.jp/
⇒Ajaxの通信方式を使わない代表的Ajaxサイト
15
3) Googleサジェスト http://www.google.co.jp/webhp?complete=1
⇒典型的なAjax手法を適用したサイト:インクリメンタル検索
16
4) map.rails2u.com http://map.rails2u.com/
⇒Ajax手法の組み合わせ : マッシュアップ
[マッシュアップ] 複数の異なる提供元の技術 やコンテンツを複合させて 新しいサービスを形作ること
17
5) Ajaxでの日本語入力 http://chasen.org/~taku/software/ajax/ime/
⇒Ajaxと既存アプリの組合せ - 日本語入力機能のないOSから日本語入力
18
Ajaxサンプル 業務アプリケーションのRIA化
仕訳データ入力 UI操作性の向上とプラットホームとしてのWeb
19
20
部品構成表示 再帰呼び出し関数内からの非同期通信
電子商取引システムへのAjax適用
クラス1項目
クラス3項目
クラス2項目
商品
テーブル
ユーザ画面 データベース 管理者画面
登録
登録
登録
登録
参照・更新・削除
参照・更新・削除
参照・更新・削除
Ajax適用
Ajax適用
電子商取引 サイト
全項目
参照・更新・削除
21
22
クラス1項目
クラス2項目
クラス3項目
商品マスタ
電子商取引サイトでの商品表示-操作手順
[大分類]
[中分類]
[小分類]
[商品]
画面ロード
イベント
クリック
クリック
クリック
23
電子商取引サイト画面
24
電子商取引サイト商品情報登録画面
25
Webスプレッドシート応用事例
26
Webスプレッドシートでのグラフ表示例
27
受注情報登録画面のRIA化
28
受注情報登録とコールバック表示(1)
29
受注情報登録とコールバック表示(2)
Ajax
プログラミング
30
[1]Ajax初めてのプログラム
従業員番号から氏名表示
[操作手順] 1.従業員番号入力 ↓ 2.カーソル移動 ↓ 3.従業員氏名表示
31
デ―タ表示
①
② ③
④
XMLHttpRequest
DOM API
イベントハンドラ ①HTML画面からのイベント発生
↓
②XMLHttpRequestでサーバへの
HTTPリクエスト発行
↓
③サーバでのデータアクセス処理等
↓
④サーバからのデータ送信と
XMLHttpRequestでの受信 ↓
⑤DOM APIへの受信データセット
と表示
XHTML
JavaScript
⑤
⑤
サーバ側
プログラム DB
Ajax初めてのプログラム 処理フロー
テキスト
ファイル
Ajax処理フロー
32
[1] XHTML書式でのフォーム作成とスタイル指定 <?xml version="1.0" encoding=“utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns=“http://www.w3.org/1999/xhtml” xml:lang=“ja”> <head> <title>従業員番号から氏名表示</title> <script type="text/javascript" src="../lib/funcs.js"></script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示</h3> <table align="center"> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html>
Ajax初めてのプログラム – プログラム作成手順
33
<script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function xhrFunc(){ } function initOnLoad(){ } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示</h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" id="emp_no " /></td> <td>従業員氏名:<input type="text" id="emp_name " /></td> </tr> </tbody> </table> </div> </body> </html>
[2] イベントリスナと関数スケルトン記述
34
[3] イベントリスナの設定
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ //非同期通信処理 } function initOnLoad(){ var observer = document.getElementById("emp_no"); //ID値emp_noのノードオブジェクト(INPUTタグ)を変数observerにセット。 setListener(observer, “blur”, xhrFunc); //observerノードのフォーカス移動イベントで関数initOnLoadを呼び出す。 document.getElementById("emp_no").focus(); //ID値emo_noのフィールドにフォーカスを移動する。 } setListener(window, "load", initOnLoad); //画面ロード完了イベントで関数initOnLoadを呼び出す。 //]]> </script>
35
[4] サーバへ非同期リクエストを送る(GET/非同期)
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; // ID値emp_no(INPUTタグ)のキー入力値を変数emp_noにセット。 var xhrObj = getXhrObj(); //非同期通信(XMLHttpRequest)オブジェクトを生成 xhrObj.open("get", "getUniq.php?emp_no="+emp_no); //サーバとの通信をGET/非同期でオープン xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); //キャッシュ回避 //指定時刻以降に更新があった場合はその内容を返す。そうでなければ //304 (Not Modified) を返し、リソースの内容は返さない。 ==== 受信処理 ==== xhrObj.send(null); //リクエストの送信 } //リスナ設定 //]]> </script>
36
function getXhrObj() { var xhrObj; if (window.XMLHttpRequest) { try { xhrObj = new XMLHttpRequest(); } catch (e) { xhrObj = false; } }else if (window.ActiveXObject){ try { xhrObj = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){ try { xhrObj = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E){ xhrObj = false; } } } return xhrObj; }
XMLHttpRequestオブジェクトの生成 ファイル名:funcs.js
function getEmpName(){ var xhrObj = getXhrObj(); :
37
[5] データ受信と表示(GET/非同期)
function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("get", "getUniq.php?emp_no="+emp_no); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.onreadystatechange = function(){ //readyStateの値が変更のたびに右辺の匿名関数を呼び出す if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ //readyStateが4、statusが200でサーバからのレスポンス受信完了 var emp_name = xhrObj.responseText; //レスポンスデータ(従業員氏名)を変数emp_nameにセット document.getElementById("emp_name").value = emp_name; //従業員指名をID値emp_nameの入力(INPUT)フィールドに表示 } } } xhrObj.send(null); }
38
39
<?php
$emp_no = $_GET[“emp_no”];
$fp = fopen(“empfile.txt”, “r”) or die(“OPENエラー”);
while($data = fgets($fp)){
if(strncmp($data, $emp_no, 5) == 0){
echo substr($data, 5);
break;
}
}
fclose($fp);
?>
GETメソッドでのPHP
① PHPコード記述は <?php で始まり ?> で終わる ② Ajaxではタグ記述部分は(一般に)使用されない。 ③ 基本シンタックスはC言語に類似 ④ 変数名は先頭に$を付ける ⑤ Ajaxクライアント(GETメソッド)からの送信データは $_GET[“送信パラメータ名”] で受信
[6] サーバ側スクリプト(PHP)
A0001山田太郎 A0002鈴木健児 A0003田中佳子 A0004佐藤弘明 A0005伊藤弘志
empfile.txtファイル
40
<?php //PHPコード記述の開始
$emp_no = $_GET["emp_no"]; //変数名は先頭$で始める //GETメソッドでの送信データは$_GET[“送信パラメータ名”]で受信
$fp = fopen("empfile.txt", "r") or die("OPENエラー"); //テキストファイル“employee.txt”をREADモードでオープン
while($data = fgets($fp)){ //fgets($fp) は$fpから行単位で読み取り変数$dataにセットする
if(strncmp($data[0], $emp_no, 5) == 0){ //最初の5文字がGET受信データと等しい場合条件成立
echo substr($data[0], 5); //5文字から後の名前部分をAjaxクライアントへ送信 break;
} } fclose($fp); //ファイルクローズ ?>
getUniq.php
41
<?php $emp_no = $_GET[“emp_no”];
$fp = fopen(“empfile.txt”, “r”) or die(“OPENエラー”);
while($data = fgets($fp)){
if(strncmp($data, $emp_no, 5) == 0){
echo substr($data, 5);
break;
}
}
fclose($fp);
?>
POSTメソッドでのPHP postUniq.php
受信処理で $_GETが$_POSTに替わるだけ
42
PHP: Hypertext Preprocessor Apacheモジュールとして動作するスクリプト言語とその実行環境 1994年秋、Rasmus Lerdorf(グリーンランド⇒デンマーク) が作っていた Perlスクリプトを C言語で書き直し、HTMLフォームを扱える動的なWebアプリケーションのための機能 に拡張したのが始まりとされる。
PHP公式サイト http://www.php.net/
43
[PHPの特徴] (1)Webアプリケーション開発に特化した言語。 ・ CGI処理用の構文・変数等を装備 (2)文法が比較的容易に誰でも習得することができる。 ・基本シンタックスはC言語類似だが、より簡略化されている。 (3)インタープリタ言語でコンパイルの必要なし。 ・小回りが利き、短期開発に向いている。 (4)CGIと比較すると、実行速度が断然早い。 ・Apacheモジュールとして実行され、別プロセスを生成しない (5) 多くの拡張ライブラリをサポート ・PEAR (PHP Extension and Application Repository) ・CakePHP、Zend Framework など (6)どのような種類のデータベースとも接続可能。
Ajaxian.com 2007 Survey Results 出典: Ajaxian.com (http://ajaxian.com/)
44
PHPはAjaxとの組み合わせで最もよく使用される言語
45
従来モデル(Ajax以前)でのPHPプログラム例
<?php // クッキーのデータを削除する setcookie("cookie_id", "", time() - 1); ?> <html> <head> <title>クッキーを削除する</title> </head> <body> <?php // クッキーが削除されているかどうか調べる if (!isset($_COOKIE["cookie_id"])) { echo "<p>値はセットされていません"; } else { echo "<p>セットされている値".$_COOKIE["cookie_id"]; } ?> </body> </html>
従来モデルとAjaxモデルのサーバ 側プログラム比較 ・従来モデル ⇒HTMLタグを生成してSTDOUTに出力 ・Ajaxモデル ⇒テキスト文字列でSTDOUTに出力 ※非同期通信/同期通信でプログラムパターンは同じ。
1.GETまたはPOSTでパラメータ受信 2.データベースまたはファイルアクセス 3.演算処理(ビジネスロジック) 4.クライアントにテキスト(並び)送信
従来のCGI形式 プログラムと同じ
従来はHTML タグ生成
[Ajaxモデルサーバ側プログラム処理手順]
46
<?php
$class1_code = $_GET["class1_code"];
$server = "localhost";
$dbname = "ajax_ec";
$user = "mysql";
$passwd = "callback";
$sv = mysql_connect($server, $user, $passwd) or die("Connection Error1");
$db = mysql_select_db($dbname) or die("Connection Error2");
$sql = "select * from item_class1 where class1_code='$class1_code'";
$rows = mysql_query($sql, $sv) or die("mysql query Error");
$row = mysql_fetch_array($rows, MYSQL_ASSOC);
if($row>0){
$set = "OK:データ検索成功".”<i>";
$set = $set.$row["class1_name"].”<i>";
$set = $set.$row["class1_desc"].”<i>";
$set = $set.$row["class1_date"].”<i>”;
echo $set;
}else{
echo "データ検索不成功".",";
}
?>
PHPのAjaxサーバ 側プログラム例
※従来モデルと同じ 1.POST・GETパラメータ受信 2.データベースアクセス 3.演算処理(ビジネスロジック)
※従来モデルと異なる 4.クライアントにテキスト列送信
47 ※PHPでの文字列連結はドットで行う
Apache
PHP5 MySQL
FedoraCore5
(サーバ)
サンプルプログラムでのシステム構成
Webサーバ データベース
ブラウザ・クライアント
IE6/7 FireFox
Version2
Safari Version3
Opera Version9
48
テキストファイル
PHP
スクリプト
⇒Webアプケーションでの標準的なシステム構成
LAMP(Linux + Apache + MySQL + PHP)
1. XHTMLとCSSを利用したWeb標準での画面構成にする standards-based presentation using XHTML and CSS
XHTML/CSS
49
XHTML(Extensible HyperText Markup Language) - 画面構成定義
XHTML : HTMLをXMLに適合するように定義し直したマークアップ言語 仕様策定] W3C 策定目的] インターネットをはじめとしたオンラインでのデータの送受信 にXMLが使用されることを想定し、HTML文書もXML処理系で統一的 に扱える環境を整える XHTML1.0:2000年1月 W3C勧告 HTML 4.01をベース =>HTML 4.01に対応したWebブラウザではほぼ問題なく表示可能 XHTML1.1:2001年5月 W3C勧告 XHTML 1.1で文書見栄えを指定するタグが 廃止、(見栄えの記述は全てCSSで行なうことになった)など、 文書構造の記述に特化した言語へと変化の傾向 ※妥当な(valid)XHTML 1.1の要件は、文書型宣言が変わる(従って参照する DTDが変わる)以外は、基本的にXHTML 1.0の場合と同じ。
50
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE book [ <!ELEMENT book (computer*)> <!ELEMENT computer (title,page,price)> <!ELEMENT title (#PCDATA)> <!ELEMENT page (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <book> <computer> <title>XHTMLガイド</title> <page>240</page> <price>2,300</price> </computer> <computer> <title>JavaScriptガイド</title> <page>260</page> <price>2,500</price> </computer> </book>
XML宣言
DTD記述
XMLデータ
・整形式XML文書 -XML宣言:任意 -DTD:任意 -XMLデータ:必須
・検証済XML文書 -XML宣言:任意 -DTD:必須 -XMLデータ:必須
(1) XHTMLは検証済XML文書の書式に従う
51
(2) XHTML文書の適合要件
1. 提供されるDTD (Document Type Definition)に従い、 DOCTYPE(文書型)宣言を以下の形式で行う。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”> =>文書型宣言として、公開識別子で指定されたDTDを使用、ただし、公開識別 子でDTDが特定(所得)できなかった場合はURIで指定されたdtdを使用。 ※ DTD: XML文書の要素、属性、エンティティ、記法を宣言(定義)したもの。 2.文書のルート要素が html であること。 3.ルート要素は、xmlns属性でXHTML名前空間を明示すること。 ※名前空間: 文書内に複数ボキャブラリが存在する場合に、要素名、属性名 が重ならないようにその適用範囲(スコープ)を明示するための規格。 指定例] <html xmlns="http://www.w3.org/1999/xhtml">
52
XHTML文書の適合要件
4. 全てのタグ(要素タイプ名、属性名)は小文字で記述する 5. 属性の値は必ず引用符で囲む × width=100 => 〇 width="100" 6. 終了タグを省略しない × <ul><li>甲項目</ul> => 〇 <ul> <li>甲項目</li> </ul> 7. 空要素のタグは />で閉じる × 部署:<input type="text" name=“section" id=“section"> 〇 部署:<input type="text" name=“section" id=“section" /> 8. ファイル内の位置を示すにはid属性を併記する × <a href="#foo">アンカーをクリックすると</a> .... <a name="foo">ここにジャンプする</a> 〇 <a href="#foo">アンカーをクリックすると</a> .... <a name=“foo” id=“foo”>ここにジャンプする</a>
53
9. &はあらゆるところで&と記述する × <a href="/cgi-bin/myscript?name=kanzaki&score=100"> 〇 <a href="/cgi-bin/myscript?name=kanzaki&score=100"> 10.属性の省略書式は使わない ×<input type="radio" name="bar" checked> 〇<input type="radio" name="bar" checked="checked" /> 11. head要素内のスクリプトやスタイルシートの注意 < はタグの開始と見なされ、コメントした内容は無視される ×<style type="text/css"> <!-- p {color:red} --> </style> 解決策:外部ファイルにスタイルシートやスクリプトを記述 12.言語コードの指定にxml:lang属性を用いる <p lang=“jp” xml:lang=“jp”>今日は</p> 注:XHTML 1.1ではlang属性は廃止され、xml:lang属性のみを記述
XHTML文書の適合要件
54
CSS (Cascading Style Sheets) - スタイル定義 CSS:スタイルシートを記述する為の言語仕様の1つ ※スタイルシート:Webページのレイアウトや整形方法を指定する整形言語 =>文書の表現方法の指定に特化した構文の集合体
仕様策定] W3C、現在CSS1(第1版)とCSS2(第2版)が正式に勧告されている。
策定目的] 文字のサイズやフォント、背景色や行間の大きさなどの 見栄えに関する情報を文書本体から切り離し、ユーザが複数の レイアウトから選択することができるようにする。
CSS1:W3C勧告 1996年12月17日、 改定1999年1月11日 単純なスタイル構造(構造化文書に対してフォント,色と背景,スペーシング,テキストの装飾,ボーダー,
マージンやパディング,といったスタイルを与えることができる)を定義した最初のCSS仕様。
CSS2: W3C勧告 1998年05月12日
HTML用として制定されたCSS1をXMLでも利用できるように機能拡張,CSS1の全機能が含まれる。
メディアタイプ依存のスタイルシートに対応しており,グラフィカルなブラウザ,音声出力装置, 点字出力装置,プリンタ,小型情報機器など,多様な出力を想定したスタイル設定が可能 CSS3:CSS2の次世代仕様
モジュール化(機能や役割ごとに仕様書が細分化)されており,複雑化してきたスタイルシートの各
機能の関係を明確にし,部分的な実装を容易にし,更に新しい機能を導入し易くなるという,メリットが
期待される。
55
(1) CSSの基本書式
[タイプ1] 要素名 {プロパティ:値 [;プロパティ:値 [… …]]} 要素名 {プロパティ:値 [;プロパティ:値 [… …]]} 例] td {font-size:18px; font-weight:600; color:#aa0000} [タイプ2] 要素名.クラス名 {プロパティ:値 [;プロパティ:値 [… …]]} 要素名#ID名 {プロパティ:値 [;プロパティ:値 [… …]]} 例] td#title {font-size:18px; font-weight:600; color:#aa0000} td.title {font-size:18px; font-weight:600; color:#aa0000} [タイプ3] .クラス名 {プロパティ:値 [;プロパティ:値 [… …]]} #ID名 {プロパティ:値 [;プロパティ:値 [… …]]} 例] #title {font-size:18px; font-weight:600; color:#aa0000} .title {font-size:18px; font-weight:600; color:#aa0000}
56
<div style="background:lightblue; color:blue;"> 背景の色を水色に、<br> 文字色は青にしています。 </div>
(2) CSSの指定方法
1.XHTMLタグに直接スタイルを設定する。
特定の箇所にのみスタイルを設定する場合に使用 => 非推奨
例
57
<html> <head> <meta http-equiv="Content-Style-Type" content="text/css"> <title>HTMLヘッダで宣言する</title> <style type=“text/css”> <!—
h1 {font-size: 24px; font-family: sans-serif; font-weight:700; color:#990000 } h2 {font-size: 20px; font-family: sans-serif; font-weight:600; color:#aa0000 } span.data1 {font-size: 16px; font-family: serif; font-weight:500; color:#000099 } #data2 {font-size: 14px; font-family: serif; font-weight:400; color:#0000aa } --> </style> </head> <body> : <h1>レベル1のタイトル</h1> <h2>レベル2のタイトル</h2> <span class=“data1”>レベル1のデータ</span> <span id=“data2”>レベル2のデータ</span>
: </body> </html>
2. HTMLヘッダ内で宣言する
58
<head> <meta http-equiv="Content-Style-Type" content="text/css"> <title>外部CSSファイルを読み込む </title> <link rel=“stylesheet” type=“text/css” href=“../lib/style.css”> </head> <body> <h1>レベル1のタイトル</h1> <h2>レベル2のタイトル</h2> <span class=“data1”>レベル1のデータ</span> <span id=“data2”>レベル2のデータ</span> </body> </html>
3. 外部CSSファイルを読み込む
CSSファイル:style.css h1 {font-size: 24px; font-family: sans-serif; font-weight:700; color:#990000 } h2 {font-size: 20px; font-family: sans-serif; font-weight:600; color:#aa0000 } span.data1 {font-size: 16px; font-family: serif; font-weight:500; color:#000099 } #data2 {font-size: 14px; font-family: serif; font-weight:400; color:#0000aa }
59
<script type="text/javascript"> //<![CDATA[ : var node = document.getElementById(“div1”); node.style.fontSize = “36px”; node.style.backgroundColor = “#ffaaaa”;
: //]]> </script> </head> <body> : <div id=“div1”>スタイル指定</div>
4. JavaScript内で直接指定する
document.getElementById(“div1").style.fontSize = "20px"; document.getElementById(“div2").style.fontWeight = "bold"; document.getElementById(“div3").style.color = "red"; document.getElementById(“div4").style.fontStyle = "italic"; document.getElementById(“div5").style.background = "#ccddee";
document.getElementById() でタグを取得し、styleプロパティで変更する。
60
CSSの書式-1: 参考情報
プロパティ名 機能 対応
background 背景のプロパティの一括指定 IE4NN4
background-color 背景色を指定する IE4NN4
background-image 背景画像を指定する IE4NN4
background-attachment 背景画像のスクロール方法を指定する IE4NN6
background-position 背景画像の開始位置を指定する IE4NN6
background-repeat 背景画像のリピート方法を指定する IE4NN4
font フォントのプロパティの一括指定 IE4NN6
font-weight フォントの強調を指定する IE4NN4
font-variant フォントの小文字を大文字にする IE4NN6
font-style フォントの斜体(イタリック)表示を指定する IE4NN4
font-size フォントサイズを指定する IE4NN4
font-family フォントの種類を設定する IE4NN6
line-height 行間幅を指定する IE4NN4
text-transform テキストの大文字小文字を指定する IE4NN6
text-decoration テキストにアンダーライン、打消し線等を指定する IE4NN4
text-align 文字の左寄せ右寄せ、センタリングを指定する IE4NN4
text-indent テキストのインデント幅を指定する IE4NN4
letter-spacing 文字間の幅を指定する IE4NN6
Color テキストの色を指定する IE4NN4
float 文字の回り込みの設定 IE4NN6
clear 文字の回り込みを解除する IE4NN6
width ボックスの横幅を指定する IE4NN4
Height ボックスの縦幅を指定する IE4NN6
61
CSSの書式-2:
プロパティ名機能対応
border ボックスの枠線プロパティの一括指定 IE4NN4
border-style ボックスの枠線の形状を指定する IE4NN4
border-width ボックスの枠線の太さを指定する IE4NN4
border-color ボックスの枠線の色を指定する IE4NN4
margin ボックス外部の余白幅を指定する IE4NN4
padding ボックス内部の余白幅を指定する IE4NN4
overflow ボックスに入りきらない表示の表示方法を指定する IE4NN6
list-style リストのプロパティの一括指定 IE4NN4
list-style-image リストの見出しにグラフィックを指定する IE4NN6
list-style-type リストの見出し記号を指定 IE4NN4
list-style-position リスト項目の二行目以降のインデントを指定する IE4NN6
cursor カーソルの形状を指定する IE4NN6
position topとleftの指定方法を決める IE4NN6
left 左端からの位置を指定する IE4NN4
top 上からの位置を指定する IE4NN4
vertical-align 縦方向の位置を指定する IE4NN6
clip 表示をどこで切り取るかを指定する。 IE4NN6
z-index z-indexを指定する IE4NN6
visibility 可視不可視を指定する IE4NN6
display どの要素としての表示かを指定する IE5NN4
page-break-before 印刷のとき、その前で改ページするようにする IE4NN6
page-break-after 印刷のとき、その後で改ページするようにする IE4NN6
62
2. JavaScriptによって総ての機能を統合する and JavaScript binding everything together.
JavaScript
63
(1) Ajax動作環境の統合=JavaScript
JavaScript:ECMAScript(エクマスクリプト)準拠の処理系で、Webブラウザ などでの利用に適したスクリプト言語(簡易プログラミング言語)。 仕様策定] ECMA(European Computer Manufacturer Association) ヨーロッパ電子計算機工業会 策定目的] 静的な表現しかできなかったWebページに、動きや対話性を付加 することを目的に開発され、主要なWebブラウザのほとんどに搭載されている。 ・元々Sun Microsystems社とNetscape Communications社が開発した、 JavaScriptをベースに後付けで仕様策定されており、各社の実装に微妙な違い がある。 ・現在はECMAScript準拠の処理系をJavaScriptと呼び、独自の拡張を施した JavaScriptには独自の名称を付けている。 -Microsoft: JScript -Macromedia:ActionScript
64
<html> <head> <title>….</title>
</head> <body> : <script type="text/javascript"> : alert(“Hello World”); //処理内容
: </script> : </body> </html>
JavaScript – head、bodyタグ内に直接記述
65
<html> <head> <script type="text/javascript"> function func1(arg1,..){ : alert(“Hello world”); //処理コード
: } : </script> </head> <body> : <input type="text" name="ev1" onclick=”func1(arg1,..);" />
: </body> </html>
JavaScriptイベント処理 - イベントハンドラを使用
66
<html> <head> <script type="text/javascript" src=“../lib/funcs.js"></script> <script type="text/javascript" src=“../lib/prototype.js"></script>
<script type="text/javascript"> //<![CDATA[ function xhrFunc() { alert(“Hello world”); //処理内容
} function initOnLoad() { var observer = document.getElementById(“ev1”);
setListener(observer, "click", xhrFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> : <button type="button" name=“ev1” id="ev1">クラス1表示</button>
: </body> </html>
JavaScriptイベント処理 - イベントリスナを使用
67
ハンドラ名 内容
onClick マウスがクリックされた際に発生 onSelect 入力フィールドの選択、あるいは入力フィールドにある 文字列をドラッグしたときに発生 onChange 選択メニューでの選択項目やテキスト入力欄の文字列 が変更されたときに発生 onMouseover マウスカーソルが、ある要素の上にきたときに発生 onKeyup 押下されたキーが開放されたときに発生 onFocus リンクや入力フィールドがフォーカス (選択) されたとき に発生 onBlur 入力フィールドでフォーカスが他に移動したときに発生 onResize ウィンドウサイズが変更されたときに発生 onSubmit 送信(サブミット)ボタンが押されときに発生 onReset 取消(リセット)ボタンが押されたときに発生 onAbort 処理を中断したときに発生 onLoad ページが読み込まれたときに発生 onUnload リンククリックなどによって、今いるページから移動した ときに発生
(3) イベントハンドラの種類
68
2 その他のイベント
[ウィンドウイベント] onActivate 要素がアクティブになったときに発生 onDeactivate 要素がアクティブでなくなったときに発生 onCloseQuery ウィンドウを閉じるときの確認で発生 onDblClick キーボードやマウスなどが「ダブルクリック」されたときに 発生 onFileDrop ファイルがエクスプローラなどからウィンドウにドロップ されたときに発生 onKeyDown キーが押下されたときに発生 onKeyPress キーが押されているときに発生 onMouseDown マウスボタンが押されたときに発生 onMouseEnter マウスが領域内に入ってきたときに発生 onMouseLeave マウスが領域内から出ていったときに発生 onMouseMove マウスカーソルが移動したときに発生 onMouseUp マウスボタンが離れたときに発生 onMouseWheel マウスホイールが回転したときに発生 onPopupHide ポップアップウィンドウを閉じたときに発生 [タイマイベント] setTimeout 一定時間後に指定した処理を行う clearTimeout setTimeoutを解除する setInterval 一定時間ごとに繰返し指定した処理を行う clearInterval setIntervalを解除する 69
XMLHTTPRequestを使用し非同期でサーバとのメッセージ交換を行う asynchronous data retrieval using XMLHttpRequest
[6]非同期通信(XHR)
70
XMLHttpRequestによる送受信フロー(非同期通信)
データ
受信
DOM APIでの動的表示
リクエスト
送信
•
(1) XMLHttpRequest オブジェクトの生成
↓
(2) open メソッド
(GET/POST、リクエスト先URL、非同期指定)
↓
(3) setRequestHeaderメソッド (注1) POSTの場合のみ ↓
(4) send メソッド (注2) GETの場合null送信 (データ送信)
↓
【サーバ処理 】
↓
(5) onreadystatechange プロパティ
送受信状態(readyState)の変化時に関数起動
↓
(6) readyStateとstatusプロパティ
(データ受信正常終了をチェック)
↓
(7) responseTextまたはresponseXML プロパティ
データの受信処理(テキストデータまたはXMLデータで受信)
71
XMLHttpRequest による送受信フロー(同期通信)
DOM APIでの動的表示
データ
受信
リクエスト
送信
•
(1) XMLHttpRequest オブジェクトの生成
↓
(2) open メソッド
(GET/POST、リクエストURL、同期指定) ↓
(3) setRequestHeaderメソッド (注1) POSTの場合のみ ↓
(4) send メソッド (注2) GETの場合null送信 (データ送信)
↓
【サーバ処理 】
↓
(5) responseTextまたはresponseXML プロパティ
データの受信処理(テキストデータまたはXMLデータで受信)
72
XMLHttpRequest による送受信フロー(同期通信)
DOM APIでの動的表示
データ
受信
リクエスト
送信
•
(1) XMLHttpRequest オブジェクトの生成
↓
(2) open メソッド
(GET/POST、リクエストURL、同期指定) ↓
(3) setRequestHeaderメソッド (注1) POSTの場合のみ ↓
(4) send メソッド (注2) GETの場合null送信 (データ送信)
↓
【サーバ処理 】
↓
(5) responseTextまたはresponseXML プロパティ
データの受信処理(テキストデータまたはXMLデータで受信)
73
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("get", "getUniq.php?emp_no="+emp_no); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.onreadystatechange = function(){ if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } } } xhrObj.send(null); } //]]> </script>
GET/非同期方式
74
<script type="text/javascript"> //<![CDATA[ var xhrObj = getXhrObj(); function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; xhrObj.open("get", "sample1.php?emp_no=" + emp_no); xhrObj.send(null); xhrObj.onreadystatechange = xhrResp; } function xhrResp(){ if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } } } //]]> </script>
GET/非同期-関数名指定での受信処理
75
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("post", "postUniq.php"); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhrObj.onreadystatechange = function(){ if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } } } xhrObj.send("emp_no="+emp_no); } //]]> </script>
POST/非同期方式
76
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("get", "getUniq.php?emp_no="+emp_no, false); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.send(null); var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } //]]> </script>
GET/同期方式
77
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("post", "postUniq.php", false); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhrObj.send("emp_no="+emp_no); var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } //]]> </script>
POST/同期方式
78
Ajax演習-1
従業員番号から氏名表示 ・GET/POSTと非同期/同期の合計4種類の非同期通信 組み合せを自分のディレクトリから動作確認して下さい。 ・関数名指定でのGET/非同期を動作確認して下さい。
※この演習は演習環境の動作確認チェックにもなってい ます。ftpクライアント設定、エディタでの文字コード指定 (UTF-8)も確認して下さい。 ※PHPの場合、クライアントPOST送信の場合はサーバ側PHPもPOST受信に変更が必要
79
80
Ajax演習-1 動作確認ファイル類
・ディレクトリ sample ・GET/非同期 getAsyn.htm getUniq.php ・別関数 getAsyn2.htm 同上 ・GET/同期 getSyn.htm 同上 ・POST/非同期 postAsyn.htm postUniq.php ・POST/同期 postSyn.htm 同上 ・データファイル employee.txt
XMLHttpRequestオブジェクト
responseTextプロパティ
書式] readonly String responseText 機能] リクエストに対する応答をテキスト形式で返す。 リクエストが不成功の場合、または未完了の場合はNULLが返される。 例] xhrObj.onreadystatechange = function() { if (xhrObj.readyState == 4) } if (xhrObj.status == 200) { var resp = xhrObj.responseText; document.getElementById("status").innerHTML = resp;
} } }
81
単一テキストの場合
データベース検索結果の表示
(単一レコード、複数アイテム)
var items = xhrObj.responseText.split(“<i>"); for(var i = 0; i < (items.length – 1); i++ ){ : // items[i] のデータ項目処理 : : }
82
配列変数 = XHRオブジェクト.responseText.split(区切文字)
※ 変数itemsは配列になる。 ※ 区切文字はCSV(,)以外にも任意の文字を指定可能 例] split(“<r>”) ->レコード区切り split(“<i>”) ->アイテム区切り
データベース検索結果の表示 (複数レコード、複数アイテム)
var recs = xhrObj.responseText.split("<r>"); for(i = 0; i < recs.length; i++ ){ var items = recs[i].split("<i>"); for(j = 0; j < items.length; j++ ){ : //xhtmlタグ作成 : } } document.getElementById("area1”).innerHTML = out; //outは作成されたxhtmlタグ構成
83
従来モデルWebシステム
AjaxモデルWebシステム
従来モデルとAjaxモデルでのMVC機能配置
HTML-FORM
(jsp) Java-Servlet
(class)
DB Java-Beans
(class)
Data-View
(jsp)
HTML
(html)
Ajax
(js)
Java-Servlet
(class) Java-Beans
(class) DB
model
model view
view
controller
controller
84
GET/非同期(Java Servlet+Beans)
<script type="text/javascript"> //<![CDATA[ function xhrFunc(){ var emp_no = document.getElementById("emp_no").value; var xhrObj = getXhrObj(); xhrObj.open("get", "../sem1svlt?mode=rev&emp_no="+emp_no); xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT"); xhrObj.onreadystatechange = function(){ if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ var emp_name = xhrObj.responseText; document.getElementById("emp_name").value = emp_name; } } } xhrObj.send(null); } //]]> </script>
85
86
package seminar1; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class sem1Svlt extends HttpServlet { private static final long serialVersionUID = 4L; public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ req.setCharacterEncoding("utf-8"); res.setContentType("text/html; charset=utf-8"); PrintWriter out; out = res.getWriter(); String mode = req.getParameter("mode"); sem1Bean sem1 = new sem1Bean(); if(mode.equals(“rev")){ String emp_no = req.getParameter("emp_no"); String resp = sem1.getEmpName(emp_no); } out.println(resp); out.flush(); out.close(); }
sem1Svlt.java
package seminar1; import java.io.*; public class sem1Bean { String inPath = "/usr/local/tomcat5/apache-tomcat-.5.20 /webapps/dwr2/WEB-INF/classes/seminar1/employee.txt"; public String getEmpName(String emp_no){ String empData = "", empNo = "", empName = ""; try { File inFile = new File(inPath); FileReader in = new FileReader(inFile); BufferedReader inBuffer = new BufferedReader(in); while ((empData = inBuffer.readLine()) != null) { empNo = empData.substring(0, 5); if(empNo.equals(emp_no)){ empName = empData.substring(5); break; } } inBuffer.close(); } catch (IOException e) {} return empName; } }
sem1Bean.java
87
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> : : <servlet-mapping> <servlet-name>sem1svlt</servlet-name> <url-pattern>/sem1svlt</url-pattern> </servlet-mapping> </web-app>
web.xml(デプロイメント・デスクリプタ)
88
XMLHttpRequest :サーバとの非同期通信機能
XMLHttpRequest: JavaScript/JScript の HTTP 通信のためのオブジェクト。 ・非同期通信を行うため、リロードなしでサーバ側と連携した状態遷移が実現できる。 ・レスポンスが well-formed な XML 文書の場合は DOM を用いたアクセスもできる。 ※標準ではなく Microsoft Internet Explorer の独自拡張だったが、その後他の ブラウザが追随してデファクトスタンダードと呼べる状態になりつつある。 仕様策定] デファクトスタンダード ->W3Cワーキングドラフト(2006/4/5) 策定目的] Webクライアントとサーバ間の非同期通信を可能にする。
ブラウザのサポート状況
・Microsoft Internet Explorer 4.0以降 ・Mozilla Firefox 1.0以降 ・Netscape 7以降 ・Opera 7.6 以降 ・Safari 1.2以降 ・Konqueror 3 以降
XHR(XMLHttpRequest)のメソッド/プロパティ
89
XMLHttpRequestオブジェクト
openメソッド
書式] void open ( String メソッド , String サーバアドレス [,boolean 同期/非同期 [, String ユーザ名 [,String パスワード]]] ) 機能] 送信先アドレス、送信方式等を指定し、リクエストを初期化する。 引数] 通信メソッド : HTTPメソッド指定 - “POST” または “GET“ URL が HTTP URLでない場合は無視される。 サーバアドレス:リクエスト送信先のURLを指定. 同期/非同期 :(オプション) 非同期:true, 同期:false (省略時は非同期) ユーザ名 :(オプション) ユーザ名を指定 パスワード :(オプション) パスワードを指定 ※XMLHttpRequestがリクエストを送信できるのは同一ドメイン内に制限される。 ※URLはopen実行スクリプトファイルのダウンロード元から相対アドレスで指定可。 ※asyncで非同期指定の場合:sendメソッドは即座に処理を返し、その後は onreadystatechangeイベントの中で読み込み状況を確認する。 同期指定の場合リソースを所得し終えるまで処理を返さない (クライアント側はロックされる)。
例] xhrObj.open( “get” , “./foo/bar1.php” , true ); xhrObj.open( “post” , “./foo/bar2.php” , false ); 90
XMLHttpRequestオブジェクト
(2) setRequestHeaderメソッド
書式] void setRequestHeader ( String ヘッダ , String 値 ) 機能] HTTPリクエストに対する、HTTPリクエストヘッダ. 引数] ヘッダ: 送信するヘッダの名前 値 : ヘッダのボディ
例] //openでPOST指定の場合、sendでの送信実行前に指定。 xhrObj.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”); //キャッシュ回避で、sendでの送信実行前に指定。 xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT");
91
XMLHttpRequestオブジェクト
(3) sendメソッド
書式] void send ( variant ボディ ) 機能]リクエストを送信する。 リクエストが非同期の場合はリクエスト送信後直ちに、処理が戻る。 リクエストが同期の場合は、応答が帰ったあとに、処理が戻る。 引数] body:DOMドキュメントのインスタンス、文字列、inputストリーム
※メソッドがPOSTでパラメータがDOMドキュメントで無い場合bodyはシリアライズ される。 ※inputストリームの場合、ContentType: および ContentLength: ヘッダ(header) 情報および、ストリームの最後に’CR/LF’の添付が必要。.
例] var sendVal = “data1=“ + aaaa + ”&data2=“ + bbbb; xhrObj.send(sendVal);
92
XMLHttpRequestオブジェクト
(4)onreadyStatechangeプロパティ - 非同期通信時のみ使用 書式] ハンドラ onreadystatechange 機能] readyState変更時にコールバック関数を自動起動する
例1] 匿名関数形式 : xhrObj.onreadystatechange = function() { 受信処理 } 例2] 関数指定形式 : xhrObj.onreadystatechange = func1; } function func1() { 受信処理 }
93
書式] readonly int readyState 機能]リクエストの処理状態を表す。 値]
例] if (xhrObj.readyState == 4 ){ [httpステータス確認とデータ受信後の処理] } ※クライアント(ブラウザ)側の処理は、受信完了(値=4)後に行うのが通常。 データ受信中(値=3)に受信データにアクセスした場合、ブラウザにより、 応答が異なる(Internet ExplorerおよびOpreraではエラーを返す。)
XMLHttpRequestオブジェクト
(5) readyStateプロパティ - 非同期通信時のみ使用
値 表記 状態
0 UNINITIALIZED オブジェクトは生成されているが、まだ初期化されていない
(openメソッドが呼ばれていない)
1 LOADING オブジェクトが生成されたが、まだsendメソッドが呼ばれていない
2 LOADED Sendメソッドは呼ばれ、statusとヘッダが有効になった。
3 INTERACTIVE クライアントは応答テキストを受信中(データの一部を保持)
4 COMPLETED 総ての操作が完了、データは総て受信完了
94
XMLHttpRequestオブジェクト – その他のプロパティ (6) statusプロパティ - 非同期通信時のみ使用
書式] readonly int status 機能] HTTPrequest要求に対するステータスを値で返す。 値]
例] if (xhrObj.readyState == 4) { if (xhrObj.status == 200) { [データ受信後の処理] } }
値 ステータステキスト 状態
200 OK リクエスト成功
401 Unauthorized 許可なし
403 Forbidden アクセス拒否
404 Not Found 存在不明
500 Internal Server Error サーバ内部エラー
95
XMLHttpRequestオブジェクト – その他のプロパティ (7) statusTextプロパティ - 非同期通信時のみ使用
書式] readonly String statusText 機能] HTTPrequest要求に対するステータスをテキストで返す。 値]
例] if (xhrObj.readyState == 4 && xhrObj.statusText == “OK”){ //readyState と status の確認は上の書式でも可 [データ受信後の処理] }
値 ステータステキスト 状態
200 OK リクエスト成功
401 Unauthorized 許可なし
403 Forbidden アクセス拒否
404 Not Found 存在不明
500 Internal Server Error サーバ内部エラー
96
(8)getElementById メソッド
書式] object.getElementById(“id属性値”) 機能] 指定したID名を持つ要素ノードオブジェクトを返す。 引数] id属性値。 返値] オブジェクト。 適用] document 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
要素ノードの参照
※非常に頻繁に使用されるメソッドで、多くのAjaxライブラリでショートカット
関数が用意されている。
例] document.getElementById(“out1”);
↓
$(“out1”); // Prototype.js, DWR
id(“out”); // funcs.js
97
DOMオブジェクト (9) innerHTMLプロパティ
書式] object.innerHTML [ = innerHTML] 機能] 開始・終了タグに挟まれた部分のHTMLを設定したり、読み出す。 設定] テキストとHTMLタグの組み合わせで使用する。 ただし、<html>、<head>、<title>タグは除く。 例] document.getElementById(“result”).innerHTML = resp; ※このプロパティの設定で、指定した文字列でエレメントの既存の内容 を完全に置き換える。 ※このプロパティはドキュメントがロード中に設定することはできない。
98
DOMオブジェクト (10) innerTextプロパティ
書式] object.innerText[ = innerText]
機能] 開始・終了タグに挟まれた部分のテキストを設定したり、
読み出す。
設定]
テキストとHTMLタグの組み合わせで使用する。ただし、<html>、<head>、<title>タグは除く。
例] document.getElementById(“result”).innerText = resp;
※このプロパティの設定で、指定した文字列でエレメントの既存の内容を完全
に置き換える。
※このプロパティはドキュメントがロード中に設定することはできない。
※innerTextの場合、HTMLのタグは解釈されずそのまま画面に表示される。
99
document.getElementById("out").innerHTML = data1;
document.getElementById("out").innerText = data1;
document.getElementById("out").value = data1;
IE,FireFoxでのブラウザ表示有効性
表示フィールド 入力フィールド
innerHTML IE ○ FF ○ IE ○ FF ×
innerText IE ○ FF × IE ? FF ?
value IE × FF × IE ○ FF ○
100
XMLHttpRequestオブジェクト – その他のメソッド (11) abortメソッド
書式] object.abort ( )
機能] XMLHttpRequestオブジェクトのHTTPリクエストを中止する
返り値] なし 適用] XMLHttpRequest
例] xhrObj.abort();
101
通信タイムアウトの処理 一定時間が経過してもサーバーから応答がない場合の処理。 1. タイムアウトしたとき、エラーメッセージを表示する。 2. setInterval()でタイマーを設定し、一定時間経過後に指定 した関数を呼び出す。 例]
//5000ミリ秒経過するとtimeout()を実行する timerId = setInterval('timeout()', 5000); //XMLHttpRequestの通信を中断するときは abort() を実行する。 //タイムアウトの処理 function timeout() { //タイマーを終了する clearInterval(timerId); //通信を切断する xhrObj.abort(); }
102
103
//<![CDATA[
var xhrObj = getXhrObj();
function reqEmpName(){
var emp_no = document.getElementById("emp_no").value.toUpperCase();
xhrObj.open("get", "../../getempnamedb?emp_no="+emp_no);
xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT");
var timerId = setInterval("timeout()", 1);
xhrObj.onreadystatechange = respEmpName;
xhrObj.send(null);
}
function respEmpName(){
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
clearInterval(timerId);
var emp_name = xhrObj.responseText;
document.getElementById("emp_name").value = emp_name;
}
}
}
function timeout(){
clearInterval(timerId);
xhrObj.abort();
alert("通信が切断されました。");
}
function initOnLoad(){
var observer = document.getElementById("emp_no");
setListener(observer, "blur", reqEmpName);
}
setListener(window, "load", initOnLoad);
//]]>
通信タイムアウトの処理サンプルコード
Ajax演習-2
従業員全データを一覧表示して下さい。 Ajax] ・複数レコード、複数アイテム の受信処理を利用 PHP] ・文字列連結はドット(.)を使用 ・PHPプログラムはgetUniq.php をもとにファイル名getAllEmp.phpで作成してください。
104
(4)イベント処理 DOMを使用してイベントの相互作用と動的な画面表示を行う dynamic display and interaction using the Document Object Model
105
(1) DOM(Document Object Model)
定義:Webページの内容(文章、画像、音声など)およびそれらの配置、 スタイルをツリー構造のオブジェクトとして扱い、プログラム言語から 動的にアクセスしたり更新することを可能にするAPI。 データ構造のセットではなく、インターフェイスを規定するオブジェクトモデル。
仕様策定] W3C ※DOMに従ってWebページを記述するための言語がDynamic HTMLになる。 ※Dynamic HTMLはNetscape Navigator 4.xとInternet Explorer 4.x/5.xに 搭載されており、DOMの直近の祖先になるが、両者のDOMは部分的に 仕様が異なるため、現在W3Cによって標準化が進められている。 DOM Level1 :Core, HTML DOM Level2 :Core, Views, Style, CSS, Events, Traversal, Range, HTML DOM Level3 :Core, View and Formatting, Abstract Schemas, Load and Save,Events, XPath
106
<html> <head> <title>XMLガイド</title> </head> <body> <ol> <li>項目1</li> <li>項目2</li> <li>項目3</li> </ol> </body> </html>
html
head body
title ol
DOMツリー内での 文書操作(動的表示)
XHTML文書 DOMツリー DOM API
XHTMLとDOM
li li li
項目1 項目2 項目3
DOMツリー内での イベント検知
サーバとの
非同期通信
ノード
XML文書 DOMツリー DOM API XML
パーサ
107
キャプチャフェーズ
バブリングフェース オブザーバ
ターゲット
body
table
tr
td
DOMイベントモデル
・ターゲット イベント発生
・オブザーバ イベントキャッチ
・バブリングフェーズ
イベントの上位伝播
・キャプチャフェーズ
イベントの下位伝播
イベント発生
イベントキャッチ
tbody
document
html
108 参考] W3C Document Object Model Events
:
:
:
window
document
table
thead
tbody
tfoot
tr td
イベント
ネットスケープモデル マイクロソフトモデル
DOMイベントモデル イベントの伝播方向
-マイクロソフトモデル 内側のタグから外側のタグに伝播 -ネットスケープモデル 外側のタグから内側のタグに伝播
109
DOMイベントモデルの機能と特徴
(1) イベントの伝播とイベントリスナでのキャッチ addEventListener関数 (ie6では attachEvent関数) (2) イベントの発生場所はid属性値で識別 (3) イベントハンドラは従来のものから 先頭のonを省いたものと同じ (4) XHTMLとJavaScriptコードの分離
110
function setListener(observer, eventType, callFunc){ if(observer.attachEvent){ observer.attachEvent('on' + eventType, callFunc); }else if(observer.addEventListener){ observer.addEventListener(eventType, callFunc, false); }else { alert('No support on Your Browser'); return false; } }
funcs.js
attachEvent :Internet Explorer addEventListener :IE以外のブラウザ
setListener関数 -イベントリスナの設定
111
(1) 検索・参照画面の作成 -GET/非同期通信 (2) 登録画面の作成 -POST/同期通信 (3) 参照・更新・削除画面の作成 -登録系・参照系の組合せ
Ajaxでのデータ参照・登録・更新・削除
112
Ajaxでの参照画面例
従業員マスタ参照
113
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>クラス1登録</title>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript">
//<![CDATA[
var xhrObj = getXhrObj();
function revEmpMas(){
var emp_no = document.getElementById("emp_no").value;
xhrObj.open("get", "revEmpMas.php?emp_no="+emp_no);
xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT");
xhrObj.send(null);
xhrObj.onreadystatechange = respEmpData;
}
データ参照 revEmpMas.htm(1/3)
114
function respEmpData(){
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
var resp = xhrObj.responseText.split("<i>");
if(resp[0]=="OK"){
document.getElementById(“status”).innerHTML = resp[0];
document.getElementById("emp_name").innerHTML = resp[1];
document.getElementById("section").innerHTML = resp[2];
document.getElementById("mod_date").innerHTML = resp[3];
}else{
document.getElementById("status").innerHTML = resp[0];
}
}
}
}
function initOnLoad(){
var observer = document.getElementById("rev");
setListener(observer, "click", revEmpMas);
}
setListener(window, "load", initOnLoad);
//]]>
</script>
</head>
データ参照 revEmpMas.htm(2/3)
115
<body>
<center>
<h2>従業員マスタ管理</h2>
<table width="380" border="1">
<tbody>
<tr><th colspan="2">従業員マスタ参照</th></tr>
<tr>
<th width="120">従業員番号</th>
<td><input type="text" id="emp_no"></td>
</tr>
<tr><th>従業員氏名</th><td id="emp_name"> </td></tr>
<tr><th>所属部署</th><td id="section"> </td></tr>
<tr><th>登録日</th><td id="mod_date"> </td></tr>
<tr>
<th><input type="button" id="rev" value=" 参照 " /></th>
<td id="status"> </td>
</tr>
</tbody>
</table>
</center>
</body>
</html>
データ参照 revEmpMas.htm(2/3)
116
<?php
$server = "localhost";
$dbname = "ajax_ec";
$user = "mysql";
$passwd = "callback";
$sv = mysql_connect($server, $user, $passwd) or die("Connection error1");
mysql_select_db($dbname) or die("Connection error2");
$emp_no = $_POST["emp_no"];
$emp_name = $_POST["emp_name"];
$section = $_POST["section"];
$mod_date = date("Y-n-d");
$sql = "insert into emp_mas
values('$emp_no', '$emp_name', '$section', '$mod_date')";
if($rows = mysql_query($sql, $sv)){
echo "登録成功: "."従業員番号=".$emp_no;
}else{
echo "登録不成功: "."従業員番号=".$emp_no;
}
mysql_close($sv);
?>
参照画面サーバコード revEmpMas.php
117
$server = "localhost"; $user = "mysql"; $passwd = "callback"; $sv = mysql_connect($server, $user, $passwd) or die("Connection error1");
PHPでのMySQLデータベースアクセス手順 参照画面サーバコード revEmpMas.php
118
(1)データベースサーバへの接続 最初にmysql_connect でデータベースサーバ(ホスト)に接続する。
接続ID = mysql_connect(ホスト名,ユーザ名,パスワード)
戻り値$svには、データベースへの接続IDが代入される。 この後、この接続IDを参照してデータベースへのアクセスを行う。
$dbname = "ajax_ec";
$db = mysql_select_db($dbname) or die("Connection error2");
119
(2)データベースの選択 次に、接続したデータベースサーバの中から利用するデータベースをmysql_select_dbで選択する。
$db = mysql_select_db(データベース名、接続ID)
選択に成功すれば、戻り値はTRUE、失敗すればFALSEとなる。
$sql = "select * from emp_mas where emp_no='$emp_no'";
$rows = mysql_query($sql, $sv) or die("mysql query Error");
120
(3)SQL文の実行 選択したデータベースに対するSQL文の実行を、mysql_query()で行う。
結果ID = mysql_query(SQL文,接続ID);
戻り値($rows)には、SQL文の処理結果が格納される。 処理結果は「結果ID」または「結果セット」と呼ばれる。
$row = mysql_fetch_array($rows, MYSQL_ASSOC);
if($row>0){
$resp = "OK"."<i>";
$resp = $resp.$row["emp_name"]."<i>";
$resp = $resp.$row["section"]."<i>";
$resp = $resp.$row["mod_date"];
echo $resp;
}else{
echo "検索不成功: ".$emp_no."<i>";
}
121
(4)レコードの読みとり 結果セット($rows)には現在のレコードを示すポインタがあり、先頭は結果セットの第1レコードを示している。現在のレコードデータを連想配列名をキー値として読み出すには、 mysql_fetch_arrayの第一引数に結果セットを、第二引数に MYSQL_ASSOC を指定する。 ※同様の処理関数としてmysql_fetch_assocも使用可能。
※PHPでの文字列連結はドット演算子(.)で行う
mysql_close($sv);
122
(5)データベースサーバへの接続をクローズ データベースに対する処理がすべて終了後、データベースサーバへの接続を切断する。
mysql_close(接続ID)
Ajax データ登録の特徴
1) POSTメソッド使用
2) 画面遷移の無い登録 =>迅速な連続登録
3) 登録項目の動的絞込み値設定・表示 例1] リスト項目での絞込み 部リスト選択
->対応課リスト表示・選択 ->対応従業員リスト表示
例2] 検索項目入力での値設定 郵便番号入力
-> 対応住所の住所入力フィールド自動設定
4) 登録結果(成功・不成功・ステータス)の動的表示
123
Ajaxでの登録画面作成
従業員マスタ登録
124
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>クラス1登録</title>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript">
//<![CDATA[
function addEmpMas(){
var emp_no = document.getElementById("emp_no").value;
var emp_name = document.getElementById("emp_name").value;
var section = document.getElementById("section").value;
var req="emp_no="+emp_no+"&emp_name="+emp_name+"§ion="+section;
var xhrObj = getXhrObj();
xhrObj.open("post", "addEmpMas.php", false);
xhrObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhrObj.send(req);
document.getElementById('status').innerHTML = xhrObj.responseText;
}
function initOnLoad(){
var observer = document.getElementById("add");
setListener(observer, "click", addEmpMas);
}
setListener(window, "load", initOnLoad);
//]]>
</script>
データ登録 addEmpMas.htm
(1/2)
125
</head>
<body>
<center>
<h2>従業員マスタ管理</h2>
<table width="380" border="1">
<tbody>
<tr><th colspan="2">従業員マスタ登録</th></tr>
<tr>
<th width="120">従業員番号</th>
<td><input type="text" size="8" id="emp_no"></td>
</tr>
<tr><th>従業員氏名</th><td><input type="text" id="emp_name"></td></tr>
<tr><th>所属部署</th><td><input type="text" id="section"></td></tr>
<tr>
<th><input type="button" id="add" value=" 登録 " /></th>
<td id="status"> </td>
</tr>
</tbody>
</table>
</center>
</body>
</html>
データ登録 addEmpMas.htm
(2/2)
126
<?php
$server = "localhost";
$dbname = "ajax_ec";
$user = "mysql";
$passwd = "callback";
$sv = mysql_connect($server, $user, $passwd) or die("Connection error1");
$db = mysql_select_db($dbname) or die("Connection error2");
$emp_no = $_POST["emp_no"];
$emp_name = $_POST["emp_name"];
$section = $_POST["section"];
$mod_date = date("Y-n-d");
$sql = "insert into emp_mas values('$emp_no', '$emp_name', '$section', '$mod_date')";
if($rows = mysql_query($sql, $sv)){
echo "登録成功: "."従業員番号=".$emp_no;
}else{
echo "登録不成功: "."従業員番号=".$emp_no;
}
mysql_close($sv);
?>
データ登録サーバコード(PHP) addEmpMas.php
127
Ajaxデータ検索・参照の特徴
(1)検索表示のハイスピード表示
(2) GETメソッド使用 =>検索待ち時間のタイムアウト処理 (3) 検索画面上での検索結果動的表示 =>迅速な連続検索 (4) 検索条件の絞込み・動的設定 表示 例1] 下位項目表示での絞込み 例2] リスト項目での絞込み (5) 検索結果(成功・不成功・ステータス)の動的表示
128
Ajaxデータ更新・削除の特徴
(1) POSTメソッド使用
(2) 同一画面上での連続更新・削除
=>迅速な連続更新・削除処理に対応
(3) 検索結果(成功・不成功・ステータス)の動的表示 ※更新のクライアントロジックは登録と同じ、 サーバ側で受信データで登録処理を行うか更新処理 を行うかで異なる。
129
Ajaxでの参照・更新・削除画面例 従業員マスタ参照/更新/削除
130
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>クラス1登録</title>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript">
//<![CDATA[
var xhrObj = getXhrObj();
function revEmpMas(){
var emp_no = document.getElementById("emp_no").value;
xhrObj.open("get", "revEmpMas.php?emp_no="+emp_no);
xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT");
xhrObj.send(null);
xhrObj.onreadystatechange = function(){
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
var resp = xhrObj.responseText.split("<i>");
if(resp[0]=="OK"){
document.getElementById("status").innerHTML = resp[0];
document.getElementById("emp_name").value = resp[1];
document.getElementById("section").value = resp[2];
document.getElementById("mod_date").innerHTML = resp[3];
}else{
document.getElementById("status").innerHTML = resp[0];
}
}
}
}
}
データ更新 updEmpMas.htm
(1/3)
131
function updEmpMas(){
var emp_no = document.getElementById("emp_no").value;
var emp_name = document.getElementById("emp_name").value;
var section = document.getElementById("section").value;
var req="emp_no="+emp_no+"&emp_name="+emp_name+"§ion="+section;
xhrObj.open("post", "updEmpMas.php", false);
xhrObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhrObj.send(req);
document.getElementById('status').innerHTML = xhrObj.responseText;
}
function delEmpMas(){
var emp_no = document.getElementById("emp_no").value;
xhrObj.open("post", "delEmpMas.php", false);
xhrObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhrObj.send("emp_no="+emp_no);
document.getElementById('status').innerHTML = xhrObj.responseText;
}
function initOnLoad(){
var observer = document.getElementById("rev");
setListener(observer, "click", revEmpMas);
var observer = document.getElementById("upd");
setListener(observer, "click", updEmpMas);
var observer = document.getElementById("del");
setListener(observer, "click", delEmpMas);
}
setListener(window, "load", initOnLoad);
//]]>
</script>
データ更新 updEmpMas.htm
(2/3)
132
</head>
<body>
<center>
<h2>従業員マスタ管理</h2>
<table width="390" border="1">
<tbody>
<tr>
<th colspan="2" id="mod">
従業員マスタ参照/更新/削除
<input type="button" id="rev" value=" 参照 " />
<input type="button" id="upd" value=" 更新 " />
<input type="button" id="del" value=" 削除 " />
</th>
</tr>
<tr>
<th width="120">従業員番号</th>
<td width="260"><input type="text" id="emp_no" size="8"></td>
</tr>
<tr><th>従業員氏名</th><td><input type="text" id="emp_name"></td></tr>
<tr><th>所属部署</th><td><input type="text" id="section"></td></tr>
<tr><th>登録日</th><td id="mod_date"> </td></tr>
<tr><th>ステータス</th><td id="status"> </td></tr>
</tbody>
</table>
</center>
</body>
</html>
データ更新 updEmpMas.htm
(3/3)
133
<?php
$server = "localhost";
$dbname = "ajax_ec";
$user = "mysql";
$passwd = "callback";
$sv = mysql_connect($server, $user, $passwd) or die("Connection error1");
$db = mysql_select_db($dbname) or die("Connection error2");
$emp_no = $_POST["emp_no"];
$emp_name = $_POST["emp_name"];
$section = $_POST["section"];
$mod_date = date("Y-n-d");
$sql = "update emp_mas
set
emp_name = '$emp_name',
section = '$section',
mod_date = '$mod_date'
where
emp_no = '$emp_no'";
if($rows = mysql_query($sql, $sv)){
echo "更新成功: "."従業員番号=".$emp_no;
}else{
echo "更新不成功: "."従業員番号=".$emp_no;
}
mysql_close($sv);
?>
データ更新 updEmpMas.php
134
<?php
$server = "localhost";
$dbname = "ajax_ec";
$user = "mysql";
$passwd = "callback";
$sv = mysql_connect($server, $user, $passwd) or die("Connection error1");
$db = mysql_select_db($dbname) or die("Connection error2");
$emp_no = $_POST["emp_no"];
$sql = "delete from emp_mas where emp_no='$emp_no'";
if($rows = mysql_query($sql, $sv)){
echo "削除成功: "."従業員番号=".$emp_no;
}else{
echo "削除不成功: "."従業員番号=".$emp_no;
}
mysql_close($sv);
?>
データ更新 delEmpMas.php
135
http://www.prototypejs.org
・Ajaxフレームワーク ・コード記述のシンプル化 ・クロスブラウザ対応
prototype.js
136
Ajaxian.com 2007 Survey Results
137 出典: Ajaxian.com (http://ajaxian.com/)
138
Google Trendsでの prototype.js dojo jQuery検索トラフィック比較
http://www.google.co.jp/trends?q=prototype.js%2C+dojo%2C+jQuery
Prototype.jsの主要機能 1 ショートカット
長文メソッド名等のショートカット
2 Ajaxフレームワーク
定型的Ajaxクライアントコード記述
3 JavaScript言語機能の強化
・イテレータ
・文字列処理
・配列処理
4 オブジェクト指向機能の強化
139
Prototype.js APIS ・ユーティリティメソッド(Utility Methods) ・Ajax(Ajax) ・配列(Array) ・クラス(Class) ・要素(Element) ・要素メソッド(Element.methods) ・要素メソッドシミュレート (Element.Metod.Simulate) ・列挙型(Enumerable) ・イベント(Event) ・フォ-ム(Form) ・フォーム要素(Form.Element)
・関数(Function) ・ハッシュ(Hash) ・インサーション(Insertion) ・ナンバー(Number) ・オブジェクト(Object) ・オブジェクト範囲(ObjectRange) ・定期実行(PeriodicalExecuter) ・ポシション(Position) ・プロトタイプ(Prototype) ・文字列(String) ・テンプレート(Template) ・時間管理(TimeObserver)
140
使用方法 ダウントードされるprototype.jsファイルを外部js参照指定でOK <script type="text/javascript" src="../lib/prototype.js"></script>
141
Prototype.js
[1] ショートカット(ユーティリティメソッド)
$() 関数 document.getElementByIdのショートカット $(“id1”) → document.getElementById(“id1”); $F() 関数 INPUTフィールドの値を所得 $F(“id1”) → document.getElementById(“id1”).value; $A() 関数 引数指定列挙型リストを配列オブジェクトに変換
142
$() 関数 ID属性の値を返す 例] document.getElementByIdのショートカット document.getElementById(“id1”) → $(“id1”) ※引数として2つ以上のIDを渡すと、ID属性の並びを 配列で返す var divs = $(‘div1’, ‘div2’, ‘div3’); ※配列だけでなく要素オブジェクトそのものを渡すこともできる。
143
Ajax.Request 書式] Ajax.Request(url, options); url :リクエストurl options :options引数オブジェクト
144
Ajax.Updater 書式] Ajax.Updater(container, url, options); container :出力先id名(または要素オブジェクト) ex:{success: id名} url :リクエストurl options :options引数オブジェクト
Prototype.js [2] Ajaxフレームワーク
継承
[options] method postまたはget デフォルトpost parameters getで送信されるクエリー文字列 postBody postで送信されるクエリー文字列 asynchronous 非同期/同期指定、デフォルトは非同期(true) requestHeaders HTTPプロトコルヘッダ情報のリスト ヘッダフィールド名と値をペアで指定 onComplete XHRリクエストが完了した場合に呼び出される関数を指定する 関数の引数にXHRインスタンスが渡される onSuccess XHRリクエストが成功裡完了の場合に呼び出される関数を指定する 関数の引数にXHRインスタンスが渡される onFailure XHRリクエストが失敗の場合に呼び出される関数指定を指定する 関数の引数にXHRインスタンスが渡される onException XHRリクエストで例外発生の場合に呼び出される関数を指定する 関数の引数にXHRインスタンスが渡される on + [status] XHRリクエストでのreadyStateに対応して呼び出される関数を指定 onUninitialized、onLoading、onLoaded、onInteractive 、onComplete 関数の引数にXHRインスタンスが渡される
145
従業員マスタ登録をPrototype.js(Ajax.Updater) で書き換え
146
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>クラス1登録</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript"> //<![CDATA[ function addEmpMas(){ new Ajax.Updater({success:'status'},'addEmpMas.php',{postBody:Form.serialize("items")}); } function initOnLoad(){ setListener($("add"), "click", addEmpMas); } setListener(window, "load", initOnLoad); //]]> </script> </head>
prototype.js :Ajax.Updater addEmpMas.htm(1/2)
147
<body> <center> <h2>従業員マスタ管理</h2> <table width="380" border="1"> <tbody> <tr><th colspan="2">従業員マスタ登録</th></tr> <form id="items"> <tr> <th width="120">従業員番号</th> <td><input type="text" size="8" name="emp_no"></td> </tr> <tr><th>従業員氏名</th><td><input type="text" name="emp_name"></td></tr> <tr><th>所属部署</th><td><input type="text" name="section"></td></tr> </form> <tr> <th><input type="button" id="add" value=" 登録 " /></th> <td id="status"> </td> </tr> </tbody> </table> </center> </body> </html>
prototype.js :Ajax.Updater addEmpMas.htm(2/2)
148
従業員マスタ参照をPrototype.js(Ajax.Request) で書き換え
149
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>クラス1登録</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript"> //<![CDATA[ function revEmpMas(){ var emp_no = "emp_no="+$("emp_no").value new Ajax.Request('revEmpMas.php',{method:'get',onComplete:out,parameters:emp_no}); } function out(out){ var resp = out.responseText.split("<i>"); for(var i = 0; i < resp.length; i++){ $("status","emp_name","section","mod_date")[i].innerHTML = resp[i]; } } function initOnLoad(){ setListener($("rev"), "click", revEmpMas); } setListener(window, "load", initOnLoad);
revEmpMas.htm (1/2) (prototype: Ajax.Request)
150
//]]> </script> </head> <body> <center> <h2>従業員マスタ管理</h2> <table width="380" border="1"> <tbody> <tr><th colspan="2">従業員マスタ参照</th></tr> <tr> <th width="120">従業員番号</th> <td><input type="text" id="emp_no"></td> </tr> <tr><th>従業員氏名</th><td id="emp_name"> </td></tr> <tr><th>所属部署</th><td id="section"> </td></tr> <tr><th>登録日</th><td id="mod_date"> </td></tr> <tr> <th><input type="button" id="rev" value=" 参照 " /></th> <td id="status"> </td> </tr> </tbody> </table> </center> </body> </html>
revEmpMas.htm (2/2) (prototype: Ajax.Request)
151
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>クラス1登録</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript"> //<![CDATA[ function revEmpMas(){ var emp_no = "emp_no="+$("emp_no").value new Ajax.Request('revEmpMas.php',{method:'get',onComplete:out,parameters:emp_no}); } function out(out){ var resp = out.responseText.split("<i>"); $("status","emp_name","section","mod_date").each( function (value, i){ value.innerHTML = resp[i]; }); } function initOnLoad(){ setListener($("rev"), "click", revEmpMas); } setListener(window, "load", initOnLoad);
revEmpMas2.htm (1/2) (prototype: Ajax.Request)
152
//]]> </script> </head> <body> <center> <h2>従業員マスタ管理</h2> <table width="380" border="1"> <tbody> <tr><th colspan="2">従業員マスタ参照</th></tr> <tr> <th width="120">従業員番号</th> <td><input type="text" id="emp_no"></td> </tr> <tr><th>従業員氏名</th><td id="emp_name"> </td></tr> <tr><th>所属部署</th><td id="section"> </td></tr> <tr><th>登録日</th><td id="mod_date"> </td></tr> <tr> <th><input type="button" id="rev" value=" 参照 " /></th> <td id="status"> </td> </tr> </tbody> </table> </center> </body> </html>
revEmpMas2.htm (2/2) (prototype: Ajax.Request)
153
Ajax演習-3 prototype.js Ajaxフレームワーク 従業員番号から氏名表示を prototype.js(Ajax.Request)で書き換え て下さい。
154
function revEmpMas(e) {
//処理内容
}
function initOnLoad() {
var observer = document.getElementById(“sel");
setListener(observer, "click", revEmpMas);
}
setListener(window, "load", initOnLoad );
イベントオブジェクト(e)
イベントオブジェクトからイベントに関する様々な情報を所得可能
・キー入力、マウスクリックでのイベント発生ノード識別
・キー入力イベントでの入力キー識別(キーコード値)
・マウスクリックイベントでのマウスボタン(左、右、中央)識別
・マウスポインタ(カーソル)移動でのポインタ位置検出 155
イベントターゲットの検出: getid(e) イベント発生ノードをイベントオブジェクトから識別 ・IE系ブラウザ e.srcElement ・IE以外のブラウザ e.target
function getid(e){ var tgt; if(!e) var e = window.event; if(e.srcElement){ // Microsoft tgt = e.srcElement.id; if(tgt.nodeType == 3) tgt = tgt.rapentNode; }else if(e.target){ // W3C/Netscape tgt = e.target.id; }else{ tgt = false; } return tgt; }
getid関数(funcs.js) イベント発生ノード のID属性値を返す
156
function getkcode(e){
if(!e) var e = window.event;
if(e.keyCode){
return e.keyCode;
}else if(e.which){
return e.which;
}else{
return false;
}
}
getkcode関数(funcs.js) キー押下時のイベントで 入力キーコード値を返す
入力キーコードの検出: getkcode(e) 押下キーコードをイベントオブジェクトから識別 ・IE系および新しいFireFox e. keyCode ・古いFireFox e.which
157
キー コードBack Space 8Tab 9Enter 13Shift 16Cntrl 17Alt 18Break 19ESC 27変換 28無変換 29スペース 32Page Up 33Page Down 34END 35Home 36← 37↑ 38→ 39↓ 40Print Screen 44Insert 45Delete 46Num Lock 145
参考資料 キーコード対応表
158
getkcodeで返されるキーコード値
function getkchar(e){
var code;
if(!e) var e = window.event;
if(e.keyCode){
code = e.keyCode;
}else if(e.which){
code = e.which;
}else{
code = false;
}
if(code)
return String.fromCharCode(code);
else
return code;
}
入力キー文字の表示: getkchar(e) (funcs.js)
159
テーブルでのキー入力 入力行/列、入力キー検出
・入力位置(行/列) → getid(e)
・入力キーコード → getkcode(e)
・入力キー文字 → getkchar(e)
160
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>テーブル入力</title> <link rel="stylesheet" type="text/css" href="../lib/style.css" /> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function initOnLoad(){ var table = "<table id='id1' cellspacing='0' cellpadding='0'><tbody>"; for(var i = 0; i < 7; i++){ table += "<tr>"; for(var j = 0; j < 5; j++){ table += "<td><input type='text' id='"+i+":"+j+"' size='4' /></td>"; } table += "</tr>"; } table += "</tbody></table>"; document.getElementById("view").innerHTML = table; var observer = document.getElementById("id1"); setListener(observer, "keyup", check); }
table.htm 1/2 テーブル入力処理
161
function check(e){ var tid = getid(e); var kcode = getkcode(e); var kchar = getkchar(e); var row = tid.split(":")[0]; var col = tid.split(":")[1]; alert("行="+row+" 列="+col+" キー="+kcode+" 文字="+kchar); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <h3>テーブル入力処理</h3> <div id="view"></div> </body> </html>
table.htm 2/2
162
クリックマウスボタン(左右)の検知
FireFox 関数:e.which
•Left button: 1
•Middle button: *
•Right button: 3
MS(IE) 関数:e.button
•Left button: 1
•Middle button: *
•Right button: 2
163
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>入力キー</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript"> //<![CDATA[ function check(e){ if (!e) var e = window.event; if (e.which){ alert("e.which = "+e.which); }else if (e.button){ alert("e.button = "+e.button); } }
mclick1.htm 1/2
164
function initOnLoad(){ setListener($("id1"), "mousedown", check); } setListener(window, "load", initOnLoad ); //]]> </script> </head> <body> <center> <h3>マウスボタン検知</h3> <p><input type="text" id="id1" value="ボタンクリック" /></p> <p id="id2">ボタンクリック </p> </center> </body> </html>
mclick1.htm 2/2
165
function mbutton(e){
var click;
if(!e) var e = window.event;
if (e.which){
if(e.which == 1){
click = "L";
}else if(e.which == 3){
click = "R";
}
}else if (e.button){
if(e.button == 1){
click = "L";
}else if(e.button == 2){
click = "R";
}
}else{
click = "F";
}
return click;
}
クリックマウスボタンの検出 mbutton(funcs.js)
・左ボタンクリック → 戻り値(“L”) ・右ボタンクリック → 戻り値(“R”)
166
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>入力キー</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript"> //<![CDATA[ function check(e){ var button = mbutton(e); if(button == "L"){ alert("左ボタンクリック"); }else if(button == "M"){ alert("中央ボタンクリック"); }else if(button == "R"){ alert("右ボタンクリック"); }else{ alert("エラー"); } }
mclick2.htm 1/2 167
function initOnLoad(){ setListener($("id1"), "mousedown", check ); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <center> <h3>マウスボタン検知</h3> <p><input type="text" id="id1" value="ボタンクリック" /></p> <p id="id2">ボタンクリック </p> </center> </body> </html> mclick2.htm 2/2
168
1. e.clientX、 e.clientY [IE,FF] 原点(0,0):ブラウザ画面左上 e.clientX: ウィンドウ表示部分の左上を基準としてX座標をピクセル値で返す。 e.clientY: ウィンドウ表示部分の左上を基準としてY座標をピクセル値で返す。 2. e.offsetX、 e.offsetY [IEのみ] e.offsetX: イベントでオフセットの親となるoffsetParentオブジェクトの左上を 基準としてオブジェクトのX座標をピクセル値で返す。 e.offsetY: イベントでオフセットの親となるoffsetParentオブジェクトの左上を 基準としてオブジェクトのY座標をピクセル値で返す。 3. e.screenX、 e.screenY [IE,FF] 原点(0,0):モニタ画面左上 e.screenX: スクリーン上マウス位置のX座標をピクセル値で返す。 e.screenY: スクリーン上マウス位置のX座標をピクセル値で返す。 4. e.x、 e.y [IEのみ、e.clientX、 e.clientYと同じ] e.x: ウィンドウ表示部分の左上を基準としてX座標をピクセル値で返す。 e.y: ウィンドウ表示部分の左上を基準としてY座標をピクセル値で返す。
移動するマウスポインタ位置の検出
169
マウスポインタ位置の検出
170
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> <!-- #area {position: absolute; background-color: #eeeeee; top: 5px; left: 5px; width: 300px; height: 300px;} #stat {position: absolute; top: 35px; left: 315px;} --> </style> <title>マウスボタン </title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function check(e){ document.getElementById("x1").value = e.clientX; document.getElementById("y1").value = e.clientY; document.getElementById("x2").value = e.screenX; document.getElementById("y2").value = e.screenY; }
マウスポインタ位置の検出 mpos2.htm 1/2
171
function initOnLoad(){ var observer = document.getElementById("area"); setListener(observer, "mousemove", check); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div id="area"></div> <div id ="stat"> <h4>マウスポインタ位置の検出</h4> <ul type="circle"> <li>e.clientX_<input type="text" size="5" id="x1" /></li> <li>e.clientY_<input type="text" size="5" id="y1" /></li> </ul> <ul type="circle"> <li>e.screenX<input type="text" size="5" id="x2" /></li> <li>e.screenY<input type="text" size="5" id="y2" /></li> </ul> </div> </body> <//html>
mpos2.htm 2/2
172
Ajax演習-4
従業員番号から氏名表示を下記仕様に変更 ①従業員番号(5桁)入力により氏名表示 ヒント]入力文字数は $(“emp_no”).value.length で取得
②従業員番号入力後ALTキー押下で氏名表示 ヒント] getkcodeで返されるキーコード値はスライド NO159
173
Ajaxのフォームコントロール操作
・ラジオボタン ・チェクボックス ・セレクトメニュー 必要性 : AjaxモデルでのUI操作性向上(RIA化) メリット :従来モデルにないUI操作性を実現 Ex]サーバレスポンスデータでの動的値設定 動的絞り込み検索 デメリット:従来モデルに比べて処理が複雑
174
ラジオボタン
175
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <title>ラジオボタンの選択確認</title> <script type="text/javascript" src="funcs.js"></script> <script type="text/javascript" src="radioBtn.js"></script> </head> <body> <h3>ラジオボタンの選択確認</h3> <p id="pc"> <input type="radio" id=“CPU" />CPU <input type="radio" id=“RAM" />メモリ <input type="radio" id=“HDD" />ハードデスク <input type="radio" id=“DVD" />DVD </p> <hr /> <p id="result"></p> </body> </html>
radioBtn.htm
176
//<![CDATA[ function checkSel(e){ var sel = getid(e); document.getElementById("result"). innerHTML = "選択結果: " + sel; } Function initOnLoad(){ var observer = document.getElementById("pc"); setListener(observer, "click", checkSel); } setListener(window, "load“,initOnLoad); //]]>
radioBtn.js
177
チェックボックス
178
<?xml version="1.0" encoging="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <title>チェックボックス</title> <link rel="stylesheet" type="text/css" href=“../lib/style.css" /> <script type="text/javascript" src=”../lib/funcs.js"></script>
<script type="text/javascript" src="checkB.js"></script> </head> <body> <p id="pc"> <input type="checkbox" id=“DISPLAY" />ディスプレイ <input type="checkbox" id=“MOUSE" />マウス <input type="checkbox" id=“KEYBORD" />キーボード <input type="checkbox" id=“DVD" />DVDドライブ </p> </body> </html>
チェックボックス選択確認XHTML checkB.htm
179
チェクボックス選択確認JavaScript checkB.js
//<![CDATA[ function checked(e){ var eid =getid(e); alert("選択は " + eid); } function initOnLoad(){ setListener(id("pc"), "click", checked); } setListener(window, "load", initOnLOad); //]]>
180
チェックボックス-複数選択での処理
181
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <title>チェックボックス</title> <link rel="stylesheet" type="text/css" href="style.css" /> <script type="text/javascript" src="funcs.js"></script> <script type="text/javascript" src="checkBox.js"></script> </head> <body> <p id="pc"> <input type="checkbox" id="display" />ディスプレイ <input type="checkbox" id="mouse" />マウス <input type="checkbox" id="keybord" />キーボード <input type="checkbox" id="dvd" />DVDドライブ <br /><br /> <button type="button" class="b2" id="confirm">受信確認</button> </p><hr /> <table> <tr><td>選択確認</td><td id="result1"></td></tr> <tr><td>選択累積</td><td id="result2"></td></tr> <tr><td>受信確認</td><td id="result3"></td></tr> </table> </body> </html>
checkBox.htm
182
//<![CDATA[
var optcum = new Array();
var options = new Array();
function checked(e){
var xhrObj = getXhrObj();
var eid =getid(e);
if(eid != “confirm”){
optcum.push(eid);
document.getElementById(“result1”).innerText = eid;
document.getElementById(“result2”).innerHTML = optcum;
document.getElementById(“result2”).innerHTML = optcum;
} else {
for(var i = 0; i < optcum.length; i++){
if(document.getElementById(optcum[i]).checked == true)
options.push(optcum[i]);
}
xhrObj.open(“post”, “../checkbox”, false);
xhrObj.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
xhrObj.send(“options=” + options);
out = xhrObj.responseText;
document.getElementById(“result3”).innerHTML = out;
}
}
function initOnLoad(){
var observer = document.getElementById("pc");
setListener(observer, "click", checked);
}
setListener(window, "load", initOnLoad);
//]]>
checkBox.js
183
package domevent;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class checkBox extends HttpServlet {
public void doPost (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
int i;
String options[ ] = req.getParameterValues("options");
PrintWriter out;
res.setContentType("text/html; charset=Shift_JIS");
out = res.getWriter();
for (i = 0; i < options.length - 1; i++){
out.println(options[i] + ",");
}
out.println(options[i]);
out.close();
}
}
checkBox.java
184
セレクトメニュー
185
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <title>セレクトメニューの選択確認</title> <script type="text/javascript" src="../funcs.js"></script> <script type="text/javascript" src="selectMenu.js"></script> </head> <body> <h3>セレクトメニューの選択確認</h3> <p> <select id="pc"> <option value="SEL" id="sel"><=選択=></option> <option value="CPU" id="cpu">CPU</option> <option value="RAM" id="ram">メモリ</option> <option value="HDD" id="hdd">ハードデスク</option> <option value="DVD" id="dvd">DVD</option> </select> </p><hr /> <p id="result"></p> </body> </html>
selectMenu.htm
186
//<![CDATA[ function checkSpec(){ var source = document.getElementById("pc").value; document.getElementById("result").innerText = "選択結果: " + source; } function initOnLoad(){ var observer = document.getElementById("pc"); setListener(observer, "change", checkSpec); } setListener(window, "load", initOnLOad); //]]>
selectMenu.js
//<![CDATA[ function checkSpec(){ $(“result”).innerText = “選択結果: ” + $("pc").value; } function initOnLoad(){ setListener($(“pc”), "change", checkSpec); } setListener(window, "load", initOnLoad); //]]>
Prototype.js
187
セレクトメニュー 絞り込み検索
188
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Select2</title>
<link type="text/css" rel="stylesheet" href="../lib/style.css"/>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript" src="../lib/prototype.js"></script>
<script type="text/javascript">
//JavaScript
</script>
</head>
<body>
<center class="t3">Select Menu2</center>
<table width="440" align="center">
<tr>
<td width="90" align="right">クラス1項目</td>
<td width="130" id="class1">
<select><option value="">-----クラス1選択-----</option></select>
</td>
<td width="90" align="right">クラス2項目</td>
<td width="130"id="class2">
<select><option value="">-----クラス2選択-----</option></select>
</td>
</table>
</body>
</html>
selectMenu2.htm 1/4
189
//<![CDATA[
Var xhrObj = getXhrObj();
function getClass1(){
xhrObj.open('get', 'getClass1Sel.php’);
xhrObj.onreadystatechange = getClass1Resp;
xhrObj.send(null);
}
function getClass1Resp(){
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
var resRows = xhrObj.responseText.split(“<r>");
var out = '<select id="class1List">'
+ '<option value="">----クラス1選択----</option>';
for(var i = 0; i < resRows.length; i++){
var resRow = resRows[i].split(“<i>");
for(var j = 0; j < resRow.length; j++){
if(j==0){
class1_code = resRow[j];
}else{
out += '<option value=' + class1_code + '>' + resRow[j] + '</option>';
}
}
}
out += '</select>';
$("class1").innerHTML = out;
}
}
}
selectMenu2.htm 2/4
190
function getClass2(){
var class1_code = $("class1List").value;
xhrObj.open('get', 'getClass2Sel.php?class1_code='+class1_code, false);
xhrObj.onreadystatechange = getClass2Rv;
xhrObj.send(null);
}
function getClass2Rv(){
var i, j, resRows, resRow, out, out3, code;
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
resRows = xhrObj.responseText.split(“<r>");
out = '<select id="class2List">'
+ '<option value="">---クラス2選択済---</option>';
for(i = 0; i < resRows.length; i++){
resRow = resRows[i].split(“<i>");
for(j = 0; j < resRow.length; j++){
if(j==0){
class2_code = resRow[j];
}else{
out += '<option value=' + class2_code + '>' + resRow[j] + '</option>';
}
}
}
out += '</select>';
$("class2").innerHTML = out;
setListener($("class2List"), "change", getClass3);
}
}
}
selectMenu2.htm 3/4
191
function getClass3(){
alert($("class2List").value);
}
Function initOnLoad(){
setListener($("class1List"), "change", getClass2);
}
setListener(window, "load", initOnLoad);
setListener(window, "load", getClass1,);
selectMenu2.htm 4/4
192
<html>
<head>
<title>ActiveWidgets Examples</title>
<script src="../awidgets/runtime/lib/aw.js"></script>
<link href="../awidgets/runtime/styles/xp/aw.css" rel="stylesheet"></link>
</style>
</head>
<body class="aw-background-1">
<table>
<tr>
<td><p>Combo:</p><span id="combo1"></span></td>
</tr>
<script>
var itemTextArray = ["Home", "Favorites", "Font size", "Search"];
var itemImageArray = ["home", "favorites", "fontsize", "search"];
var combo = new AW.UI.Combo;
combo.setId("combo1");
combo.setControlText("Combo");
combo.setControlImage("favorites");
combo.setItemText(itemTextArray);
combo.setItemImage(itemImageArray);
combo.setItemCount(4);
combo.refresh();
</script>
</body>
</html>
コンボボックス
http://cs001.spacewarp.co.jp:8080/ajax/awidgets/combo-w.htm
ActiveWidgetsコントロールサンプル
193
Ajax演習-5
従業員番号から氏名表示 従業員番号をセレクトメニューからの 選択表示に変更 ※従業員番号のセレクトメニュー設定も非同期 通信で動的に行ってください。 解答はselect-base.htmのAAAAA~FFFFF
を埋める形で行って下さい。
194
(5)UI表示 5 DOMを使用してイベントの相互作用と動的な画面表示を行う dynamic display and interaction using the Document Object Model
195
DOMとDynamicHTML(DHTML)
1997年 Microsoft、Netscape:DynamicHTML HTMLに独自の拡張機能をそれぞれのWebブラウザに組み込んだ。 =>両社で仕様が違うため、Webブラウザごとで表示が異なる。 1998年 W3CXML:DOM XMLやHTMLなどをコントロールするための言語非依存 のAPIである「DOM(Document Object Model)」を勧告。 =>W3Cでは、DHTMLを「ベンダー固有のマーケティング用語」として 扱っているため、各勧告の中にも「Dynamic HTML」や「DHTML」と いった表現は採用されていない。
DOMオブジェクト (ツリー構造文書)
DOM API (言語非依存)
DynamicHTML
W3C勧告
Microsoft JScriptに実装 NetScape JavaScriptに実装
196
Ajaxモデルでの動的表示方式
1. HTMLタグの流し込み
2. DOMノード操作での動的ノード生成
3. XSLT(スタイルシート)での動的画面生成
4.画像ファイルの非同期ダウンロード
197
DOMノード操作概要
ノードの種類 ・要素ノード (element node) ・属性ノード (attribute node) ・テキストノード(text node)
<div id=“id1” class=“class1”>DOMノード操作</div>
要素ノード <div>
テキストノード DOMノード操作
属性ノード id=“id1” , class=“class1”
例]
198
インタフェース名 概要 Node DOMツリーの一つのノードを表す。 以下は全てNodeインタフェースの継承。 Attr 属性を表す CharacterData 文字データを表す Text CharacterDataを継承し、 要素や属性の内容の文字列を表す Comment CharacterDataを継承し、 コメントの内容の文字列を表す CDATASection Textを継承し、CDATAセクションを表す Document XML文書全体を表す DocumentFragment DOMツリーの一部を表す DocumentType DTDを表す Element 要素を表す Entity 実体を表す EntityReference 実体参照を表す Notation ノーテーションを表す ProcessingInstruction 処理命令を表す
参考]DOMツリーのノードの種類
199
body 要素
table 要素
tbody 要素
id=“obs”
属性
tr 要素
tr 要素 id=“tgt1”
属性
id=“tgt2”
属性
td 要素
td 要素
td 要素
td 要素
“埼玉”
テキスト “千葉”
テキスト
“神奈川”
テキスト “山梨”
テキスト
h1 要素
“東京近県”
テキスト
DOMツリーとノード
要素:要素ノード
属性:属性ノード
テキスト:テキストノード
document html
200
xhrObj.onreadystatechange = function(){ if(xhrObj.readyState == 4){ if(xhrObj.status == 200){ finalItems = xhrObj.responseText.split(“<i>"); for(var i in finalItems){ tagNode = document.createElement("p"); tagNode.setAttribute("id", finalItems[i]); docNode = document.createTextNode('[0] '+finalItems[i]); tagNode.appendChild(docNode); document.getElementById("tree").appendChild(tagNode); } } } }
(1) DOMノード操作サンプル
201
[1] ノードの参照
PreviousSibling
firstChild lastChild getAttribute
202
getAttribute メソッド
書式] object.getAttribute('attributeName‘ [, 'type‘]) 説明] オブジェクトの指定された属性の値を返す。 引数] attributeNameは属性の名前を指定。 typeは種類を指定。次のいずれか。 0(アトリビュート名の大文字小文字の区別をしない) 1(アトリビュート名の大文字小文字の区別をする) 2(値を返す) 返値] アトリビュートの値 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
属性ノードの参照
203
getAttributeメソッド
204
function domFunc(){ var i, rows = 3, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementById("emp_no").getAttribute("type")'; elm[1][0] = 'document.getElementById("emp_no").getAttribute("size")'; elm[2][0] = 'document.getElementById("emp_no").getAttribute("id")'; elm[0][1] = document.getElementById("emp_no").getAttribute("type"); elm[1][1] = document.getElementById("emp_no").getAttribute("size"); elm[2][1] = document.getElementById("emp_no").getAttribute("id"); var view = "<table border='1' width='430'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='center'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; }
getAttribute.htm
205
getAttributeNode メソッド
書式] object.getAttributeNode('attributeName') 説明] オブジェクトの指定された属性のノード値を返す。 引数] AttributeNameは属性名を指定。 返値] attributeオブジェクトを返す。 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
属性ノードの参照
206
var value1 = document.getElementById(“id1”).getAttributeNode(“id”).nodeType; =>value1に 2(属性ノードのノードタイプ) が返される。 var value1 = document.getElementById(“id1”).getAttributeNode(“id”).nodeName; =>value1に “id”(id属性の属性名) が返される。 var value1 = document.getElementById(“id1”).getAttributeNode(“id”).nodeValue; =>value1に “id1”(id属性の属性値) が返される。 ※.getAttributeNodeメソッドの引数に”name”を指定すれば、name属性に関して 同様の値が参照される。.
getAttributeNodeサンプル
207
getAttributeNodeメソッド
208
function domFunc(){ var i, rows = 3, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementById("emp_no").getAttributeNode("size").nodeType'; elm[1][0] = 'document.getElementById("emp_no").getAttributeNode("size").nodeName'; elm[2][0] = 'document.getElementById("emp_no").getAttributeNode("size").nodeValue'; elm[0][1] = document.getElementById("emp_no").getAttributeNode("size").nodeType; elm[1][1] = document.getElementById("emp_no").getAttributeNode("size").nodeName; elm[2][1] = document.getElementById("emp_no").getAttributeNode("size").nodeValue; var view = "<table border='1' width='500'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='center'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; }
getAttributeNode.htm
209
属性ノードの参照 サンプルプログラム-2
210
revattr2.htm
//<![CDATA[ function revNode(){ var out = "<br/>"; var tags = tn("*"); for(var i = 0; i < tags.length; i++){ if(tags[i].getAttributeNode("id").nodeValue != ""){ out += "ノードタイプ:" + tags[i].getAttributeNode("id").nodeType; out += " ノード名:" + tags[i].getAttributeNode("id").nodeName; out += " ノード値:" + tags[i].getAttributeNode("id").nodeValue ; out += "<br/>" } } $("status").innerHTML = out; } function initOnLOad(){ setListener($("sel"), "click", revNode); } setListener(self, "load", initOnLOad); //]]> 211
3.子ノードの参照
var value1 = document.getElementById(“id1”).firstChild.nodeType; =>value1に ID属性で値”id1を持つノード、つまり<p>タグの最初の子ノード ” DOMノード参照1”のノードタイプ3(テキストノードのノードタイプ) が返される。 var value1 = document.getElementById(“id1”).firstChild.nodeValue; =>value1に ” DOMノード参照1”が返される。 childnodesは子ノード総てのリストを返し、インデックスで第何子かを指定 することができる。 var value1 = document.getElementById(“div1”).childNodes.nodeName; =>value1にはdivタグの子ノードすべてが配列で返される。 var value1 = document.getElementById(“div1”).childNodes[0].nodeName; => value1にはdivタグの最初の子ノードが返される。
212
firstChild プロパティ
書式] object.firstChild 説明] オブジェクトの最初の子ノードを返す。 firstChildはchildNodes[0]と同じになる 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
lastChild プロパティ
書式] object.firstChild 説明] オブジェクトの最後の子ノードを返す。 firstChildはchildNodes[object.childNodes.length-1]と同じになる 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
子ノードの参照
213
firstChild,lastChildプロパティ
214
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var i, rows = 2, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementsByTagName("tr")[1].fitstChild.firstChild.nodeValue'; elm[1][0] = 'document.getElementsByTagName("tr")[1].lastChild.firstChild.nodeValue'; elm[0][1] = document.getElementsByTagName("tr")[0].firstChild.firstChild.nodeValue; elm[1][1] = document.getElementsByTagName("tr")[0].lastChild.firstChild.nodeValue; var view = "<table border='1' width='550'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='center'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; }
fastLastChild.htm (1/2)
215
function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div><hr /> <center> <h3>fistChild,lastChildプロパティ</h3> <div id="view"></div> </center> </body> </html>
fastLastChild.htm (2/2)
216
childNodes コレクション
書式] object.childNodes object.childNodes[index] object.childNodes.length 機能] オブジェクトの子ノードを返す。 評価値は配列で最初の子ノードは0番になる。 引数] id属性値。 返値] 子ノードオブジェクトの配列 適用] object 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
子ノードの参照
217
childNodesプロパティ
218
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var i, rows = 2, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementsByTagName("tr")[0].childNodes[0].firstChild.nodeValue'; elm[1][0] = 'document.getElementsByTagName("tr")[0].childNodes[1].firstChild.nodeValue'; elm[0][1] = document.getElementsByTagName("tr")[0].childNodes[0].firstChild.nodeValue; elm[1][1] = document.getElementsByTagName("tr")[0].childNodes[1].firstChild.nodeValue; var view = "<table border='1' width='600'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='center'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; }
childNodes.htm
219
hasChildNodes メソッド 書式] object.hasChildNodes() 機能] 子ノードがあるかどうか返す。 子ノードがある場合はtrue、ない場合はfalseを返す。 引数] id属性値。 返値] 真偽値 適用] object 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
子ノードの参照-3
function check() { if ($("sample").hasChildNodes()) { alert(“子ノードがあります。”); } else { alert(“子ノードがありません。”); } }
220
hasChildNodesメソッド
221
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var nodes = document.getElementsByTagName("td"); for(var i = 0; i < nodes.length; i++){ if(nodes[i].hasChildNodes){ alert("子ノードがあります"); }else{ alert("子ノードがありせん"); } } } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); }
hasChildNodes.htm
222
setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> <hr /> <center> <h3>hasChildNodesメソッド</h3> <div id="view"></div> </center> </body> </html>
hasChildNodes.htm
223
3.兄弟ノードの参照(nextSibling、previousSibling) ・兄弟ノードはnextSiblingメソッドで参照することができる。 ・firstChild.で長子が参照されたあとnextSiblingの適用で次子が参照される。 var value1 = document.getElementById(“id1”).nextSibling.nodeName; =>value1に次の兄弟ノードのタグ名が返される。 ・次子から三子、四子とたどっていく場合にはnextSiblingを連結して適用していく 例] document.getElementById(“id1”).nextSibling.nextSibling.nextSibling.nodeValue;
4.親ノードの参照(parentNode) 親ノードはparentNodeプロパティで参照される。 var value1 = document.getElementById(“id1”).parentNode.nodeName; =>value1に ”DIV”(親ノードのタグ名) が返される。
224
nextSibling プロパティ 書式] object.nextSibling 機能] オブジェクトの次の兄弟ノードを参照する。 返値] ノードオブジェクトの参照 適用] 多くのノードオブジェクト 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
兄弟ノードの参照
previousSibling プロパティ 書式] object.previousSibling 機能] オブジェクトの前の兄弟ノードを参照する。 返値] ノードオブジェクトの参照 適用] 多くのノードオブジェクト 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
225
nextSibling、previousSibling
226
siblingNode.htm
(1/2) <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var i, rows = 2, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementsByTagName("td")[0].nextSibling.firstChild.nodeValue'; elm[1][0] = 'document.getElementsByTagName("td")[1].previousSibling.firstChild.nodeValue'; elm[0][1] = document.getElementsByTagName("td")[0].nextSibling.firstChild.nodeValue; elm[1][1] = document.getElementsByTagName("td")[1].previousSibling.firstChild.nodeValue; var view = "<table border='1' width='600'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='left'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; } 227
siblingNode.htm
(2/2)
function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div><hr /> <center> <h3>nextSibling,previousSiblingプロパティ</h3> <div id="view"></div> </center> </body> </html> 228
parentNode プロパティ 書式] object.parentNode 機能] 親ノードを参照する。 適用] object 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
親ノードの参照
229
parentNodeプロパティ
230
parentNode.htm (1/2)
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var i, rows = 2, cols = 2, elm = new Array(rows); for(i = 0; i < rows; i++ ){ elm[i] = new Array(cols); } elm[0][0] = 'document.getElementsByTagName("input")[1].parentNode.firstChild.nodeValue'; elm[1][0] = 'document.getElementsByTagName("input")[2].parentNode.firstChild.nodeValue'; elm[0][1] = document.getElementsByTagName("input")[1].parentNode.firstChild.nodeValue; elm[1][1] = document.getElementsByTagName("input")[2].parentNode.firstChild.nodeValue; var view = "<table border='1' width='600'><tbody>" + "<tr><th>メソッド</th></th><th>値</th></tr>" for(i = 0; i < rows; i++){ view += "<tr><td align='left'>"+elm[i][0] + "</td><td align='center'>"+elm[i][1]+"</td></tr>"; } view += "</tbody></table>"; document.getElementById("view").innerHTML = view; } 231
parentNode.htm (2/2)
function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div><hr /> <center> <h3>parentNodeプロパティ</h3> <div id="view"></div> </center> </body> </html> 232
body 要素
table 要素
tbody 要素
id=“obs”
属性
h1 要素
“東京近県”
テキスト
createElement createElement
createTextNode
setAttribute
[2] ノードの追加
233
appendChild
createElement メソッド 書式] object.createElement(element)
機能] 引数で指定したエレメントを生成する。 引数] 要素(エレメント)の名前 戻値] 作成したオブジェクト。 適用] document 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
例] divノードの生成 var div1= document.createElement(“div");
要素ノードの生成
234
createTextNode メソッド 書式] object.createTextNode(text) 機能] 引数で指定されたテキストノードを生成する 引数] 作成するテキスト 返値] TextNodeオブジェクト 適用] document 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
例] テキストノード “Ajax基礎講座” を生成 var text1 = document.createTextNode(“Ajax基礎講座");
テキストノードの生成
235
appendChild メソッド 書式] object.appendChild(newChild) 機能] 要素オブジェクトに引数指定のオブジェクトを追加する。 引数] 追加する子ノードオブジェクト 返値] ノードオブジェクト 適用] 多くのタグ 対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
ノードの追加
function add() { var newNode = document.createElement("LI"); var text = document.createTextNode(“追加しました。”); newNode.appendChild(text); var parent = document.getElementById("sample"); parent.appendChild(newNode); } 236
例]
ノードの生成
237
createNode.htm (1/2)
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var eNode = document.createElement("div"); var tNode = document.createTextNode("追加されたテキストノード"); eNode.appendChild(tNode); document.getElementById("view").appendChild(eNode); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head>
238
createNode.htm (2/2)
<body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> <hr /> <center> <h3>createElement,createTextNode,appendChild</h3> <div id="view"></div> </center> </body> </html>
239
属性ノードの追加
setAttribute メソッド
書式]object.setAttribute('attributeName', 'value', ['type‘] ) 機能] オブジェクトに、引数で指定された属性を追加する。
引数] attributeNameはアトリビュート名を指定。 valueは値を指定。 typeは種類を指定。次のいずれか。 0(アトリビュート名の大文字小文字の区別をしない) 1(アトリビュート名の大文字小文字の区別をする)
返値] なし
例] div1 = document.createElement(“div"); div1.setAttribute("id", “id1”]);
240
属性の追加
241
setAttribute.htm (1/2)
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ document.getElementById("emp_no").setAttribute("class", "class1"); var attr = document.getElementById("emp_no").getAttribute("class"); alert("属性値 = "+attr+" のclass属性が追加された。"); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script>
242
setAttribute.htm (2/2)
</head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> <hr /> <center> <h3>setAttribute,getAttribute</h3> <div id="view"></div> </center> </body> </html>
243
属性の変更は、属性の上書き(setAttribute)で可能
244
setAttribute2.htm (1/2)
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ document.getElementById("emp_no").setAttribute("size", “20”); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head>
245
setAttribute2.htm (2/2)
<body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 変更 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="8" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> <hr /> <center> <h3>setAttributeメソッド</h3> </center> </body> </html>
246
insertBefore メソッド
書式] object.insertBefore(newNode, existingNode)
機能] objectで指定されたノード内で、第2引数で指定された既存ノード オブジェクトの前に指定された新しいノードオブジェクトを挿入する。 引数] newNode: 新しいノードオブジェクトを指定。 existingNode: 既存のノードオブジェクトを指定。 戻値] ノードオブジェクト。
対応] [IE5~][Firefox 1~][Safari 1~][Opera 8~][Netscape 6~]
既存ノードの前に新規ノードオブジェクトを挿入する
247
insertBefore
248
insertBefore.htm (1/2)
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var divNode = document.createElement("div"); var textNode = document.createTextNode("情報システム部") divNode.appendChild(textNode); preNode = document.getElementsByTagName("table")[0]; document.getElementsByTagName("div")[0].insertBefore(divNode, preNode); }
249
insertBefore.htm (2/2) function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <div align="center"> <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html> 250
replaceChild メソッド
書式] object.replaceChild(newNode, oldNode)
機能] オブジェクトの指定された子ノードオブジェクトを置き換える。
引数] newChildは新しい子供のノードオブジェクトを指定。 oldChildは古い子供のノードオブジェクトを指定。
返値] ノードオブジェクトを返す。
子ノードの置き換え
function change() { var node = document.getElementById("sample"); var oldNode = node.firstChild; var newNode = document.createTextNode(“新しいノード”); node.replaceChild(newNode, oldNode); }
251
replaceChild
252
replaceChild.htm(1/2)
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var parNode = document.getElementsByTagName("td")[1]; var curText = parNode.firstChild; var newText = document.createTextNode("所属部署"); parNode.replaceChild(newText, curText); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); 253
replaceChild.htm(2/2)
//]]> </script> </head> <body> <div align="center" > <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html>
254
テキストの挿入
insertData メソッド
書式] object.insertData(‘offset’, ‘text’)
機能] オブジェクト(object)に、第2引数で指定されたテキストを 挿入する。 引数] offsett:既存テキストの、どの文字位置にテキストを挿入 するかを指定する。 text:挿入されるテキストリテラル。 ※テキスト位置は英数字と漢字を区別しないで指定可能。 適用] テキストノード、コメント 返値] なし
255
insertData
256
insertData.htm 1/2 <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var parNode = document.getElementsByTagName("td")[1]; parNode.firstChild.insertData(3, "部署と");; } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]> </script>
257
insertData.htm 2/2
</head> <body> <div align="center" > <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html>
258
その他のノード追加用DOMメソッド
object.insertCell(index)
・TDオブジェクトを挿入
object.insertRow(index)
・TRオブジェクトを挿入
object.insertAdjacentText('type','text')
・オブジェクトの指定された位置に隣接するテキストを挿入
object.insertAdjacentHTML('type','HTML')
・オブジェクトの指定された位置に隣接するHTMLを挿入
object.replaceAdjacentText('type','text')
・指定された位置に隣接するテキストを置換
object.replaceNode(oNode)
・オブジェクトの指定されたノードオブジェクトを置換
object.replace('URL')
・locationオブジェクトの指定されたURLを置換 259
removeNode メソッド
書式] object.removeNode(“value”) 機能] 指定されたノードオブジェクトを削除する。 引数] valueは値を指定。次のいずれか。 true(childNodesコレクションを含める) false(childNodesコレクションを含めない) 返値] ノードオブジェクトを返す。
[3] ノードの削除
ノードオブジェクトを削除
260
ノードオブジェクトの削除
261
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var target = document.getElementById("emp_name"); target.parentNode.removeNode(true); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad);
removeNode.htm 1/2
262
//]]> </script> </head> <body> <div align="center" > <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html>
removeNode.htm 2/2
263
removeChild メソッド
書式] pnode.removeChild(cnode) 機能] オブジェクトの指定された子ノードオブジェクトを 削除する。 引数] pnode:親ノードオブジェクト。 cnode:子ノードオブジェクト。 返値] ノードオブジェクト。 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
子ノードオブジェクトを削除する
264
ID値id1を持つ親ノードの3番目の子ノードを削除 function remove() { var parentNode = document.getElementById(“id1"); parentNode.removeChild(parentNode.childNodes[2]); } ID値id1を持つノード自身を削除する function remove() { var selfNode = document.getElementById(“id1"); selfNode.parentNode.removeChild(selfNode); }
removeChild サンプル
265
子ノードの削除
266
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>DOMノード操作</title> <script type="text/javascript" src="../lib/funcs.js"></script> <script type="text/javascript"> //<![CDATA[ function domFunc(){ var target = document.getElementById("emp_name"); target.parentNode.removeChild(target); } function initOnLoad(){ var observer = document.getElementById("sel"); setListener(observer, "click", domFunc); } setListener(window, "load", initOnLoad); //]]>
removeChild.htm 1/2
267
</script> </head> <body> <div align="center" > <h3>従業員番号から氏名表示<input type="button" id="sel" value=" 表示 "/></h3> <table> <tbody> <tr> <td>従業員番号:<input type="text" size="10" id="emp_no" /></td> <td>従業員氏名:<input type="text" size="14" id="emp_name" /></td> </tr> </tbody> </table> </div> </body> </html>
removeChild.htm 2/2
268
removeAttribute メソッド 書式] object.removeAttribute('attributeName', ['type‘]) 機能] オブジェクトの指定された属性値を削除する。 引数] attributeName:アトリビュート名を指定。 type:は種類を指定。次のいずれか。 0(アトリビュート名の大文字小文字の区別をしない) 1(アトリビュート名の大文字小文字の区別をする) 返値] true(削除)、false(非削除) 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
例] $(“id1”). removeAttribute(‘name', 0)
属性(attribute)を削除
269
Ajax演習-6
従業員番号から氏名表示 選択従業員番号と氏名を画面下部 に履歴表示して下さい。 解答はseldom-base.htmのAAAAA~FFFFF
を埋める形で行って下さい。
270
4. XMLとXSLTを使用したデータ交換と操作を行う data interchange and manipulation using XML and XSLT
XML/XSLT
271
XMLドキュメント
スタイルシート
XMLデータの受信と表示-1 ・製品選択項目クリックで対応する商品一覧を表示 ・XMLファイルをサーバから受け取る。 ・DOMノード操作で画面表示を行う。
製品選択項目
製品一覧
272
XHTML
JavaScript関数
XMLデータの受信と表示-1 機能概要
XMLファイル
XHR
DOMオブジェクト
データの取出し
データ組立・表示
[使用ファイル] HTMLファイル xmlSmpl1.htm XMLファイル xml1.xml
JavaScript外部フィル funcs.js
サーバ環境
マウスクリックイベント
273
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="xml2.xsl" type="text/xsl" ?>
<mart>
<computer>
<model>PCモデル1</model>
<os>WindowsXP Home</os>
<cpu>Celeron2 Ghz</cpu>
<memory>SDRAM 256MB</memory>
<hdd>40GB 7200rpm</hdd>
<dvd>CD-ROM</dvd>
<display>NA</display>
<price>62,000</price>
</computer>
<computer>
<model>PCモデル2</model>
<os>WindowsXP Pro</os>
<cpu>Celeron2 Ghz</cpu>
<memory>SDRAM 512MB</memory>
<hdd>60GB 7200rpm</hdd>
<dvd>CD-RW</dvd>
<display>15インチ液晶</display>
<price>72,000</price>
</computer>
<computer>
<model>PCモデル3</model>
<os>WindowsXP Pro</os>
<cpu>Pentium4 2Ghz</cpu>
<memory>SDRAM 512MB</memory>
<hdd>60GB 7200rpm</hdd>
<dvd>CDROM DVD</dvd>
<display>17インチ液晶</display>
<price>72,000</price>
</computer>
<computer>
<model>PCモデル4</model>
<os>RedHat9</os>
<cpu>Pentium4 2Ghz</cpu>
<memory>SDRAM 512MB</memory>
<hdd>80GB 7200rpm</hdd>
<dvd>CD-ROM</dvd>
<display>NA</display>
<price>72,000</price>
</computer>
<computer>
<model>PCモデル5</model>
<os>Fedora Core4</os>
<cpu>Pentium4 3Ghz</cpu>
<memory>SDRAM 1GB</memory>
<hdd>80GB 7200rpm</hdd>
<dvd>CD-ROM</dvd>
<display>19インチ液晶</display>
<price>72,000</price>
</computer>
</mart>
XMLファイル(xml1.xml)
274
XMLHttpRequestオブジェクト
responseXMLプロパティ 書式] readonly Document responseXML 機能] リクエストに対する応答はtext/xmlストリームとして解釈される。 属性のDocumentはレスポンスがDOMドキュメントオブジェクトで あることを表している。 リクエストが不成功の場合、または完了していない場合はNULLが 返される。
例] xhrObj.onreadystatechange = function() { if (xhrObj.readyState == 4) { if(xhrObj.status==200) { var xmlVal = xhrObj.responseXML; : } } }
※Internet Explorerの場合、受信データはUnicode文字列として解釈される。
275
getElementsByTagName メソッド
書式] object. getElementsByTagName(“タグ名”) 機能] 指定したタグ名を持つオブジェクト(要素ノード)を配列形式で返す 引数] タグ名 返値] オブジェクトの参照 適用] document 対応] [IE5~][Firefox1~][Safari1~][Opera8~][Netscape6~]
要素ノードの参照
※ワイルドカード “*” で総てのノード要素を指定することが出来る。 ※funcs.jsでショートカット関数が用意されている。 例] document.getElementsByTagName(“div”);
↓
tn(“div”); // funcs.js
276
<?xml version="1.0" encoging="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Ajax Sample1</title>
<style type="text/css">
#items {background-color: #ccffcc}
</style>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript" src="../lib/prototype.js"></script>
<script type="text/javascript">
//<![CDATA[
var httpObj;
function reqItems(e){
var reqXmlUri = "xmldoc/xml" + getid(e).substr(4,1) +".xml";
new Ajax.Request(reqXmlUri, {method:'get', onComplete:out});
}
xmlSmp1.htm 1/3
277
function out(data){
var resXml = data.responseXML;
var model = resXml.getElementsByTagName("model");
var os = resXml.getElementsByTagName("os");
var cpu = resXml.getElementsByTagName("cpu");
var memory = resXml.getElementsByTagName("memory");
var hdd = resXml.getElementsByTagName("hdd");
var price = resXml.getElementsByTagName("price");
var out = '<table align="center" border="1">'
+ '<tr bgcolor="#ccffcc">'
+ '<th>モデル</th><th>OS</th><th>CPU</th>'
+ '<th>メモリ</th><th>ハードディスク</th><th>価格</th>'
+ '</tr>';
for(var i = 0; i < model.length; i++){
out += '<tr><td>' + model[i].firstChild.nodeValue + '</td>'
+ '<td>' + os[i].firstChild.nodeValue + '</td>'
+ '<td>' + cpu[i].firstChild.nodeValue + '</td>'
+ '<td>' + memory[i].firstChild.nodeValue + '</td>'
+ '<td>' + hdd[i].firstChild.nodeValue + '</td>'
+ '<td>' + price[i].firstChild.nodeValue + '</td></tr>';
}
out += '</table>';
$("out").innerHTML = out;
}
xmlSmp1.htm 2/3
278
Function initOnLoad(e) {
setListener($("items"), "click", reqItems);
}
setListener(window, "load", initOnLoad);
//]]>
</script>
</head>
<body>
<table border="1" align="center" width="600">
<tr id="items">
<td align="center" id="item1">デスクトップ</td>
<td align="center" id="item2">ノート PC</td>
<td align="center" id="item3">サーバ製品</td>
<td align="center" id="item4">周辺機器</td>
<td align="center" id="item5">プリンタ</td>
</tr>
</table>
<br />
<div id="out"></div>
</body>
</html>
xmlSmp1.htm 3/3
279
XML(eXtensoble Markup Language) :文書やデータの意味や構造を記述するためのマークアップ言語。 SGML(ISO8879)のサブセットであり、XML文書は,必ずSGML規格に適合する。 仕様策定:W3C 策定目的:任意のデータを HTMLと同様の感覚で送受信できることを目標に作成された XML ドラフト (1996年11月) XML ver1.0勧告 (1998年2月) XML ver1.0 Second Edition勧告 (2000年10月)
XSLT(XML Stylesheet Language Transformations) :XML文書の構造を別の形式に変形するための変換ルールを記述する言語で、 記述されたXSLT文書はスタイルシート(XSLスタイルシート)と呼ばれる。 出力形式は、XML、HTML、プレインテキストなどがある。 仕様策定:W3C XSLT ドラフト (1999年10月) XSLT ver1.0勧告 (1998年2月) XSLT ver1.0 Second Edition勧告 (2000年10月)
(1) XMLとXSLT
280
・XSLT言語
・XPath
XML文書
(データ)
XSLTプロセッサ
・MSXML :IE
・Xalan :Apache
・XT :Java
など
XSLT
スタイルシート
変換後文書
・HTML,XHTML
・テキスト文書
など
(2) XML/XSLTとXSLTプロセッサ
abc.xml
xyz.xsl
※XMLデータをHTMLと 同じようにWebブラウザ に表示するには、XSLT スタイルシートが必要。
※XSLスタイルシート を変えることにより、同 じXML文書のWebブラウ ザでの表現を変える事 ができる。
XML文書オブジェクト名.transformNode(スタイルシートオブジェクト名);
281
<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="/"> <table width="400" border="1"> <tr> <th width=“200”>タイトル</th> <th width=“100”>ページ数</th> <th width=“100”>価格</th> </tr> <xsl:for-each select="/book/computer"> <tr> <td align="left"><xsl:value-of select="title" /></td> <td align="right"><xsl:value-of select="page" /></td> <td align="right"><xsl:value-of select="price" /></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
(3) XSLスタイルシート例
282
XMLデータの受信と表示-2 ・製品選択項目クリックで対応する商品一覧を表示 ・XMLファイル、 スタイルシートをサーバから受け取る。 ・ブラウザ内蔵のパ-サを利用して画面表示を行う。
283
XHTML JavaScript
Ajaxサンプルプログラム2 機能概要図
XMLファイル
XHR
[使用ファイル] HTMLファイル xmlSmpl2.htm XMLファイル xml1.xml, xml2.xml, xml5.xml XSLファイル xml1.xsl, xml2.xsl, xml5.xsl
JavaScript外部フィル funcs.js
スタイルシート
サーバ環境
XHR
イベントリスナ
イベント
XML
スタイルシート
XSLTパーサ
284
<?xml version="1.0" encoging="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Ajax Sample2</title>
<style type="text/css">
.items {background-color: #ccffcc}
</style>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript" src="../lib/prototype.js"></script>
<script type="text/javascript">
//<![CDATA[
function reqItems(e){
var xhrObj = getXhrObj();
xhrObj.open("get", "xmldoc/xml"+getid(e).substr(4,1)+".xsl" , false);
xhrObj.send(null);
var dataXsl = xhrObj.responseXML;
xhrObj.open("get", "xmldoc/xml"+getid(e).substr(4,1)+".xml" , false);
xhrObj.send(null);
var dataXml = xhrObj.responseXML;
$("out").innerHTML = dataXml.transformNode(dataXsl.documentElement);
}
xmlSmp2.htm
1/2
285
function initOnLoad(){
setListener($("item"), "click", reqItems);
}
setListener(window, "load", initOnLoad);
//]]>
</script>
</head>
<body>
<table id="item" border="1" align="center" width="600">
<tr class="items">
<td align="center" id="item1">デスクトップ</td>
<td align="center" id="item2">ノート PC</td>
<td align="center" id="item3">サーバ製品</td>
<td align="center" id="item4">周辺機器</td>
<td align="center" id="item5">プリンタ</td>
</tr>
</table>
<br />
<div id="out"></div>
</body>
</html>
xmlSmpl2.htm
2/2
286
<?xml version="1.0" encoging="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Ajax Sample2</title>
<style type="text/css">
.items {background-color: #ccffcc}
</style>
<script type="text/javascript" src="../lib/funcs.js"></script>
<script type="text/javascript" src="../lib/prototype.js"></script>
<script type="text/javascript">
//<![CDATA[
function reqItems(e){
var req = "xmldoc/xml"+getid(e).substr(4,1);
var xslDat = getsynx(req + ".xsl");
var xmlDat = getsynx(req + ".xml");
$("out").innerHTML = xmlDat.transformNode(xslDat.documentElement);
}
xmlSmp3.htm
1/2
287
function initOnLoad(){ setListener($("item"), "click", reqItems); } setListener(window, "load", initOnLoad); //]]> </script> </head> <body> <table id="item" border="1" align="center" width="600"> <tr class="items"> <td align="center" id="item1">デスクトップ</td> <td align="center" id="item2">ノート PC</td> <td align="center" id="item3">サーバ製品</td> <td align="center" id="item4">周辺機器</td> <td align="center" id="item5">プリンタ</td> </tr> </table> <br /> <div id="out"></div> </body> </html>
xmlSmp3.htm
2/2
288
JSON(JavaScript Object Notation)
JavaScriptにおけるオブジェクトの表記法をベースとした 軽量なデータ記述
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<children>
<girl>花子</girl>
<boy>太郎</boy>
<boy>次郎</boy>
</children>
{
“children”: {
“girl”: “花子”,
“boy”: [ “太郎”, “次郎” ]
}
}
XML
JSON
289
290
JSONデータの書式 オブジェクトと配列の組合せで構造化されたデータを表現する。
1.オブジェクトは{}で全体を囲み、キーと値のペアをコロン(:)で区切って記述。
カンマ(,)で複数のキーと値を記述できるが、キーには文字列のみ使用可能。
例: { "emp_no": "A0001", "emp_name": "山田太郎“}
2.配列は繰り返し項目を表現する際に使用する。
全体を[]で囲み、値をカンマ(,)で区切って列挙。
例: [“山田太郎”, “鈴木健児”, “田中佳子”]
3.構造化されたデータを表現するため、オブジェクトと配列を自由にネストさ
せることができる。
例: { “emp_name”: [“山田太郎”, “鈴木健児”, “田中佳子”]}
291
JSONプログラムの処理手順
1.非同期通信でJSONデータをテキストモードで受信
2. 受信データをeval()関数で評価
⇒受信データはJavaScriptのオブジェクトに変換される。
例] var resp = eval("(" + xhrObj.responseText + ")");
3.受信データオブジェクトから、連想配列と配列のアクセス形式
でデータを所得する。
例] var emp_no = resp.empmas.employee[i].emp_no;
or
var emp_no = resp["empmas"]["employee"][i]["emp_no"];
JSONデータで従業員情報表示
292
{ "empmas":
{ "employee":
[
{ "emp_no": "A0001", "emp_name": "山田太郎", "section": "総務部"},
{ "emp_no": "A0002", "emp_name": "鈴木健児", "section": "総務部"},
{ "emp_no": "A0003", "emp_name": "田中佳子", "section": "総務部"},
{ "emp_no": "A0004", "emp_name": "佐藤弘明", "section": "経理部"},
{ "emp_no": "A0005", "emp_name": "伊藤広志", "section": "人事部"}
]
}
}
jsonemp.txt
293
JSONのデータ形式
294
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>従業員情報表示</title>
<script type="text/javascript" src="../../lib/funcs.js"></script>
<script type="text/javascript">
//<![CDATA[
//JavaScriptコード
//]]>
</script>
</head>
<body>
<center>
<h4>
従業員情報表示<input type="button" value=" 表示 " id="sel" />
</h4>
<div id="view"></div>
</center>
</body>
</html>
jsonEmpAll.htm
295
function xhrFunc(){
var emp_id, emp_name;
var view = "<table width='300' border='1'><tbody>"
+ "<tr><th>従業員番号</th><th>氏名</th></th><th>所属</th></tr>";
var xhrObj = getXhrObj();
xhrObj.open("get", "jsonemp.txt");
xhrObj.setRequestHeader("If-Modified-Since", "01 Jan 2000 00:00:00 GMT");
xhrObj.send(null);
xhrObj.onreadystatechange = function(){
if(xhrObj.readyState == 4){
if(xhrObj.status == 200){
var resp = eval("(" + xhrObj.responseText + ")");
for(var i = 0; i < resp.empmas.employee.length; i++){
var emp_no = resp.empmas.employee[i].emp_no;
var emp_name= resp.empmas.employee[i].emp_name;
var section = resp.empmas.employee[i].section;
view+="<tr><td>"+emp_no+"</td><td>"+emp_name+"</td><td>"+section+"</td></tr>";
}
view += "</tbody></table>";
id("view").innerHTML = view;
}
}
}
}
function initOnLoad(){
setListener(id("sel"), "click", xhrFunc);
}
setListener(window, “load”, initOnLoad);
jsonEmpAll.htm
Ajax開発環境
Appendix
296
Windows Script Debugger http://www.microsoft.com/downloads/details.aspx?FamilyID=e606e71f-ba7f-471e-a57d-f2216d81ec3d&DisplayLang=ja
297
Firebug Firefoxアドオンの開発デバッグ環境
https://addons.mozilla.org/ja/firefox/addon/1843
298
Ajaxクライアント開発環境 – APTANA http://www.aptana.com
299
APTANA - メソッドのブラウザ対応表示
300