Dojo

2009年6月14日 (日)

Dojoのインストール (Dojo 1.3.1)

Dojoは http://dojotoolkit.org/downloads からダウンロードできます。基本機能のみで画面部品を含まないDojo Baseのみのパッケージと、すべてを含むパッケージ(Dojo + Dijit + DojoX)がダウンロードできます。

http://download.dojotoolkit.org/ からは、圧縮されていないコメント付きのソースコード(dojo-release-xxx-src.zip)、ドキュメント(dojo-release-xxx-doc.zip)、デモアプリ(dojo-release-xxx-demos.zip)もダウンロードできます。

Dojoを利用するときは、dojo/dojo.jsのロードが必要となります。

以下にDojoを利用した簡単な例を示します。

<html>
<head>
	<script type="text/javascript" src="./dojo/dojo.js"
			djConfig="isDebug: false, parseOnLoad: true"></script>

	<link id="themeStyles" rel="stylesheet" href="./dojo/resources/dojo.css">
	<link id="themeStyles" rel="stylesheet" href="./dijit/themes/tundra/tundra.css">

	<script type="text/javascript">
		dojo.require("dijit.dijit");
		dojo.require("dijit.form.Button");
		dojo.require("dojo.parser");

        function helloPressed(){
			alert('Hello World!');
		}

		function init(){
  			var helloButton = dijit.byId('helloButton');
			dojo.connect(helloButton, 'onClick', 'helloPressed');
		}

		dojo.addOnLoad(init);
   </script>
</head>
<body class="tundra">
	<button dojoType="dijit.form.Button" id="helloButton">Press Me</button>
</body>
</html>

Dojo 1.3.1のまとめ

Dojo 1.3.1について少しずつ書いていきます。ここはまとめページにします。

Dojo http://dojotoolkit.org/ は、The Dojo Foundationにより提供されているオープンソースのJavaScriptツールキットである。

Dojoは、Ajax呼び出しから、イベント処理、タブやツリーなどの各種GUI部品など、広範な機能を提供しており、機能ごとにファイルが分かれていて必要な機能だけを動的にロードする仕組みとなっているのが特徴となっている。ブラウザは、Safari 3.1, Opera 9.6 (Dojo Coreのみ), IE(Windows) 6.0~8.0, Firefox 1.5~3.0(DijitはFirefox 2以上のみ), Konqueror 3.5~(Dojo Coreのみ)に対応している。

概要

2008年6月19日 (木)

洋書ですが今月Dojoの本が3冊出てました。

Developing With Dojoは日本のAmazon.co.jpで4,781円ですが、米国のAmazon.comでは  $26.39  に日本への送料が $8.98で、合計 $35.37と米国のAmazon.comで買った方が安いです。他の2冊もだいたい同じですね。

Developing With Dojo Book Developing With Dojo

著者:Matthew Russell
販売元:Oreilly & Associates Inc
Amazon.co.jpで詳細を確認する

Mastering Dojo: Javascript and Ajax Tools for Great Web Experiences Book Mastering Dojo: Javascript and Ajax Tools for Great Web Experiences

著者:Craig Riecke,Rawld Gill,Alex Russell
販売元:Pragmatic Bookshelf
Amazon.co.jpで詳細を確認する

Dojo: Using the Dojo Javascript Library to Build Ajax Applications (Developer's Library) Book Dojo: Using the Dojo Javascript Library to Build Ajax Applications (Developer's Library)

著者:James Harmon
販売元:Prentice Hall Ptr
Amazon.co.jpで詳細を確認する

2007年8月21日 (火)

ページコンテナ

PageContainerを用いることで、ページを切り替えるようなレイアウトを作成できる。

まず、配置する場所に、属性 dojoType="PageContainer" を持つdiv要素を作成する。

このdiv要素の子要素に、各ページに配置するコンテナ要素を指定する。各ページの要素には、dojoType="ContentPane" 属性を指定する。以下の例では、3つのページを作成している。また、属性selected="true"を指定したページ要素がデフォルトの表示ページとなる。

<script type="text/javascript">
  dojo.require("dojo.widget.PageContainer");
  dojo.require("dojo.widget.ContentPane");
</script>
<style>
  .mycontainer {width:300px; height:200px; border:3px dashed aqua; margin: 1em;}
</style>
<div id="myPageContainer" dojoType="PageContainer" class="mycontainer">
  <p id="page1" dojoType="ContentPane" label="page 1">
    page1
  </p>
  <p id="page2" dojoType="ContentPane" selected="true" label="page 2">
    page2
  </p>
  <p id="page3" dojoType="ContentPane" label="page 3">
    page3
  </p>
</div>

 

    page1  

 

    page2  

 

    page3  

以下に、表示したPageContainerのページを切り替える例を示す。

PageControllerを作ることで、前ページのインデックスを作成できる。また、PageContainerのwidgetに対して、back()、forward()メソッドを呼ぶことで、ページを切り替えることもできる。

<script type="text/javascript">
  dojo.require("dojo.event.topic");

  function selected(page){
    dojo.byId("previous").disabled = page.isFirstChild;
    dojo.byId("next").disabled = page.isLastChild;
  }
  dojo.addOnLoad(function(){
    dojo.event.topic.subscribe("myPageContainer-selectChild", selected);
  });
</script>

<style>
  .dojoPageController .item { margin: 0px 5px 0px 5px; }
  .dojoPageController .selectButton { text-decoration: underline; cursor: pointer; margin-right: 3px;}
  .dojoPageController .closeButton { cursor: pointer; };
  .dojoPageController .item { color: #333366; }
  .dojoPageController .current { color: blue; font: bold;}
</style>

<button id="previous" onClick="dojo.widget.byId('myPageContainer').back()"><</button>
<div dojoType="PageController" containerId="myPageContainer"></div>
<button id="next" onClick="dojo.widget.byId('myPageContainer').forward()">></button>

2007年8月 8日 (水)

アコーディオン

AccordionContainerは、複数のタイトル付きブロックを作成する。このとき、常に表示されるブロックは1つのみとなる。 AccordionContainerの一つのブロックのみを見るとTitlePaneに似ている。

いずれかのタイトルをクリックすると、アコーディオンのように表示されていたブロックが閉じられ、クリックしたタイトルのブロックが表示される。

AccordionConpainerを利用するときは、dojo.widget.AccordionContainerをrequireする。まず、属性dojoType="AccordionContainer"を付けたdiv要素を作成し、その子要素としてContentPaneを並べる。このContentPaneがブロックになる。

AccordionContainerの属性として以下を指定できる。

属性概要
labelNodeClassタイトルに適用するCSSのクラス名
containerNodeClass中身に適用するCSSのクラス名
durationブロックの開閉にかかる時間

ContentPaneの属性として以下を指定できる。また、ContentPaneは onShow, onHideのイベントを指定できる。

属性概要
labelタイトルに表示する文字列
href表示するHTMLのURLを指定する。
selected最初に開いた状態で表示するブロックに対してtrueを指定する
<script type="text/javascript">
  dojo.require("dojo.widget.AccordionContainer");
  dojo.require("dojo.widget.ContentPane");
</script>

<div dojoType="AccordionContainer" duration="200" 
     labelNodeClass="label" containerNodeClass="accBody"
     style="float:left; width:300px; height:300px; overflow:hidden">

  <div dojoType="ContentPane" selected="true" label="Pane 1" style="overflow: scroll;">
    <p>Page1</p>
  </div>

  <div dojoType="ContentPane" label="Pane 2" style="display:none;">
    <p>Page2</p>
  </div>

  <div dojoType="ContentPane" label="Pane 3" style="display:none;">
    <p>Page3</p>
  </div>
</div>

Page1

Page2

Page3

2007年8月 5日 (日)

タイトルペイン

TitlePaneは、タイトルとその内容を表示し、タイトルをクリックすることで、その内容の表示/非表示を切り替えできる。

TitlePaneを作るときは、dojo.widget.TitlePaneをrequireし、属性 dojoType="TitlePane"を付けたdiv要素を作成する。TitlePaneのdiv要素には以下の属性を設定できる。

属性概要
labelタイトルに表示する文字列
labelNodeClassタイトルに適用するCSSのクラス名
containerNodeClass中身に適用するCSSのクラス名
href表示するHTMLのURLを指定する。
openfalseを指定すると、初期表示時に非表示となる。

TitlePaneのdiv要素の子要素がTitlePaneの内容となる。内容を子要素で指定するのではなく、href属性でURL指定することもできる。

<style type="text/css">
.label {
  width: 300px;
  background: #ffa500;
  border-top: 1px solid #dc143c;
  border-bottom: 1px solid #dc143c;
}
.content {
  width: 300px;
  background: #fff8dc;
}
</style>

<script type="text/javascript">
dojo.require("dojo.widget.TitlePane");
</script>

<div dojoType="TitlePane" label="タイトル" 
     labelNodeClass="label" containerNodeClass="content">
Dojo 0.4.2について少しずつ書いていきます。ここはまとめページ。

<p>Dojo http://dojotoolkit.org/ は、The Dojo Foundationにより
提供されているオープンソースのJavaScriptツールキットである。</p>

<p>Dojoは、Ajax呼び出しから、イベント処理、タブやツリーなどの
各種GUI部品など、広範な機能を提供しており、機能ごとにファイル
が分かれていて必要な機能だけを動的にロードする仕組みとなって
いるのが特徴となっている。ブラウザは、Safari 2.0.x, Opera 9.0+,
 IE(Windows) 6.0+, Firefox 1.0+/Mozilla, Konqueror 3.5+に対応
している。 </p>
</div>

Dojo 0.4.2について少しずつ書いていきます。ここはまとめページ。

Dojo http://dojotoolkit.org/ は、The Dojo Foundationにより 提供されているオープンソースのJavaScriptツールキットである。

Dojoは、Ajax呼び出しから、イベント処理、タブやツリーなどの 各種GUI部品など、広範な機能を提供しており、機能ごとにファイル が分かれていて必要な機能だけを動的にロードする仕組みとなって いるのが特徴となっている。ブラウザは、Safari 2.0.x, Opera 9.0+, IE(Windows) 6.0+, Firefox 1.0+/Mozilla, Konqueror 3.5+に対応 している。

2007年8月 3日 (金)

トースター

Toasterは、ブラウザの端からポップアップされるメッセージを表示する。Toasterを利用するときは、dojo.widget.Toasterをrequireする。

Toasterを作成するには、dojoType="toaster"を指定したdiv要素を作成する。positionDirection属性により表示する位置を指定できる。表示位置は、"br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"のように指定できる。

Toasterを表示する方法は、setContentメソッドを用いる方法と、dojo.event.topic.publishによりメッセージを発行する方法の2つがある。

setContent

Toaster widgetに対して、setContentメソッドを実行することでメッセージが表示される。setContentは、メッセージとして表示する文字列、メッセージの種類、メッセージの表示時間の3つの引数を指定して実行する。メッセージの種類には"MESSAGE", "WARNING", "ERROR", "FATAL"の4つのいずれかを指定できる。指定したメッセージの種類によって表示されるメッセージの背景色が変わる。

<script type="text/javascript">
dojo.require("dojo.widget.Toaster");

function showToasterMessage(){
  var toast = dojo.widget.byId("toast");
  toast.setContent('てすと', "MESSAGE", 500);
}
</script>

<div dojoType="toaster" id="toast" positionDirection="br-left"></div>
<button type="submit" onclick="showToasterMessage();">click</button>

publich

dojoType="toaster"を指定したdiv要素において、messageTopic属性としてtopic名を指定したとき、同じtopic名でメッセージを発行することで、Toasterのメッセージを表示することもできる。

<script type="text/javascript">
function showToasterMessage2(){
  dojo.event.topic.publish("testTopic", "てすと");
}
</script>

<div dojoType="toaster" id="toast2" positionDirection="br-left" showDelay="4000" messageTopic="testTopic"></div>
<button type="submit" onclick="showToasterMessage2();">click</button>

publishするメッセージは、文字列だけでなく、次のようなオブジェクトも指定できる。

  dojo.event.topic.publish("testTopic", {message: "てすと", type: "ERROR", delay: 500}););

2007年8月 1日 (水)

角丸

dojo.widget.Roundedを用いてHTML要素の角を丸くできる。

角を丸くしたいHTML要素にdojoType="rounded"を指定する。

<script type="text/javascript">
dojo.require("dojo.widget.Rounded");
</script>

<div dojoType="rounded" style="width:150px;background-color:#EAF2FF;">てすと</div>

てすと

以下の属性を指定することもできる。

属性概要
radius 角の半径。デフォルトは14
corners 4つの角のうち、どれを丸くするか。"TR,TL,BR,BL"のように指定する。"TR,BR"だと右上と右下の角がくなる
antiAlias アンチエリアス処理をするかtrueまたはfalseを指定する

ツールチップ

マウスを指定したHTML要素の上に置いたときに、説明などの情報をポップアップ表示するTooltipを作成できる。 Tooltipを作成するときは、dojo.widget.Tooltipをrequireする。

dojo.require("dojo.widget.Tooltip");

TooltipはdojoType="tooltip"を指定して作成する。このとき、connectId属性としてTooltipを付けるHTML要素のIDを指定する。dojoType="tooltip"を指定したHTML要素の子要素に、Tooltipとして表示する内容を指定する。

以下の例では、文字列「text」にマウスを置くと「てすと」とポップアップ表示される。

<div id="one">text</div>
<div dojoType="tooltip" connectId="one" toggle="explode">
  <div style="color: blue;">てすと</div>
</div>
text
てすと

Tooltipとして表示する内容は、子要素として指定するだけでなく、caption属性として文字列、href属性としてURL指定することもできる。

その他、Tooltipは以下の属性を指定できる。

属性概要
connectId Tooltipを付けるHTML要素のID
caption Tooltipとして表示する説明文。captionを指定したときは、Tooltip要素の子要素は不要
showDelay マウスを置いてからTooltipを表示するまでの時間
hideDelay マウスが外れてからTooltipを隠すまでの時間
toggle Tooltipの表示方法として、"plain", "wipe", "fade", "explode"のいずれかを指定できる
toggleDuration toggleで指定した効果の実行時間をミリ秒単位で指定する
href Tooltipに表示する内容としてHTMLのURLを指定する
executeScripts hrefでURLを指定したときにHTML内のJavaScriptを有効にするか、true/falseで指定する

2007年7月30日 (月)

ヘルプ付きのテキストボックス

div要素にdojoType="dropdowncontainer"を指定すると、ヘルプ付きのテキストボックスが作成される。 テキストボックスの右側にはアイコンが配置され、アイコンを押すと指定したヘルプ内容のHTML要素が表示される。 利用するときは、DropdownContainerをrequireする。

<script type="text/javascript">
  dojo.require("dojo.widget.DropdownContainer");
</script>

DropdownContainerのdiv要素は以下の属性を指定できる。その子要素にヘルプとして表示する内容を指定する。

属性概要
inputWidth テキストボックスのサイズ
inputId テキストボックスのId
inputName テキストボックスのname
iconURL アイコンのURL
iconAlt アイコンのalt属性
containerToggleDuration アイコンを押してからヘルプが表示されるまでの時間

 
<style type="text/css">
.popup {
  border: 3px solid blue;
  background-color: white;
  text-align:left;
}
</style>
<div dojoType="dropdowncontainer" id="foo">
  <div class="popup">
    入力フォームに名前を入力して下さい。<br/>
    必須入力です。
  </div>
</div>

分割レイアウト

SplitContainerを用いることで、上下または左右にレイアウト分割し、ユーザが分割位置を変更できる。 SplitContainerを使うときは、SplitContainerとContentPaneをrequireする。
dojo.require("dojo.widget.SplitContainer");
dojo.require("dojo.widget.ContentPane");

SplitContainerを配置する場所に、属性 dojoType="SplitContainer" を持つdiv要素を記述する。SplitContainerのdiv要素の子要素にレイアウト配置する要素を指定する。

SplitContainerのdiv要素はorientation属性を取り、レイアウト配置する各ContentPaneを垂直方向(horizontal)に並べるか、水平方向(vertical)に並べるかを指定する。

SplitContainerは以下の属性を指定できる。

属性概要
orientationhorizontalまたはverticalを指定する。デフォルトはhorizontal
sizerWidth分割位置を変更するバーの太さを指定する。デフォルトは15
activeSizingバーをドラッグ中にも分割位置を変更するか、trueまたはfalseで指定する。デフォルトはfalse
persisttrueを指定すると分割位置をcookieに保存する。デフォルトはfalse

垂直

<div dojoType="SplitContainer" orientation="vertical"
  style="border: 2px solid black; width: 95%; height: 200px;">
  <div dojoType="ContentPane" sizeMin="10" sizeShare="50">
    top
  </div>
  <div dojoType="ContentPane" sizeMin="20" sizeShare="50">
    middle
  </div>
  <div dojoType="ContentPane" sizeMin="10" sizeShare="50">
    bottom
  </div>
</div>
top
middle
bottom

水平

<div dojoType="SplitContainer" orientation="horizontal"
  style="border: 2px solid black; width: 95%; height: 200px;">
  <div dojoType="ContentPane" sizeMin="20" sizeShare="20">
    left
  </div>
  <div dojoType="ContentPane" sizeMin="50" sizeShare="50">
    right
  </div>
</div>
left
right

入れ子の組み合わせ

<div dojoType="SplitContainer" orientation="horizontal"
  style="border: 2px solid black; width: 95%; height: 200px;">
  <div dojoType="ContentPane" sizeMin="20" sizeShare="20">
    left
  </div>
  <div dojoType="SplitContainer" orientation="vertical">
    <div dojoType="ContentPane" sizeMin="10" sizeShare="50">
      top
    </div>
    <div dojoType="ContentPane" sizeMin="20" sizeShare="50">
      middle
    </div>
    <div dojoType="ContentPane" sizeMin="10" sizeShare="50">
    bottom
    </div>
  </div>
</div>
left
top
middle
bottom

基本レイアウト

LayoutContainerを用いることで、ブラウザの領域を上下左右中央に分割して要素を配置できる。

LayoutContainerを使うときは、LayoutContainerとContentPaneをrequireする。

dojo.require("dojo.widget.LayoutContainer");
dojo.require("dojo.widget.ContentPane");

LayoutContainerを配置する場所に、属性 dojoType="LayoutContainer" を持つdiv要素を記述する。LayoutContainerのdiv要素の子要素にレイアウト配置する要素を指定する。

LayoutContainerの子要素には、dojoType="ContentPane" を持つdiv要素を指定する。各ContentPaneはレイアウト配置位置を、layoutAlign属性として、top/right/left/bottom/clientのいずれかの値を指定する。

LayoutContainerのdiv要素はlayoutChildPriority属性を取り、レイアウト配置する各ContentPaneのレイアウト優先順位として、none, top-bottom, left-rightのいずれかを指定する。

  • none: 各ContentPaneを指定した順番に入れ子が決まる
  • top-bottom: 上(top), 下(bottom)を指定したContentPaneが優先される
  • left-right: 右(right), 左(left)を指定したContentPaneが優先される

layoutchildpriority="none"を指定した、基本的なレイアウト。

left
right
top bar
bottom bar
main
<div dojoType="LayoutContainer"  layoutChildPriority='none'
  style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;">
  <div dojoType="ContentPane" layoutAlign="left" style="background-color: #acb386; width: 100px;">
    left
  </div>
  <div dojoType="ContentPane" layoutAlign="right" style="background-color: #acb386; width: 100px;">
    right
  </div>
  <div dojoType="ContentPane" layoutAlign="top" style="background-color: #b39b86; ">
    top bar
  </div>
  <div dojoType="ContentPane" layoutAlign="bottom" style="background-color: #b39b86;">
    bottom bar
  </div>
  <div dojoType="ContentPane" layoutAlign="client" style="background-color: #f5ffbf; padding: 10px;">
    main
  </div>
</div>

layoutChildPriority='left-right'を指定

left
right
top bar
bottom bar
inner left
main
<div dojoType="LayoutContainer"  layoutChildPriority='left-right'
  style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;">
  <div dojoType="ContentPane" layoutAlign="left" style="background-color: #acb386; width: 100px;">
    left
  </div>
  <div dojoType="ContentPane" layoutAlign="right" style="background-color: #acb386; width: 100px;">
    right
  </div>
  <div dojoType="ContentPane" layoutAlign="top" style="background-color: #b39b86; ">
    top bar
  </div>
  <div dojoType="ContentPane" layoutAlign="bottom" style="background-color: #b39b86;">
    bottom bar
  </div>
  <div dojoType="ContentPane" layoutAlign="left" style="background-color: #99cc99; width: 100px;">
    inner left
  </div>
  <div dojoType="ContentPane" layoutAlign="client" style="background-color: #f5ffbf; padding: 10px;">
    main
  </div>
</div>

入れ子

LayoutContainerは入れ子に出来る。

 
   
      panel 1    
   
      panel 2    
   
      panel 3    
 
<style type="text/css">
div.statusPanel {
  background-color: ThreeDFace;
  border: 1px solid;
  border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow;
  margin: 1px;
  padding: 2px 6px;
}
</style>

<div dojoType="LayoutContainer"  style="border: solid black; width: 90%; height: 200px;">
  <div dojoType="LayoutContainer" layoutAlign="bottom" style="height: 28px">
    <div dojoType="ContentPane" layoutAlign="left" class="statusPanel">
      panel 1
    </div>
    <div dojoType="ContentPane" layoutAlign="left" class="statusPanel">
      panel 2
    </div>
    <div dojoType="ContentPane" layoutAlign="client" class="statusPanel">
      panel 3
    </div>
  </div>
</div>

2007年7月28日 (土)

スピナー

入力フォームの左側に上下の矢印を表示し、上下の矢印をクリックすることで入力フォームの数値を増減できる。 スピナーを使うときは、dojo.widget.Spinnerをrequireする。スピナーはinput要素に対して各スピナーのdojoTypeを指定して作成する。スピナーのinput要素は以下の属性を指定できる。

属性概要
delta 増減の単位
defaultTimeout 上下の矢印をクリックして増減を繰り返すときの時間をミリ秒単位で指定する。デフォルトは500

整数

dojoTypeとしてIntegerSpinnerを指定する。IntegerTextboxも継承しており、数値入力チェックも行われる。IntegerTextboxの属性も指定できる。

<input dojoType="IntegerSpinner" 
       value="+1,000"
       delta="10"
       min="9"
       max="1550"
       signed="true"
       separator=",">

実数

dojoTypeとしてRealNumberSpinnerを指定する。RealNumberTextboxも継承している。

<input dojoType="RealNumberSpinner"
       value="+1.00e3"
       delta="0.01e1"
       min="-10950"
       max="155000"
       signed="true"
       esigned="false"
       exponent="always"
       separator=','
       places="2">

入力チェック

入力フォームの入力チェック

Textbox

Textboxが基本となり、他の入力チェックのwidgetは、Textboxを継承して作成されている。dojo.widget.Textboxをrequireする。

<input type="text"
       id="q1"
       name="test"
       dojotype="Textbox"
       trim="true"
       ucfirst="true" />

dojoType="Textbox"を付けたinput要素は以下の属性を取ることができる。

属性名概要
trim trueを指定すると前後の空白を除く
ucfirst trueを指定すると最初の文字が大文字となる
uppercase trueを指定すると全ての文字が大文字となる
lowercase trueを指定すると全ての文字が小文字となる
digit trueを指定すると数値以外の入力文字が削除される

ValidationTextbox

入力が必須の入力フォームに指定する。Textboxを継承している。

<input type="text"
       name="vt"
       dojotype="ValidationTextbox"
       required="true"
       missingmessage="* The occupation is required." />

ValidationTextboxは以下の属性と、Textboxの属性を取ることができる。継承しているTextboxの属性は全て利用できる。

属性名概要
required trueを指定すると入力がないときに、missingMessageで指定した文字を表示する
missingMessage 入力がないときに表示する文字列を指定する
invalidMessage 正しくない入力がされたときに表示する文字列を指定する。ValidationTextbox自体では使われないが、ValidationTextboxを継承したwidgetにおいて使われる
classPrefix 独自で定義した入力フォームのCSSのクラス名を指定する。指定したクラス名の最後に"Valid", "invalid", "Empty"を付けたクラス名がそれぞれ呼び出される

IntegerTextbox

整数チェック。ValidationTextboxを継承している。

<input type="text"
       name="it"
       dojotype="IntegerTextbox"
       signed="true"
       invalidmessage="Be sure to use a plus or minus sign." />
属性名概要
signed trueを指定すると+または-を最初に付けることが必要となる。デフォルトはeitherで符号はあってもなくてもよい。
separator "," など、桁を明示するための区切り文字として使う記号を指定する。
min 最小値
max 最大値

RealNumberTextbox

実数チェック。IntegerTextboxを継承している。

<input type="text"
       name="rt"
       dojotype="RealNumberTextbox"
       required="true"
       invalidmessage="This is not a valid real number." />
属性名概要
places 小数点以下の桁数
exponent trueを指定すると +5E-28 のように指数部分の指定が必要となる
eSigned trueを指定すると指数部分の+または-の指定が必要となる

CurrencyTextbox

通貨チェック。IntegerTextboxを継承している。

<input type="text"
       name="ct"
       value="\54,775"
       dojotype="CurrencyTextbox"
       symbol="\"
       fractional="false"
       invalidmessage="Invalid amount.  Include yen sign. Example: \12,000" />
属性名概要
symbol デフォルトの通貨記号は$、\などを指定して変更できる。
fractional 小数点以下を指定できるかどうかをtrueかfalseを指定する。デフォルトはomitted

IpAddressTextbox

IPアドレスチェック。ValidationTextboxを継承している。

<input type="text"
       name="ip"
       value="24.17.155.40"
       dojotype="IpAddressTextbox"
       allowipv6="false"
       allowhybrid="false"
       invalidmessage="Invalid IPv4 address." />

以下の属性は全てtrueまたはfalseを指定する。デフォルトはtrue

属性名概要
allowDottedDecimal ドット区切りの10進数表記を許すか
allowDottedHex ドット区切りの16進数表記を許すか
allowDottedOctal ドット区切りの8進数表記を許すか
allowDecimal 10進数表記を許すか
allowHex 16進数表記を許すか
allowIPv6 IPv6形式を許すか
allowHybrid IPv4とIPv6の両方を許すか

UrlTextbox

URLチェック。IpAddressTextboxを継承している。

<input type="text"
       name="url"
       dojotype="UrlTextbox"
       scheme="true"
       invalidmessage="Invalid URL.  Be sure to include the scheme, http://..." />
属性名概要
scheme http://を含むかどうか。trueまたはfalse
allowIP ホスト名としてIPアドレスを許可するか。デフォルトはfalse
allowLocal ホスト名としてlocalhostを許可するか。デフォルトはfalse
allowCC 2文字の国コードを許可するか。デフォルトはtrue
allowGeneric 登録されていないドメインを許可するか。デフォルトはtrue

EmailTextbox

Emailアドレスチェック。UrlTextboxを継承している。

<input type="text"
       name="email"
       dojotype="EmailTextbox"
       invalidmessage="Invalid Email Address." />
属性名概要
allowCruft <mailto:foo@yahoo.com>という形式を許可するか。デフォルトはfalse

EmailListTextbox

EmailTextboxを継承している。

<input type="text"
       name="emails"
       dojotype="EmailListTextbox"
       invalidmessage="Invalid Email Address List." />
属性名概要
listSeparator 区切り記号、デフォルトは ";", ",", "\n", " "のいずれか。

DateTextbox

日付チェック。ValidationTextboxを継承している。

<input type="text"
       lang="ja-jp"
       name="date"
       value="2007/06/12"
       dojotype="DateTextbox"
       invalidmessage="Invalid date. Use yyyy/MM/dd format." />
属性名概要
displayFormat yyyy/MM/ddのように表示形式を指定する。
formatLength short/medium/longのいずれかを指定する。

TimeTextbox

時間チェック。ValidationTextboxを継承している。

<input type="text"
       name="time"
       value="5:45:00"
       formatlength="medium"
       dojotype="TimeTextbox"
       invalidmessage="Invalid time." />
属性名概要
displayFormat HH:mm:ssのように表示形式を指定する。
formatLength short/medium/longのいずれかを指定する。

RegexpTextbox

正規表現による入力チェック。ValidationTextboxを継承している。

<input type="text"
       name="reg"
       value="someTestString"
       dojotype="RegexpTextbox"
       regexp="^[\w]+$"
       invalidmessage="Invalid Non-Space Text." />
属性名概要
regexp 正規表現
flags iやgなど、正規表現のオプション指定

UsStateTextbox

米国の2文字の州コードをチェック。ValidationTextboxを継承している。

<input type="text"
       name="state"
       value="CA"
       dojotype="UsStateTextbox"
       invalidmessage="Invalid US state abbr." />
属性名概要
allowTerritories Guam, Puerto Ricoなどを許す。AS, FM, GU, MH, MP, PW, PR, VI
allowMilitary 米軍の州コードを許す。AA, AE, AP

UsZipTextbox

米国のZIPコードをチェック。ValidationTextboxを継承している。

<input type="text"
       name="zip"
       value="98225-1649"
       dojotype="UsZipTextbox"
       invalidmessage="Invalid US Zip Code." />

UsSocialSecurityNumberTextbox

米国の社会保障番号をチェック。ValidationTextboxを継承している。

<input type="text"
       name="ssn"
       value="123-45-6789"
       dojotype="UsSocialSecurityNumberTextbox"
       invalidmessage="Invalid US Social Security Number." />

UsPhoneNumberTextbox

米国の電話番号をチェック。ValidationTextboxを継承している。

<input type="text"
       name="phone"
       value="(123) 456-7890"
       dojotype="UsPhoneNumberTextbox"
       invalidmessage="Invalid US Phone Number." />

2007年7月24日 (火)

時間指定

時間を指定するための画面部品を作成できる。カレンダーと同様に、その場で表示されるTimePickerと、ボタンを押すと表示されるDropdownTimePickerの2つがある。

TimePicker

<script type="text/javascript">
dojo.require("dojo.widget.TimePicker");
</script>
<div dojoType="TimePicker"></div>

TimePickerの選択は、onValueChangedイベントとして受け取ることができる。選択した日付の値は、TimePicker widgetオブジェクトのtimeプロパティにより、Dateオブジェクトとして取得できる。

以下に示す例では、時間を選択すると入力フォームに選択した時間が入力されます。

<script type="text/javascript">
function init(){
    dojo.event.connect(dojo.widget.byId('tp'),'onValueChanged', 'getTimePickerValue');
}
function getTimePickerValue(){
  dojo.byId('tpinput').value = dojo.widget.byId('tp').time;
}
dojo.addOnLoad(init);
</script>

<div dojoType="TimePicker" id="tp"></div>
<input id="tpinput"  size="35">

dojoType="TimePicker"を指定した要素では、以下の属性を設定できる。

属性概要
lang ロケールを指定することで、AM/PMの文字が変わる。"en-us", "nl-nl", "zh-cn", "zh-tw", "ja-jp", "fi-fi", "sv-se" を指定できる。指定しないとブラウザのロケールに従って表示される
useDefaultTime trueを指定すると現在の時(hour)が設定される
useDefaultMinutes trueを指定すると現在の分(minutes)が設定される
storedTime 2005-06-30T08:05 のように、表示される時刻をRFC 3339の形式で設定する

DropdownTimePicker

DropdownTimePickerは、input要素に対して dojoType="dropdowntimepicker" を指定して作成する。DropdownTimePickerで選択した値は自動生成された入力フォームに表示されるので、入力フォームから容易に値を取り出すことが出来る。
<script type="text/javascript">
dojo.require("dojo.widget.DropdownTimePicker");
</script>

<input id="ddt" dojoType="dropdowntimepicker">

DropdownTimePickerは、以下の属性を指定できる。

属性概要
value12:00のようにデフォルト値を指定できる
containertoggleDropdownTimePickerを表示するときの効果として、wipe, explode, fadeを指定できる
containerToggleDurationcontainertoggleで指定した効果の実行時間をミリ秒単位で指定する
langロケール
displayFormatHH:mmのように入力フォームに表示するときのフォーマットを指定する

ダイアログ

dojo.widget.Dialogにより、他のHTML要素の操作をブロックするダイアログを作ることができる。表示するダイアログの内容を含むdiv要素に対して、dojoType="dialog"属性を付ける。ダイアログとしてHTMLフォームを含むこともできる。ダイアログの内容は、子要素として含むのではなく、href属性でURL指定した別ファイルのHTMLを指定することもできる。

<div dojoType="dialog" id="loginDialog" bgColor="white" bgOpacity="1" toggle="fade" toggleDuration="250" closeNode="hider" closeonbackgroundclick="true"  >
  <h3>Login Dialog</h3>
  <form onsubmit="return false;">
    <table>
      <tr>
        <td>Name:</td><td><input type="text"></td>
      </tr>
      <tr>
        <td>Password:</td><td><input type="password"></td>
      </tr>
      <tr>
        <td colspan="2" align="center"><input type="button" id="closer" value="Login"></td>
      </tr>
    </table>
  </form>
</div>

<style type="text/css">
.dojoDialog {
  background : #eee;
  border : 1px solid #999;
  -moz-border-radius : 5px;
  padding : 4px;
}
</style>

ダイアログを表示するためには、Dialog Widget要素に対して、show()メソッドを実行する。

<script type="text/javascript">
dojo.require("dojo.widget.Dialog");
function showDialog(){
  dojo.widget.byId("loginDialog").show();
}
</script>

<a href="javascript:showDialog()">Show Login Dialog</a>

Dialogの要素は以下の属性を取ることができる。

属性概要
bgColor ダイアログ外側の背景色
bgOpacity ダイアログ外側の背景の透過率
toggle ダイアログを表示するときの効果として、wipe, explode, fadeを指定できる
toggleDuration toggleで指定した効果の実行時間をミリ秒単位で指定する
closeNode onclickイベントによりダイアログを消すHTML要素のID名
closeOnBackgroundClick trueを指定するとダイアログの外をクリックするとダイアログを閉じる。デフォルトはfalse
lifetime ダイアログの表示時間
blockDuration 操作ができない時間
href ダイアログとして表示する内容のHTML要素をURLで指定する
executeScripts hrefでダイアログの内容を指定したとき、指定したHTML内のJavaScriptを実行するかどうかをtrue/falseで指定する。デフォルトはfalse

ModalFloatingPane

ModalFloatingPaneは、Dialogと同様に、他のHTML要素の操作をブロックするダイアログを作成する。窓の形状がFloatingPaneと同じとなる点がDialogと異なる。

ModalFloatingPaneは、FloatingPaneとDialogのベースとなっているModalDialogBaseを継承しているため、FloatingPaneとDialogそれぞれとほぼ同じ機能を提供する。

<div dojoType="ModalFloatingPane" id="loginModalDialog" title="Login Floating Pane"
  style="width: 400px; height: 200px;" closeNode="hider" closeonbackgroundclick="true"
  bgColor="white" bgOpacity="1" toggle="fade" toggleDuration="250">
  <h3>Login Dialog</h3>
  <form onsubmit="return false;">
    <table>
      <tr>
        <td>Name:</td><td><input type="text"></td>
      </tr>
      <tr>
        <td>Password:</td><td><input type="password"></td>
      </tr>
      <tr>
        <td colspan="2" align="center"><input type="button" id="hider" value="Login"></td>
      </tr>
    </table>
  </form>
</div>
<script type="text/javascript">
dojo.require("dojo.widget.ModalFloatingPane");
function showModalDialog(){
  dojo.widget.byId("loginModalDialog").show();
}
</script>

<a href="javascript:showModalDialog()">Show Login Dialog</a>

2007年7月22日 (日)

カレンダー

カレンダーを表示して日付を選択させることができる。カレンダーには、その場で表示されるDatePickerと、ボタンを押すと表示されるDropdownDatePickerの2つがある。

DatePicker

<script type="text/javascript">
dojo.require("dojo.widget.DatePicker");
</script>

<div dojoType="datepicker" widgetId="foo">

DatePickerの日付選択は、onValueChangedイベントとして受け取ることができる。 選択した日付の値を取得するには、DatePickerのwidgetに対して、getValue()またはgetDate()メソッドを実行する。getValue()では日付を文字列として取得し、getDate()ではDateオブジェクトとして取得できる。

setValue()、setDate()で日付を指定することで、DatePickerにおいて指定した日付を選択させることもできる。

以下に示す例では、DatePickerで日付を選択するとその文字列を入力フォームに表示する。また、ボタン「setDate」を押すと入力フォームに入力した日付が、DatePicker上で選択される。

<script type="text/javascript">
dojo.addOnLoad(init);
function init(){
  dojo.event.connect(dojo.widget.byId('cl'),'onValueChanged','setInput');
  dojo.event.connect(dojo.byId('setDate'),'onclick','setDatePicker');
};

function setInput(){
  var checked = dojo.widget.byId('cl').getDate();
  dojo.byId('date').value = dojo.date.format(checked, {formatLength:'medium',selector:'dateOnly', locale:'ja-jp'});
}

function setDatePicker(){
  var date = dojo.date.parse(dojo.byId('date').value, {formatLength:'medium', locale:'ja-jp'});
  dojo.widget.byId('cl').setDate(date);
}


<div dojoType="datepicker" widgetId="cl">

dojoType="DatePicker"を指定した要素では、以下の属性を指定できる。

属性概要
lang ロケールを指定することで、カレンダーの月と曜日の文字が変わる。"en-us", "nl-nl", "zh-cn", "zh-tw", "ja-jp", "fi-fi", "sv-se", "xx"を指定できる。xxを指定すると全て数字で表示される。指定しないとブラウザのロケールに従って表示される
displayWeeks 何週目まで表示するかを固定で指定する
staticDisplay trueを指定すると月や年を変更できなくなる
value "2005-12-25"のように、指定した日が選択された状態でカレンダーが表示される。"today"を指定すると今日が選択された状態となる
weekStartsOn 左端が何曜日になるか指定する。0が日曜日、1が月曜(デフォルト)、2が火曜とずれていく
adjustWeeks trueを指定すると、displayWeeksの値がその月の日を全て表示する最小限の行だけが表示されるようになる
startDate 指定した日("2006-09-10")以前の日を選択できなくなる
endDate 指定した日("2006-09-10")以降の日を選択できなくなる

DropdownDatePicker

DropdownDatePickerは、input要素に対して dojoType="dropdowndatepicker" を指定して作成する。DropdownDatePickerで選択した値は入力フォームに表示されるので、入力フォームから値を取り出すことが出来る。

<script type="text/javascript">
dojo.require("dojo.widget.DropdownDatePicker");
</script.

<input id="ddcl" dojotype="dropdowndatepicker" />

DropdownDatePickerは、DatePickerで指定できる属性に加えて、以下の属性を指定できる。

属性概要
containerToggle カレンダーを表示するときの効果として、wipe, explode, fadeを指定できる
containerToggleDuration containerToggleで指定した効果の実行時間をミリ秒単位で指定する
displayFormat 入力フォームに表示するときのフォーマット指定。yyyy/MM/ddなど
formatLength 入力フォームに表示する日付のフォーマットを長さ、long, medium, shortで指定する
saveFormat フォームの値として取り出すときのフォーマット指定。rfc, posix, yyyy/MM/ddなど

2007年7月16日 (月)

コンボボックス

テキストボックスとリストボックスを組み合わせたコンボボックスを提供する。テキストボックスに文字を入力できるだけでなく、右端のボタンをクリックして選択できる入力候補を一覧表示する。

Dojoのコンボボックスでは、テキストボックスに文字を入力すると、途中までの入力に一致する候補を一覧表示する機能も提供する。この機能は英数字のみで動作する。

コンボボックスを使うときは、dojo.widget.ComboBoxをrequireする。

dojo.require("dojo.widget.ComboBox");

コンボボックスは、select要素に対して、dojoType属性をcomboboxとすることで作成できる。option要素を指定することで入力候補を指定する。入力候補はoption要素で指定した順番に表示されるため、option要素はあらかじめソートして指定する必要がある。

<select id="sample" dojoType="combobox">
  <option value="aa">aa</option>
  <option value="ab">ab</option>
  <option value="bb">bb</option>
  <option value="cc">cc</option>
</select>

autocomplete属性として"false"を指定すると、入力候補を一覧表示するだけで、選択しないと入力しないようになる。

maxListLength属性により、入力候補として一度に表示するリストの数を指定できる。以下の例では、maxListLengthとして2を指定している。

入力候補をファイル指定

入力候補をoption要素として指定するのではなく、JavaScriptファイルに候補一覧を指定することができる。 入力候補をJavaScriptファイルに記述して指定するときは、select要素ではなくinput要素にdojoType="combobox"を指定する。そして、入力候補を記述したJavaScriptファイルをdataUrl属性の値としてを指定する。

<input id="dataurl" dojotype="combobox" dataurl="/sample/comboBoxData.js" style="width: 300px;" />

JavaScript配列のファイルは2次元配列、連想配列、JSONのいずれかで指定できる。 以下に2次元配列の例を示す。

[
  ["Alabama","AL"],
  ["Alaska","AK"],
  ["American Samoa","AS"],
    ...
  ["Wyoming","WY"]
]

以下に連想配列の例を示す。

{"AL":"Alabama",
"AK":"Alaska",
"AS":"American Samoa",
...
"WY":"Wyoming"}

入力候補を全てJavaScriptファイルに記述する方法では、入力候補の数が多いときロードに時間がかかってしまう。入力するたびに入力候補のデータをサーバから取得することができる。mode属性の値としてremoteを指定し、dataUrl属性の値として %{searchString} を指定することで、文字を入力するたびに入力文字列を渡して、選択候補を取得することができる。

<input id="dataurl2" dojotype="combobox" dataUrl="/search?text=%{searchString}"  mode="remote" />

イベントハンドラ

onValueChanged属性としてfunctionを指定することで、コンボボックスで入力候補を選択したイベントを取得できる。

<input id="getvalue" dojotype="combobox" dataurl="/sample/comboBoxData.js"
onValueChanged="getVal1" style="width: 300px;" />

<script type="text/javascript" language="JavaScript">
function getVal1(val){
  alert(val);
}
</script>

コンボボックスの値を取得するだけであれば、dojo.widget.byId('getvalue').comboBoxValue.valueで、コンボボックスに入力されている値を取得できる。

<button onclick="getVal2">get value</button>

<script language="JavaScript" type="text/javascript">
function getVal2(){
  alert(dojo.widget.byId('getvalue').comboBoxValue.value);
}
</script>

動的な作成

動的にコンボボックスを作るときの例を以下に示す。

dojo.widget.createWidget("dojo:ComboBox", {name:"prog",autocomplete:false,dataUrl:"comboBoxData.js"}, dojo.byId("progCombo"));

2007年7月15日 (日)

カラーパレット

カラーパレットを表示して、色をユーザに選択させることができる。カラーパレットを用いるときはdojo.widget.Checkboxをrequireする。

dojo.require("dojo.widget.ColorPalette");

カラーパレットを表示するところで、dojoTypeをColorPaletteとして指定したdiv要素を記述する。

<div dojoType="ColorPalette" id="cp"></div>

デフォルトでは、7x10のカラーパレットだが、属性としてpalette="3x4"を指定することで、3x4のカラーパレットを作ることができる。

<div dojoType="ColorPalette" id="cp" palette="3x4"></div>

ユーザが選択した色の情報を取得するためには、onColorSelectイベントを関数に割り当てる。onColorSelectイベントを割り当てられた関数では、引数として色の情報をRGB指定の文字列('#3366ff'など)として受け取る。

function hello(color){
  alert(color);
}

function init(){
  dojo.event.connect(dojo.widget.byId('sample'), 'onColorSelect', 'hello');
}
dojo.addOnLoad(init);

動的にカラーパレットを作るには以下のように記述する。

dojo.widget.createWidget("dojo:ColorPalette",{palette:"7x10"}, dojo.byId("showPalette"));

以下に、ボタンを押したら、カラーパレットを表示し、色を選択したらカラーパレットを消す例を示す。

<script language="JavaScript" type="text/javascript">
dojo.require("dojo.widget.ColorPalette");

var pt;
function showPalette(){
  pt = dojo.widget.createWidget("dojo:ColorPalette",{palette:"7x10"}, dojo.byId("showPalette"));
  dojo.event.connect(pt, 'onColorSelect', 'selectPalette');
}

function selectPalette(color){
  alert(color);
  pt.hide();
}
</script>

<button onclick="showPalette();">色選択</button>
<p><div id="showPalette"></div></p>

2007年7月12日 (木)

チェックボックス

Dojoのチェックボックスを利用するときは、dojo.widget.Checkboxをrequireする。

dojo.require("dojo.widget.Checkbox");

通常のチェックボックスに対して、dojoType属性をChickboxと指定する。

<input type="checkbox" name="cb1" widgetId="cb1" value="foo" dojoType="Checkbox">

disableを指定したときの画像も用意されている。

<input type="checkbox" name="cb1" widgetId="cb1" value="foo" dojoType="Checkbox" checked="checked" disabled="disabled>

チェックボックスには、enable(), disabled()メソッドが用意されており、チェックの可否を変更できる。

var checkbox = dojo.widget.byId('cb1');
checkbox.disable();

2007年7月11日 (水)

ドロップダウンボタン, コンボボタン

ドロップダウンボタン

ボタンを押すとメニューが現れるドロップダウンボタンを作成できる。ドロップダウンボタンを利用するときは、dojo.widget.Buttonをrequireする。

<script type="text/javascript">
dojo.require("dojo.widget.Button");
</script>

ドロップダウンボタンは、button要素に対してdojoTypeを"DropDownButton"と指定する。ボタンを押したときに表示されるメニューのIDをmenuId属性に指定する。

<button dojoType="DropDownButton" menuId="menu" widgetId="button">test</button>

メニューは、button要素とは別に、dojoTypeを"PopupMenu2"と指定して作成する。PopupMenu2はtoggle属性を指定して、メニューの表示方法を指定できる。toggleは、"plain", "wipe", "fade", "explode"のいずれかを指定できる。

メニューの各項目は、PopupMenu2を指定した要素の子要素にdojoTypeを"MenuItem2"と指定して作成する。メニュー要素は、アイコン画像をiconSrc、表示文字列をcaption、ショートカットキーをaccelKey属性として指定できる。

<div dojoType="PopupMenu2" id="menu" toggle="wipe">
  <div dojoType="MenuItem2" iconSrc="/sample/cut.gif" caption="Cut" accelKey="Ctrl+C" onClick="alert('cut')"></div>
  <div dojoType="MenuItem2" iconSrc="/sample/copy.gif" caption="Copy" accelKey="Ctrl+X" onClick="alert('copy')"></div>
  <div dojoType="MenuItem2" iconSrc="/sample/paste.gif" caption="Paste" accelKey="Ctrl+V" onClick="alert('paste')"></div>
</div>

コンボボタン

ドロップダウンボタンではボタンを押すとメニューが現れたが、コンボボタンでは、ボタン自体を押すことができ、さらにボタンの右側にメニューが現れるボタンも表示される。

コンボボタンを作成するときは、dojoTypeを"ComboButton"にする以外はドロップダウンボタンと同じ。

2007年6月 8日 (金)

ビルド

Dojoはファイルが分割されており必要なファイルだけをロード(require)する仕組みとなっている。 利用するファイルが動的に変わるにときは最小限のファイルだけをロードする便利な仕組みだが、利用するファイルが決まっているときは、ファイルのロードに時間がかかるため起動が遅くなる。

DojoではAntを用いてあらかじめ必要となるファイルを一つにまとめて圧縮しておくことができる。 最初の起動時に利用するファイルをまとめておき、動的に必要となるファイルをその都度requireして取得できる。

ファイルをまとめるにはJDK 1.4.2以上(1.5以上推奨)とAnt 1.6.5以上が必要となる。

また、Dojoのsrcアーカイブ (http://download.dojotoolkit.org/release-0.4.3/dojo-0.4.3-src.zip) が必要となる。svn (http://svn.dojotoolkit.org/dojo/tags/release-0.4.3) からチェックアウトしてもよい。

まず、必要とるDojoのファイルをプロファイルに記述する。以下にプロファイルの例を示す。

var dependencies = [ 
"dojo.io.*",
"dojo.event.*",
"dojo.xml.*",
"dojo.graphics.*",
"dojo.io.BrowserIO",
"dojo.widgets.*",
"dojo.widgets.Button",
];

load("getDependencyList.js");

プロファイルは、foo.profile.jsのfooの部分を変えたファイル名として保存する。作成したプロファイルはDojoのsrcアーカイブのディレクトリ dojo-0.4.3-src/buildscripts/profiles に置く。

ファイルをまとめるには、Antによるビルドを実行する。コマンドプロンプトでdojo-0.4.3-src/buildscriptsに移動し、以下を実行する。-Dprofile=fooのfooの部分は、変更した名前に置き換えて実行すること。

ant -Dprofile=foo clean release

引数にintern-stringsを付けるとwidgetsのテンプレートも一つのファイルに含まれる。

引数にstrip-resource-commentsを付けると、コメントを除くことができる。

Dojo 0.4.3以上では、strip-resource-commentsの代わりに、-Dstrip_and_compress=trueを引数として指定してファイルを圧縮することができる。

Antのビルドに成功すると、dojo-0.4.3-src/release/dojo/ にファイル (dojo.js) が作成される。

Dojoは、Ajax用、クロスドメインのAjax用、widget用などにあらかじめビルドしてまとめたdojo.jsを含むアーカイブも提供している。http://download.dojotoolkit.org/release-0.4.3/

2007年5月22日 (火)

ボタン

Buttonのwidgetを利用するには、dojo.widget.Buttonをrequireし、button要素に対してdojoType="Button"を指定する。通常のbutton要素と同じく、<button>~</button>で囲まれた部分がボタン上に表示される。

<script type="text/javascript">
dojo.require("dojo.widget.Button");
</script>
<button dojoType="Button"><b>click</b><br>test</button>

無効化

button要素にdisabled="true"属性を追加すると、無効化されたボタンが表示される。

<button dojoType="Button" disabled="true">test</button>

ボタンの有効/無効を動的に変えるには、ボタンのwidgetオブジェクトを取得してから、setDisabled(true)/setDisabled(false)メソッドを実行する。

<script type="text/javascript">
  dojo.require("dojo.widget.Button");

  function init(){
    dojo.event.connect(dojo.widget.byId('test'), 'onClick', 'toggleDisable');
  }
  function toggleDisable(){
    var button = dojo.widget.byId('disabledbutton');
    button.setDisabled(true);
  }
  dojo.addOnLoad(init);
</script>

<button dojoType="Button" widgetId="disabledbutton">test</button><p>
<button dojoType="Button" widgetId="test">click here</button>

ボタンのwidgetオブジェクトのdisabledプロパティの値を取得して、現在のボタンの状態を取得できる。

var button = dojo.widget.byId('disabledbutton');
var disabled = button.disabled;

ボタンの表示内容を変更

setCaption(str)メソッドを使ってボタンの表示内容(innerHTML)を変えることができる。

var button = dojo.widget.byId('setcaption');
button.setCaption('changed');

Button widgetを動的に作成

Buttonのwidgetを動的に作る例を以下に示す。

var makebutton = dojo.widget.createWidget("Button", {caption: "hello world", onClick: toggleDisable});
dojo.byId("makeb").appendChild(makebutton.domNode);

2007年5月20日 (日)

暗号/ハッシュ関数

Blowfish (暗号)

Dojoは、ライセンスフリーのBlowfish共通鍵暗号方法を提供している。

文字を暗号化するときは、dojo.crypto.Blowfish.encrypt(plaintext, key, ao)を用いる。plaintextに暗号化したい文字列、keyに暗号化に用いる鍵を指定する。aoは、ao.outputTypeとして出力形式, ao.cipherModeとして暗号化モードを指定できる。outputTypeには、Base64:0, Hex:1, String:2, Raw:3のいずれかを指定できる(デフォルトはBase64)。cipherModeには、ECB:0, CBC:1, PCBC:2, CFB:3, OFB:4, CTR:5のじずれかを指定できる。

暗号化された文字列を戻したいときは、dojo.crypto.Blowfish.decrypt(ciphertext, key, ao)を用いる。ciphertextに暗号化された文字列、keyには暗号化したときに用いた鍵を指定する。

dojo.require("dojo.crypto.Blowfish");

var message = "The rain in Spain falls mainly on the plain.";
var key = "foobar";
var enc = dojo.crypto.Blowfish.encrypt(message, key);
--> "WI5J5BPPVBuiTniVcl7KlIyNMmCosmKTU6a/ueyQuoUXyC5dERzwwdzfFsiU4vBw"

var dec = dojo.crypto.Blowfish.decrypt(enc, key);
--> "The rain in Spain falls mainly on the plain."

MD5 (ハッシュ関数)

MD5によるハッシュ値を求めるには、dojo.crypto.MD5.compute(data, outputType)を用いる。dataには、ハッシュ値を求めるデータを指定する。outputTypeは出力形式を指定する。

鍵付きのハッシュ関数を用いるときは、dojo.crypto.MD5.getHMAC(data, key, outputType)を用いる。keyに鍵を指定する。

dojo.require("dojo.crypto.MD5");

var message = "The rain in Spain falls mainly on the plain.";
var hash = dojo.crypto.MD5.compute(message);
--> "OUhxbVZ1Mtmu4zx9LzS5cA=="

SHA-1 (ハッシュ関数)

SHA-1はMD5と同じハッシュ関数である。SHA-1はMD5と同じく、computeとgetHMACの関数が提供されている。

dojo.require("dojo.crypto.SHA1");

var message = "The rain in Spain falls mainly on the plain.";
var hash = dojo.crypto.SHA1.compute(message);
--> "GJjfAfBq/Lm9o2JoVzEi2DujBHU="

行列計算

dojo.math.matrixに行列計算のための関数が提供されている。

以下に関数一覧を示す。各関数名は、"dojo.math.matrix."を省略している。

メソッド名概要
format(m, decimal_points)配列を文字列形式に変換する。引数として小数点以下の桁数を指定できる (デフォルトは5)
determinant(m)行列式を計算
scale(2, m)掛け算
multiply(m, m)
adjoint(m)余因子行列
inverse(m)逆行列
upperTriangle(m)上三角行列
transpose(m)転置行列
product2つ以上の行列の積
sum2つ以上の行列の和
create(a, b, value)a x bの行列をデフォルト値valueで作成する
ones(a, b)a x bの行列をデフォルト値1で作成する
zeros(a, b)a x bの行列をデフォルト値0で作成する
identity(size, scale)sizeの単位行列をscaleで掛け算して作成する
copy(a)複製を返す

以下に行列計算の例を示す。

dojo.require("dojo.math.matrix");

var m1 = [[1,2,3],[4,5,6],[7,8,9]];
var m2 = [[1,2,3],[1,2,3],[1,2,3]];
var m3 = dojo.math.matrix.multiply(m1, m2);
dojo.math.matrix.format(m3);
--> "| 6.00000 12.0000 18.0000 | | 15.0000 30.0000 45.0000 | | 24.0000 48.0000 72.0000 | "

XSLT

クロスブラウザ(IE, Mozilla, 一部Opera)で動作するXSLTのAPIを提供している。スタイルシートファイルを参照するURIを指定して dojo.xml.XslTransform をインスタンス化した後、以下のメソッドを実行する。

  • transformToDocument(xmlDoc, params): xmlDocを変換してXML Nodeとして結果を返す。paramsによりスタイルシートのパラメータを2次元配列で渡すことができる
  • getResultString(xmlDom, params, parentDoc): xmlDocを変換して文字列として結果を返す。parentDocはHTMLの親Nodeを指定する(documentを指定すればよい?)
  • transformToContentPane(xmlDoc, params, contentPane, parentDoc): 変換結果をdojo.widget.ContentPaneのインスタンス(contentPane)に追加する
  • transformToRegion(xmlDoc, params, region, parentDoc): 変換結果をregionで指定したHTML NodeのinnerHTMLに置き換える
  • transformToWindow(xmlDoc, params, windowDoc, parentDoc): 変換結果をwindowDocで指定したdocumentオブジェクトの中身に置き換える
dojo.require("dojo.xml.XslTransform");

var sampleXml;
dojo.io.bind({
  url: "sample.xml",
  mimetype: "text/xml",
load: function(type, dom, httpreq){ sampleXml = dom;}
});

var simpleProc = new dojo.xml.XslTransform("simple.xsl");
var region = document.getElementById("test");
var params = new Array();
params[params.length] = ["foo", "bar"];
params[params.length] = ["focus-id", "site_ind"];
simpleProc.transformToRegion(sampleXml, params, region, document);

2007年5月19日 (土)

文字列操作

dojo.stringには、文字列操作の関数が提供されている。

  • dojo.string.trim(str): 前後の空白文字を除く
  • dojo.string.trimStart(str): 前の空白文字を除く
  • dojo.string.trimEnd(str): 後ろの空白文字を除く
  • dojo.string.repeat(str, count, separator): separatorの文字列を挟んで、strをcount回数繰り返して繋げる
  • dojo.string.pad(str, len, c, dir): str.length
  • dojo.string.padLeft(str, len, c): dojo.string.pad(str, len, c, 1) と同じ
  • dojo.string.padRight(str, len, c): dojo.string.pad(str, len, c, -1) と同じ
  • dojo.string.isBlank(str): strが空白文字列かどうかをtrue/falseで返す
  • dojo.string.capitalize(str): strを全て大文字にして返す
  • dojo.string.escape(type, str): strをtype指定に応じて特殊文字をエスケープする。typeは、xml, html, xhtml, sql, regexp, regex, javascript, jscript, js, asciiのいずれかを指定できる
  • dojo.string.summary(str, len): len文字数以降を切り捨てて、最後に"..."を追加する
  • dojo.string.normalizeNewlines(str, newlineChar): 改行コードを newlineChar に置き換える。newlineCharは'\n'または'\r'のいずれかを指定できる。newlineCharを指定しないと、CRまたはLFをCRLFに置き換える

dojo.string.substituteParams(template, hash)は、テンプレートを指定して文字列を作成する。テンプレート文字列の%{str}の部分を、hash(オブジェクトまたは連想配列)で指定したstrパラメータの値で置き換える。%{0}のように数値で指定したときは、指定した数値+1番目の引数の値に置き換える。指定したパラメータが与えられないときはExceptionを返す。

dojo.require("dojo.string.extras");

var tpla = "This %{string} has %{parameters} %{toReplace}";
dojo.string.substituteParams(tpla, { string: "area", parameters: "foo", toReplace: "bar"});
-->"This area has foo bar"

var tplb = "Passed as arguments: %{0}, %{1}, %{2}.";
dojo.string.substituteParams(tplb, "zero", "one", "two");
-->"Passed as arguments: zero, one, two."

dojo.string.Builder

dojo.string.Builderは、文字列操作をするためのオブジェクトである。コンストラクタの引数には文字列/数値または文字列/数値配列を指定できる。Builderオブジェクトに対して、以下のメソッドを利用して、文字列操作ができる。

  • valueOf(): 文字列を返す
  • toString(): valueOfと同じ
  • append(arg1, arg2, ...): 文字列の最後に全ての引数(文字列または文字列の配列)を追加する
  • clear(): 文字列を空にする
  • replace(str1, str2): 最初に現れたstr1をstr2に置き換える
  • remove(start, length): startからlength文字数の文字列を削除する
  • insert(index, str): index番目に文字列strを追加する
dojo.require("dojo.string.Builder");

var c = new dojo.string.Builder("foo", "bar", ["baz", "thud"]);
c.toString();
-->"foobarbazthud"
c.remove(3, 2);
c.toString();
-->"forbazthud"

2007年5月18日 (金)

文字列の検証

dojo.validateには様々な文字列検証のための関数が用意されている。

文字列

dojo.validate.isText(value, flags)は、空文字列かどうかをチェックする。flagsを指定することで、文字列の長さ、最大の長さ、最小の長さを指定できる。文字列以外が指定されたときは常にtrueとなる。
dojo.require("dojo.validate");

dojo.validate.isText('txt');
dojo.validate.isText('123456', {length: 6});
dojo.validate.isText('123456', {maxlength: 6});
dojo.validate.isText('1234567', {minlength: 6});
dojo.validate.isText('1234567', {minlength: 6, maxlength:7});

数値

dojo.validate.isInteger(value, flags)は、数値かどうかをチェックする。引数のvalueは数値を文字列として指定する。flagsには、signedにtrue/false、separatorに区切り文字を指定できる。
dojo.require("dojo.validate");

dojo.validate.isInteger('+0');
dojo.validate.isInteger('1.000.000', {separator: "."});
dojo.validate.isRealNumber(value, flags)は、実数かどうかをチェックする。valueは数値を文字列として指定する。flagsは、placesとして小数点の位置を数値で指定する、decimalは小数点として使う文字列を指定する、exponentは浮動小数点表記を許すかどうかをtrue/falseで指定する、eSignedはeに+または-を付けることを許すかどうかをtrue/falseで指定する、その他、isIntegerと同じflagsを指定することができる。
dojo.require("dojo.validate");

dojo.validate.isRealNumber('+0');
dojo.validate.isRealNumber('1.0');
dojo.validate.isRealNumber('100.25e32', {exponent: true});
dojo.validate.isRealNumber('100.25', {places: 2});
dojo.validate.isInRange(value, flags)は、数値が指定した範囲内にあるかどうかをチェックする。valueは数値を文字列として指定する。flagsに数値範囲を指定する。flagsの値して、min, maxに数値、decimalとして小数点の文字列を指定できる。separatorおよびsymbolに指定した文字列は無視される。
dojo.require("dojo.validate");

dojo.validate.isInRange('10', {min: 1, max: 100});
dojo.validate.isInRange('-50', {min: -100, max: 100});
dojo.validate.isInRange('5.7e28', {min: 5.567e28, max: 6.000e28});
dojo.validate.isInRange('1,500,000', {separator: ',', min: 0});
dojo.validate.isCurrency(value, flags)は貨幣単位を含む数値かどうかをチェックする。flagsには、signed, symbol, placement, separator, fractional, cents, decimalを指定できる。fractionalとcentsは小数点を許すかどうかをtrue/falseで指定する。placementは、symbolの位置を'before'または'after'で指定する。
dojo.require("dojo.validate");
dojo.validate.isCurrency('\u20AC 123.456.789,00', {separator: ".", decimal: ",", symbol:"\u20AC"});

dojo.require("dojo.validate.us");
dojo.validate.us.isCurrency('$1,000');
dojo.validate.us.isCurrency('$1,000.25', {cents: true});

dojo.require("dojo.validate.jp");
dojo.validate.isJapaneseCurrency('\u00a51,000');
dojo.validate.isJapaneseCurrency('- \u00a510,000,000');

dojo.require("dojo.validate.de");
dojo.validate.isGermanCurrency('1.000 \u20AC');

Web

dojo.validate.isIpAddress(value, flags)はIPアドレス(IPv4 or IPv6)として正しいかをチェックする。flagsとして、allowDottedDecimal, allowDottedHex, allowDottedOctal, allowDecimal, allowHex, allowIPv6, allowHybridそれぞれにtrue/falseを指定できる。デフォルトは全てtrueとなる。
dojo.require("dojo.validate.web");

dojo.validate.isIpAddress('24.17.155.40');
dojo.validate.isIpAddress('24.17.155.40', {allowIPv6: false});
dojo.validate.isIpAddress('0x18.0x11.0x9b.0x28');
dojo.validate.isIpAddress('3482223595');
dojo.validate.isUrl(value, flags)は、正しいURL文字列かチェックする。flagsとして、allowLocal, allowIP, allowPort, scheme, それぞれにtrue/falseを指定できる。schemeがtrueのときは頭にhttp/https/ftp/ftpsがあるかチェックする。tldはドメイン名のチェックをする。host, ipAddress, tldのチェックと同じ
dojo.require("dojo.validate.web");

dojo.validate.isUrl('www.yahoo.com');
dojo.validate.isUrl('http://www.yahoo.com');
dojo.validate.isUrl('localhost:8080', {allowLocal: true});
dojo.validate.isUrl('http://www.yahoo.com/index.html?a=12&b=hello%20world#anchor');
dojo.validate.isEmailAddress(value, flags)は、Emailアドレスとして正しいかをチェックする。flagsとしてallowCruftにtrue/falseを指定できる。host, ipAddress, tldのチェックと同じ
dojo.require("dojo.validate.web");

dojo.validate.isEmailAddress('x@yahoo.com')
dojo.validate.isEmailAddress("", {allowCruft: true});
dojo.validate.isEmailAddressList(value, flags)は、Emailアドレスのリスト表現として正しいかをチェックする。listSeparatorを指定できる。emailAddress, host, ipAddress, tldのチェックと同じ
dojo.require("dojo.validate.web");

dojo.validate.isEmailAddressList(
  "x@yahoo.com \n x.y.z.w@yahoo.com ; o'mally@yahoo.com , fred&barney@stonehenge.com");
dojo.validate.isEmailAddressList(
  "mailto:x@yahoo.com; ; ; fred&barney@localhost", 
	{allowLocal: true, allowCruft: true, listSeparator: ";"});
dojo.validate.getEmailAddressList(value, flags)は、valueに含まれるEmailアドレスを配列にして返す。flagsにはisEmailAddressListと同じflagsを指定できる。

クレジットカード

クレジットカード番号のためのチェックをする関数として以下の4つが提供されている。
  • dojo.validate.isValidLuhn(value): Luhnアルゴリズムを使ってクレジットカード番号をチェックする
  • dojo.validate.isValidCvv(value, ccType): ccTypeに対して、CCV(value)が正しいかをチェックする
  • dojo.validate.isValidCreditCardNumber(value, ccType): ccTypeに対して、クレジットカード番号が正しいかチェックする
  • dojo.validate.isValidCreditCard(value, ccType): isValidLuhnとisValidCreditCardNumberの両方をチェックする
ccTypeは、以下のいずれかを指定する。
  • mc: Mastercard
  • ec: Eurocard
  • vi: Visa
  • ax: American Express
  • dc: Diners Club
  • bl: Carte Blanch
  • di: Discover
  • jcb: JCB
  • er: Enroute
以下に実行例を示す。
dojo.require("dojo.validate.creditCard");

dojo.validate.isValidLuhn('5105105105105100');
dojo.validate.isValidLuhn('5105-1051 0510-5100');
dojo.validate.isValidLuhn(38520000023237);
dojo.validate.isValidCvv('123','mc');
dojo.validate.isValidCvv(612,'ec');
dojo.validate.isValidCreditCard('5105105105105100','mc')

2007年5月15日 (火)

タイマー

setTimeout

setTimeoutを拡張したdojo.lang.setTimeoutを提供する。タイマーにより実行する関数とそのscope、引数を指定できる。
  • dojo.lang.setTimeout(func, delaynum, arg1, arg2, ...);
  • dojo.lang.setTimeout(scope, func, delaynum, arg1, arg2, ...);

delayThese

dojo.lang.delayTheseを利用して、複数の関数を一定間隔で実行することができる。
  • dojo.lang.delayThese(array funcArray, function callback, number delay, function onend)
  • dojo.lang.delayThese(array funcArray, number delay)
  • dojo.lang.delayThese(array funcArray, function callback, function onend)
  • dojo.lang.delayThese(array funcArray, function callback)
  • dojo.lang.delayThese(array funcArray)

funcArrにより指定した関数の配列をdelay(ミリ秒)の時間を空けて1つずつ実行する。 callbackが指定されたときは、funcArrの関数を実行した後にcallbackが毎回呼ばれる。 onendが指定されたときは、opendがfuncArrを全て実行した後に呼ばれる。

function func1(a1, a2){
  dojo.debug('func1');
}
function func2(){
  dojo.debug('func2');
}
function func3(){
  dojo.debug('func3');
}
function cb(){
  dojo.debug('cb');
}
function onend(){
  dojo.debug('onend');
}
var funcarr = new Array(3);
funcarr[0] = func1;
funcarr[1] = func2;
funcarr[2] = func3;

function init() {
  dojo.lang.delayThese(funcarr, cb, 1000, onend);
}
dojo.addOnLoad(init);
-->
DEBUG: func1
DEBUG: cb
DEBUG: func2
DEBUG: cb
DEBUG: func3
DEBUG: cb
DEBUG: onend

2007年5月12日 (土)

DOM操作

DOMノードの操作するメソッドがdojo.domに提供されている。以下に例を示す。利用するときは、dojo.domをrequireする。
dojo.require("dojo.dom");

var str = "<a><b>b1txt</b><b>b2txt</b><b2><c>c1txt</c><c>c2txt</c></b2></a>";
var dom = dojo.dom.createDocumentFromText(str);
var elm = dojo.dom.firstElement(dom.firstChild, 'b2');
var str2 = dojo.dom.innerXML(elm);
--> "<b2><c>c1txt</c><c>c2txt</c></b2>"
var tagName = dojo.dom.isTag(elm, "a", "b", "b2");
--> "b2"

以下にdojo.domのメソッド一覧を示す。

メソッド名概要
isNode(obj)引数のobjectがDOM Elementであるかどうかをbooleanで返す
firstElement(parentNode, tagName)タグ名が文字列tagNameである最初の子要素を取得する
lastElement(parentNode, tagName)タグ名が文字列tagNameである最後の子要素を取得する
nextElement(node, tagName)タグ名が文字列tagNameである次の要素を取得する
prevElement(node, tagName)タグ名が文字列tagNameである前の要素を取得する
moveChildren(srcNode, destNode, trim)srcNodeの子要素をdestNodeの子要素に移し、移動させた要素数を返す。trim==trueを指定するとテキストノードを取り除く
copyChildren(srcNode, destNode, trim)srcNodeの子要素をdestNodeに子要素としてコピーし、コピーした要素数を返す。trim==trueを指定するとテキストノードを取り除く
replaceChildren(node, newChild)nodeの全ての子要素を取り除き、newChildに置き換える
removeChildren(node)nodeの全ての子要素を取り除き、除いた要素数を返す
replaceNode(node, newNode)nodeをnewNodeに置き換え、取り除いたnodeの参照を返す
destroyNode(node)nodeを取り除く
removeNode(node)nodeが親を持つとき、親からnodeを取り除き、取り除いたnodeの参照を返す
getAncestors(node, filterFunction, returnFirstHit)optionのfilterFunctionにマッチする(filterFunction(node)==trueとなる)全ての祖先要素を返す。returnFirstHit==trueのときは、最初にマッチした祖先要素のみを返す
getAncestorsByTag(node, tag, returnFirstHit)要素名tagである全ての祖先要素を返す。returnFirstHit==trueのときは、最初にマッチした祖先要素のみを返す
getFirstAncestorByTag(node, tag)要素名tagである最初の祖先要素を返す
isDescendantOf(node, ancestor, guaranteeDescendant)nodeがancestorの子孫要素であるかどうかをbooleanで返す。guaranteeDescendant==tureを指定するとnodeとancestorが同じときにfalseとなる
innerXML(node)DOM Element(node)のXML文字列表現を返す
createDocument()クロスブラウザのXML Documentを作成する
createDocumentFromText(str, mimetype)XML文字列(str)をDOM Elementにして返す。Firefoxのときは、mimetype指定を指定した場合、new DOMParser().parseFromString(abc, "text/html")のように使うことができる
prependChild(node, parent)parentの最初の子要素にnodeを追加する
insertBefore(node, ref, force)refの前にnodeを移動させ、移動できたときはtrueを返す。force==trueのときはnodeとrefが同じ要素、refがnodeの前の要素であってもtrueを返す
insertAfter(node, ref, force)refの後ろにnodeをを移動させ、移動できたときはtrueを返す。force==trueのときはnodeとrefが同じ要素、refがnodeの後の要素であってもtrueを返す
insertAtPosition(node, ref, position)refに対するpositionの指定("before", "after", "first", "last")に基づいてnodeを追加する
insertAtIndex(node, containingNode, insertionIndex)containingNodeの子要素のinsertIndex番目にnodeを追加する
textContent(node, text)nodeの子要素をXML文字列(text)に置き換える
hasParent(node)nodeが親要素を持つかどうかをbooleanで返す
isTag(node, tagName1, tagName2, ...)nodeの要素名がtagName1, 2...として与えた名前の中に当てはまるものがあればその名前を文字列として返す。ないときは空文字列を返す
setAttributeNS(elem, namespaceURI, attrName, attrValue)DOM2のsetAttributeNSの実装

2007年5月 6日 (日)

色指定/変換

Dojoにおける色指定はColorオブジェクトを用いる。Colorオブジェクトは、ドローイングAPIにおいても用いられる。

Colorオブジェクトを利用するときは、dojo.gfx.colorをrequireする。以下にColorオブジェクトの作成例を示す。6桁または3桁のRGBカラーコード文字列(最初に#があってもなくてもよい)、CSSにおけるRGB指定の文字列、RGBの3つの数値または長さ3の数値配列のいずれかを指定できる。

dojo.require("dojo.gfx.color");
new dojo.gfx.color.Color("#003399")
new dojo.gfx.color.Color("rgb(0,51,153)")
new dojo.gfx.color.Color([0,51,153])
new dojo.gfx.color.Color(0,51,153)

各指定方法の最後にアルファチャネルを指定することもできる。

new dojo.gfx.color.Color("#003399", 0.5)
new dojo.gfx.color.Color("rgb(0,51,153)", 0.5)
new dojo.gfx.color.Color([0,51,153,0.5])
new dojo.gfx.color.Color(0,51,153,0.5)

Colorオブジェクトに対して、toXXX()メソッドを用いて様々な色指定方法に変換できる。HSV, HSLを用いるときは、それぞれ、dojo.gfx.color.hsv、dojo.gfx.color.hslをrequireする。

色指定方法メソッド概要
RGBtoRgb()RGBの3つの数値の配列を返す
RGB+αチャネルtoRgba()RGBとαチャネルを含む4つの数値の配列を返す
HEXtoHex()"#003399"のように、#と6桁のRGBカラーコード文字列を返す
CSStoCss()"rgb(0, 51, 153)"のようにrgb(...)を含んだRGBカラーコードの文字列を返す
HSVtoHsv()HSV(色相、彩度、輝度)の3つの数値の配列を返す
HSLtoHsl()HSL(色相、彩度、明度)の3つの数値の配列を返す

以下のdojo.gfx.colorのメソッドを用いて変換することもできる。

  • dojo.gfx.color.extractRGB(hex or "css-style string")
  • dojo.gfx.color.rgb2hsv(rgb)
  • dojo.gfx.color.rgb2hsl(rgb)
  • dojo.gfx.color.rgb2hex(rgb)
  • dojo.gfx.color.hsv2rgb(hsv)
  • dojo.gfx.color.hsl2rgb(hsl)
  • dojo.gfx.color.hsl2hex(hsl)
  • dojo.gfx.color.hex2rgb(hex)
  • dojo.gfx.color.hex2hsl(hex)

dojo.gfx.Colorspaceを用いて色指定方法を変換することもできる。dojo.gfx.Colorspaceを用いて変換するときは、dojo.gfx.Colorspaceをrequireし、dojo.gfx.Colorspaceオブジェクトを作成する。Colorspaceオブジェクトのconvertメソッドを用いて変換できる。

convertメソッドの最初の引数で、変換元の色指定方法における色指定を配列で指定する。2つ目の引数で変換元の色指定方法、3つ目の引数で変換先の色指定方法を指定する。以下に変換例を示す。

dojo.require("dojo.gfx.Colorspace");
var c = new dojo.gfx.Colorspace();
var cmy = c.convert([0,51,153], 'RGB', 'CMY');

以下に変換できる色指定方法の一覧を示す。

色指定方法配列での指定方法
RGB RGBを表す長さ3の配列
XYZ XYZ色空間を表す長さ3の配列
xyY XYZ系の変形であるxyY色空間を表す長さ3の配列
Lab Lab色空間の明度、赤~緑(a軸)、黄~青(b軸)を表す長さ3の配列
LCHab LCHab色空間を表す長さ3の配列
Luv Luv色空間の明度指数、色度(u)、色度(v)を表す長さ3の配列
LCHuv LCHuv色空間を表す長さ3の配列
CMY CMYを表す長さ3の配列
CMYK CMYKを表す長さ4の配列
HSV 色相、彩度、明度を表す長さ3の配列
HSL 色相、彩度、輝度を表す長さ3の配列

2007年5月 1日 (火)

IFrameを使った呼び出し

dojo.io.bindは、デフォルトではXMLHttpRequestを使ってサービスを呼び出すが、IFrameを使って呼び出すこともできる。 IFrameを使った場合、XMLHttpRequestを実装していない古いブラウザでも動作するメリットがある。一方で、IFrameでは、GETのみでPOSTが使えないため、主に情報の取得のみに使う。

IFrameを使って呼び出すときは、"dojo.io.IframeIO"をrequireし、dojo.io.bindの引数のtransportプロパティとして、"IframeTransport"を指定する。

IFrameを使ったときのサービスはHTMLを返す。mimetypeとしてtext/htmlを指定したときは、HTML全体のDOMを取得できる。以下にHTMLを返すサービスを呼び出す例を示す。

dojo.require("dojo.io.*");
dojo.require("dojo.io.IframeIO");

dojo.io.bind({
  url: "iframe.html",
  mimetype: "text/html",
  transport: "IframeTransport",
  content: {
    param1: "aa",
    param2: "bb"
  },
  load: function(type, data, evt) { alert(data);}
});

text/plain, text/javascript, text/json, application/jsonを指定したときは、サーバが返すHTML内の<textarea>以下に送りたい情報を含める。text/plainのときは、<textarea>以下の文字列がそのまま返る。text/javascriptのときは、<textarea>以下の文字列がevalされる。text/json, application/jsonのときは、<textarea>以下にJSON形式の文字列がJSONオブジェクトに変換されて返される。以下にJSONオブジェクトを返すときのIFrame HTMLの例を示す。

<html>
  <head></head>
  <body>
    <textarea>{"test": "hello"}</textarea>
  </body>
</html>

IFrameを使ったときはtext/xmlに対応していない。

2007年4月30日 (月)

RPC呼び出し

dojo.io.bindを用いるのではなく、dojo.rpc.JsonServiceを用いることで、JSONで提供されるサービスをRPCのようなAPIにより呼び出すことができる。内部的にはdojo.io.bindを用いている。

RPC呼び出しを用いるときは、Simple Method Description (SMD)と呼ばれるRPC呼び出しの定義を記述したファイルを作成する。SMDファイルは以下のようにJSON形式で記述する。

SMDファイルの形式では、serviceTypeは"JSON-RPC"を指定する。serviceURLは呼び出し先のURLを指定する。methodsには、各メソッド名とパラメータ名、パラメータの型を指定する。

{
  "serviceType": "JSON-RPC",
  "serviceURL": "rpcProcessor.php",
  "methods":[
    {
      "name": "add",
      "parameters":[
        {"name": "x", "type":"STRING"},
        {"name": "y"} 
      ]
    },
    {
      "name": "subtract",
      "parameters":[
        {"name": "x"},
        {"name": "y"} 
      ]
    }
  ]
}

RPC呼び出しを実行するときは、まず作成したSMDファイルを指定して、dojo.rpc.JsonServiceをインスタンス化する。

var myObject = new dojo.rpc.JsonService("http://localhost/definition.smd");

SMDファイルを作らずに、JSONオブジェクトを直接渡してJsonServiceをインスタンス化することもできる。JSONオブジェクトを直接渡すときは、smdObjの値としてJSONオブジェクト(以下の例ではjsonSmdDefinition)を指定した値を渡す。

var myObject = new dojo.rpc.JsonService({smdObj: jsonSmdDefinition});

JsonServiceをインスタンス化した後は、作成したオブジェクトに対してメソッド呼び出しを実行する。呼び出すだけでなく、結果を受け取るにはaddCallbackメソッドを用いて、コールバック関数を指定する。コールバック関数で指定したfunctionでは、引数として呼び出し結果を受け取ることができる。

var myObject = new dojo.rpc.JsonService("http://localhost/definition.smd");
var myDeferred = myObject.add(3,5).addCallback(myCallbackMethod);

addCallbacksを用いことで、コールバック関数だけでなく、エラー時に呼び出す関数も指定できる。

var myObject = new dojo.rpc.JsonService("http://localhost/definition.smd");
var myDeferred = myObject.add(3,5).addCallbacks(myCallbackMethod, errCallbackMethod);

クロスドメイン呼び出し

Dojoでは、異なるドメインのサービスをブラウザから直接呼び出する方法として、scriptタグによる方法(ScriptSrcTransport)とIFrame(XhrIframeProxy)による方法の2つを提供している。

ScriptSrcTransport

scriptタグを用いてJavaScript/JSONサービスを呼び出すことで、異なるドメインのサービスをブラウザから直接呼び出すことができる。

scriptタグを用いて呼び出すときも、dojo.io.bindを用いる。transportプロパティとしてScriptSrcTransportを指定する点が異なる。scriptタグによる呼び出しの最も簡単な例を以下に示す。

dojo.require("dojo.io.ScriptSrcIO");

dojo.io.bind({
  url: "http://the.script.url/goes/here",
  transport: "ScriptSrcTransport"
});

上記の例では、呼び出しが完了したことを知ることができない。呼び出すサービスのレスポンスメッセージにJavaScriptの変数が含まれるときは、その変数が定義されるのを待って、通知を受けることができる。

レスポンスメッセージに含まれるJavaScriptの変数をcheckStringパラメータの値として指定する。以下の例では、変数fooが定義されたら(typeof(foo) != undefinedとなったら)、loadパラメータで指定したFunctionが呼び出される。

dojo.io.bind({
  url: "http://the.script.url/goes/here",
  transport: "ScriptSrcTransport",
  checkString: "foo",
  load: function(type, data, event, kwArgs) { alert(data);},
  error: function(type, data, event, kwArgs) { alert(data.message);},
  timeout: function() { /* Called if there is a timeout */},
  timeoutSeconds: 10
});

JSONP形式のcallback関数名を指定できるサービスのときは、jsonParamNameパラメータとしてcallback関数名を指定するパラメータ名を指定することで、呼び出しが完了した通知を受けることができる。また、mimetypeには"application/json"を指定する。

DojoのJSONP対応のAPIを利用するには、callback関数名を指定できるようになっている必要がある。callback関数名を指定するパラメータ名をjsonParamNameに指定する。

以下の例では、 livedoor クリップのJSONPによるAPIを使っている。

dojo.require("dojo.io.ScriptSrcIO");

dojo.io.bind({
  url: 'http://api.clip.livedoor.com/json/clips',
  content: {livedoor_id: "staff_clip", limit: 10},
  transport: "ScriptSrcTransport",
  jsonParamName: "callback",
  method: "get",
  mimetype: "application/json",
  load: function(type, data, event) {
    var output = dojo.byId('output');
    output.innerHTML+="タイトル:"+data.title+"<br />";
    for(i=0; i<data.clips.length; i++){
      output.innerHTML+="<br />";
      output.innerHTML+="<a href='"+data.clips[i].link+"'>"+data.clips[i].title+"</a>";
    }
  }
});

XhrIframeProxy

dojo.io.XhrIframeProxyを用いることで、JSONPではないクロスドメインのサービスを呼び出すことができる。 XhrIframeProxyはサービスと同じドメインにIFrameを配置し、配置したIFrameからサービス呼び出ししている。

XhrIframeProxyを使うときは、dojo.require("dojo.io.XhrIframeProxy")を追加する。

dojo.io.bindのiframeProxyUrlパラメータの値として、サービスが提供されているドメインと同じドメインの場所に置いたxip_server.htmlファイルの場所をdojo.io.bindの引数に追加する。xip_server.htmlはsrc/io/xip_server.htmlに置かれているので、このファイルをコピーして、サービスと同じドメイン内に置く必要がある。

また、xip_server.htmlと同じフォルダにisAllowed.jsを作成して、リクエストごとにサービス呼び出しを許可するかどうか判別する必要がある。isAllowed.jsには、isAllowedRequest(request)メソッドを実装する。以下 にisAllowed.jsの例を示す。

function isAllowedRequest(request){
/* Decide if you want to allow the request. Return true or false */
  return true;
}

以下にXhrIframeProxyの呼び出し例を示す。

dojo.require("dojo.io.XhrIframeProxy");

function init(){
  dojo.io.bind({
    iframeProxyUrl: "http://ymdmstk.cocolog-nifty.com/src/xip_server.html",
    url: "http://ymdmstk.cocolog-nifty.com/sample/sample.txt",
    mimetype: "text/plain",
    load: function(type, data, evt){
      dojo.debug(data);
    }
  });
}

XhrIframeProxyでは、非同期リクエストのみがサポートされる(sync:trueは無効となる)。

パラメータ指定

パラメータを指定してAjaxの呼び出しをする場合、一番シンプルな方法は、URLの後ろに文字列としてパラメータを指定する方法である。

dojo.io.bind({
  url: "http://ymdmstk.cocolog-nifty.com/sample?param1=aa&param2=bb",
  load: function(type, data, evt) { alert(data);}
});

contentパラメータにオブジェクトを指定することで、パラメータを指定することもできる。この場合、空白や日本語などの文字列を自動的にURL Encodeしてくれる。

dojo.io.bind({
  url: "http://ymdmstk.cocolog-nifty.com/sample",
  content: {
    param1: "aa",
    param2: "bb"
  },
  load: function(type, data, evt) { alert(data);}
});

HTTPメソッド

デフォルトではGETによりパラメータを送信している。POSTでパラメータを送信したいときは、methodパラメータで"post"を指定する。methodには、postかgetを指定できる。

dojo.io.bind({
  url: "http://ymdmstk.cocolog-nifty.com/sample",
  method: "post",
  content: {
    param1: "aa",
    param2: "bb"
  },
  load: function(type, data, evt) { alert(data);}
});

フォーム

formNodeパラメータの値としてHTML FormのDOMノードを指定することで、フォームに入力したの値をパラメータとして送ることができる。

<html>
<head>
<title>dojo.io.bind</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  <script type="text/javascript" src="dojo.js"></script>
  <script type="text/javascript">
dojo.require("dojo.io.*");

function doit() {
  dojo.io.bind({
    url: "sample.xml",
    mimetype: "text/xml",
    method: "post",
    formNode: dojo.byId("sampleform"),
    load: function(type, data, evt) {
      alert(data);
    }
  });
}
</script>
</head>

<body>
  <form id="sampleform">
    <input type="text" name="param1"><br />
    <input type="radio" name="param2" value="1a" checked="checked">1a
    <input type="radio" name="param2" value="2a">2a
    <input type="radio" name="param2" value="3a">3a<br />
    <input type="text" name="param3"><br />
  </form>
  <input type="button" value="Get sample.txt" onclick="doit();">
</body>
</html>

dojo.io.FormBind

フォームに入力した値をAjax呼び出し時に用いるときは、dojo.io.bind()ではなく、dojo.io.FormBind()を使うことができる。formのmethod, actionパラメータの値、formのsubmitボタンをそのままAjax呼び出しにおいても利用できる。

<html>
<head>
<title>dojo.io.bind</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  <script type="text/javascript" src="dojo.js"></script>
  <script type="text/javascript">
dojo.require("dojo.io.*");

function doit() {
  var x = new dojo.io.FormBind({
    formNode: dojo.byId("sampleform"),
    mimetype: "text/xml",
    load: function(type, data, evt) {
      alert(data);
    }
  });
  x.onSubmit = function(form) {
    dojo.byId("output").innerHTML = "Loading...";
    return true; 
  }
}
dojo.addOnLoad(doit);
</script>
</head>

<body>
  <div id="output"></div>
  <form method="post" action="sample.xml" id="sampleform">
    <input type="text" name="param1"><br />
    <input type="radio" name="param2" value="1a" checked="checked">1a
    <input type="radio" name="param2" value="2a">2a
    <input type="radio" name="param2" value="3a">3a<br />
    <input type="text" name="param3"><br />
    <input type="submit" value="Get sample.txt">
  </form>
</body>
</html>

2007年4月22日 (日)

Ajax機能

Dojoでは、dojo.io.bind()により、クロスブラウザのAjax機能を提供する。以下のシンプルな例では、ボタンを押すと、"sample.txt"を取得して、ファイルの中身をポップアップで表示する。

<html>
<head>
<title>dojo.io.bind</title>
<script type="text/javascript" src="dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.io.*");

function doit() {
  dojo.io.bind({
    url: "http://ymdmstk.cocolog-nifty.com/sample/sample.txt",
    load: function(type, data, evt) {
      alert(data);
    }
  });
}
</script>
</head>

<body>
  <input type="button" value="Get sample.txt" onclick="doit();">
</body>
</html>

dojo.io.bindの引数となるObjectのパラメータに、Ajax呼び出しの方法を指定する。先の例では、urlとloadをパラメータとして指定している。urlには呼び出し先のURL、loadには呼出し後の処理を記述する。

loadパラメータはFunctionを引数として取り、Functionは、type, data, evtの3つを引数として受け取る。typeには文字列"load"が固定で入る。dataには、取得したデータが入る。この例ではテキストファイルを取得しているため文字列としてデータが入る。evtには、XMLHttpRequestオブジェクトが入る。

エラー処理

ファイル/サービスが存在しないなどの理由によりAjaxの呼び出しに失敗したときの処理を、errorに書く事ができる。

dojo.io.bind({
  url: "http://ymdmstk.cocolog-nifty.com/sample/sample.txt",
  load: function(type, data, evt) { alert(data);},
  error: function(type, data, evt) { alert("エラー:"+data.message);}
});

errorのときは、dataにdojo.io.Errorが入る。dojo.io.Errorは、message, type, numberの3つのパラメータを持つ。messageにはエラーメッセージ、typeにはエラーの種類、"io", "parse", "unknown"のいずれかが入る。numberにはエラー番号が入る。

loadまたはhandleのFunction中においてエラーを投げたときも(throw new Error("..."))、errorのFunctionが呼ばれる。

タイムアウト処理

timeoutSecondsパラメータを指定することで、タイムアウトするまでの時間を秒単位で指定できる。デフォルトのtimeoutSecondsは0となっており、永遠に処理を待つ設定となっている。ブラウザから同一ドメインへの同時アクセスは2つまでとなっているため、永遠に待つ設定となっているのは問題がある。timeoutSecondsを設定するのが望ましい。

タイムアウトしたときは、timeoutで指定したFunctionが呼ばれる。timeoutのFunctionはerrorと同じように指定できる。

dojo.io.bind({
  url: "http://ymdmstk.cocolog-nifty.com/sample/sample.txt",
  load: function(type, data, evt) { alert(data);},
  error: function(type, data, evt) { alert("エラー:"+data.message);},
  timeout: function(type, data, evt) { alert("タイムアウトエラー:"+data.message);},
  timeoutSeconds: 10
});

レスポンスのデータ形式

レスポンスのデータ形式は、テキスト, XML, JavaScript, JSONに対応する。 デフォルトはテキストだが、レスポンスのデータ形式を変えるときは、mimetypeプロパティで指定する。 テキスト: "text/plain", XML: "text/xml" or "application/xml", JSON: "text/json" or "application/json", JavaScript: "text/javascript"をそれぞれ指定する。

テキスト以外のときは、レスポンスのデータ形式が文字列ではなく、それぞれの対応するオブジェクトになる。XMLではDOM、JSONではJSON、JavaScriptではJavaScriptのオブジェクトが返る。

JSON、JavaScriptのときは返り値のテキストをevalしてJavaScriptのオブジェクトに変換しているだけ (JSONのときは前後に"(", ")"を付けている) であるため、セキュリティについて考慮するときは、問題があるコードが含まれていないかevalする前にテキストを処理するコードを追加することが必要である。

パラメータ一覧

以下に、dojo.io.bindの引数となるObjectのパラメータ一覧を示す。

パラメータ概要
load Function 呼び出しに成功した後の処理を指定する
error Function 呼び出しに失敗した後の処理を指定する
timeout Function タイムアウトした後の処理を指定する
handle Function load, error, timeoutの全てのときに、handleが呼ばれ、typeの 値で処理の振り分けできる。
url String URL
method String GET, POST、デフォルトはGET
mimetype String "text/plain", "text/javascript", "text/xml", "application/xml", "text/json", "application/json", デフォルトは"text/plain"
transport String "XMLHTTPTransport", "RhinoHTTPTransport", "ScriptSrcTransport", "IframeTransport"
headers Object HTTP request headerのnameとvalue
sendTransport boolean trueのときはdojo.transport=xmlhttpがrequestに加えられる
encoding String kwArgs contentを処理するときのエンコーディング指定
content Object dojo.io.argsFromMap()が渡されると、name=value&name=valueに変換される
formNode DOMNode 通常は使わない。dojo.io.FormBind()を使うべきである。name=value&name=valueに変換される
postContent String name=value&name=valueをrequestの一部に加える
back or backButton Function backボタンが押されたときに呼ばれる関数を指定する
changeUrl boolean or String backボタンのサポートとして使われる
user String XMLHttpRequest.open()に渡される
password String XMLHttpRequest.open()に渡される
file Object or Array of Object アップロードするファイルを指定する。Objectは、name or fileName, contentType, contentを含む。
multipart boolean multipartを用いるかどうかを指定する
sync boolean trueにすると同期呼び出しとなる。デフォルトはfalse
useCache boolean キャッシュの利用有無を指定する。デフォルトはfalse
preventCache boolean trueにすると同じリクエストに対して内部キャッシュを使う。デフォルトはfalse。
timeoutSeconds int タイムアウトするまでの秒数

2007年4月20日 (金)

Cookieへのデータ保存

DojoではCookieを扱うAPIをdojo.io.cookieにおいて提供する。オブジェクトをシリアライズすることで、文字列だけでなく、オブジェクトを保存して取り出すことができるのが特徴である。

dojo.provide("dojo.io.cookie");

メソッドの一覧を以下に示す。setCookie/getCookieは文字列のみをCookieに保存/取得できる。setObjectCookie/getObjectCookieを使うことでオブジェクトを扱える。オブジェクトは、配列、連想配列または、単純なプロパティ名と値(文字列または数値)の組を持つオブジェクトに限られる。

メソッド説明
dojo.io.cookie.isSupported() ブラウザがCookieをサポートしているか
dojo.io.cookie.setCookie(name, value, days, path, domain, secure) 文字列をCookieに保存する
dojo.io.cookie.setObjectCookie(name, obj, days, path, domain, secure, clearCurrent) オブジェクトをCookieに保存する
dojo.io.cookie.getCookie(name) Cookieに保存した文字列を取り出す
dojo.io.cookie.getObjectCookie(name) Cookieに保存したオブジェクトを取り出す
dojo.io.cookie.deleteCookie(name) Cookieから削除する

clearCurrentがtrueのときは、古いオブジェクトは削除される。clearCurrentがfalseのときは、古いオブジェクトのプロパティのうち、追加/更新された値だけが更新される。上書きされないプロパティは削除されない。

daysは有効期限の日数を指定する。domainとpathによりCookieの利用範囲を指定することができる。secureはCookieのセキュアフラグの有効/無効を指定する。

var array1 = [1, 3, 5, 12, 22];

if(dojo.io.cookie.isSupported()){
  dojo.io.cookie.setObjectCookie("array1", array1, 60, true);
  dojo.debugShallow(dojo.io.cookie.getObjectCookie("array1"));
  dojo.io.cookie.deleteCookie("array1");
}

2007年4月13日 (金)

ドローイングAPI

dojo.gfxはクロスブラウザのドローイングAPIを提供する。ブラウザはFireFox 1.5+、Internet Explorer 6+、Opera 9をサポートしており、IEではVML、FireFoxとOperaではSVGを用いて実現している。

dojo.gfxを使うときは、dojo.gfx.*をrequireする。

dojo.require("dojo.gfx.*");

最初にcreateSurfaceを使って描画する領域となるdojo.gfx.Surfaceを作る。createSurfaceの引数として、描画領域を作成するHTML要素、幅、高さを指定する。

var node = dojo.byId('test');
var surfaceWidth = 150;
var surfaceHeight = 150;
var surface = dojo.gfx.createSurface(node, surfaceWidth, surfaceHeight);

このSurfaceに対して、図形(shapeオブジェクト)を追加する。以下の例では、Surfaceに対して、長方形(Rectオブジェクト)を追加している。 Rectオブジェクトに対してsetFillで色を指定している。最初の4つの引数でRGBを指定し、4つ目の引数で透明度を指定する。

var rect = { x: 50, y: 50, width: 100, height: 70 };
surface.createRect(rect).setFill([0, 0, 255, 0.5])

Shapeオブジェクトの種類

Surfaceオブジェクトに対して、craeteXXXメソッドを使うことで、Shapeオブジェクトを作ることができる。以下の7つのShapeオブジェクトを作ることができる。

createメソッド作成されるオブジェクトcreateメソッドの引数の例
createPath ベジェ曲線 "m100 100 100 0 0 100c0 50-50 50-100 0s-50-100 0-100z"
createRect 長方形 { x: 150, y: 50, width: 100, height: 70, r:15}
createCircle {cx: 250, cy: 160, r: 35}
createEllipse 楕円 {cx: 250, cy: 50, rx: 80, ry: 30}
createLine 直線 {x1: 20, y1: 180, x2: 380, y2: 130}
createPolyline 折れ線 [{x: 350, y: 200}, {x: 100, y: 100}, {x: 100, y: 200}, {x: 20, y: 50}]
createImage 画像 {width: 225, height: 96, src: "http://dojotoolkit.org/sites/all/themes/dojotoolkit.org/logo.png"}

各種Shapeオブジェクトのサンプル

塗りつぶし

setFillメソッドを使うことで、Shapeオブジェクトの内側の色/画像を指定できる (LineとImageは設定できなかった)。同じ色で塗りつぶすだけでなく、グラデーションをかけることができる。以下に例を示す。

var radial = {type: "radial", cx: 0, cy: 100, r: 50,
colors: [{offset: 0, color: "red"}, {offset: 0.5, color: "green"}, {offset: 1, color: "blue"}]}
rectShape.setFill(radial);

var linear = {type: "linear", x1: 0, y1: 0, x2: 75, y2: 50,
colors: [{offset: 0, color: "#F60"}, {offset: 1, color: "#FF6"}]};
rectShape2.setFill(linear);

var pattern = {type: "pattern", x: 0, y: 0, width: 96, height: 96,
src: "http://dojotoolkit.org/img/viewcvs.png"}
rectShape3.setFill(pattern);

同じ色で塗りつぶすときは、文字列としてRGBまたは色名で色を指定する方法と、配列またはdojo.gfx.color.Colorオブジェクトで指定する方法とがある。配列またはdojo.gfx.color.Colorでは、RGBと透過率を指定する。

  • "#ddd"
  • "green"
  • [255, 0, 0, 0.5]
  • new dojo.gfx.color.Color([255, 0, 0, 0.5])

グラデーションをかけるときは、連想配列で設定値を指定する。連想配列のキー: "type"により、グラデーションの掛け方を指定できる。typeには、"radial": 放射状、"linear": 線形、"pattern": 格子状(?)の3つを指定できる(patternはうまく動作しなかった)。

var radial = {type: "radial", cx: 0, cy: 100, r: 50,
colors: [{offset: 0, color: "red"}, {offset: 0.5, color: "green"}, {offset: 1, color: "blue"}]}

var linear = {type: "linear", x1: 0, y1: 0, x2: 75, y2: 50,
colors: [{offset: 0, color: "#F60"}, {offset: 1, color: "#FF6"}]};

var pattern = {type: "pattern", x: 0, y: 0, width: 96, height: 96,
src: "http://dojotoolkit.org/img/viewcvs.png"}

Shape塗りつぶしのサンプル

枠の指定

setStrokeメソッドによりShapeオブジェクトの枠を指定できる。setStrokeメソッドの引数の連想配列で設定値を指定する。連想配列のキーとして、color: 枠の色, width: 枠の太さ, cap: 端の処理, join: 線の継ぎ目、の4つを指定できる。

capは、"round": 丸み、"butt": バット、"square": 四角、のいずれかを指定できる。capを指定しなかったときは"butt"となる。

joinは、"miter": 留め継ぎ/角、"round": 丸み、"bevel": 面取り、または数字、のいずれかを指定できる。joinを指定しなかったときは"miter"となる。数字を指定すると、つなぎ目の太さを指定できる。

rectShape.setStroke({color: [0, 0, 255, 0.5], width: 2, cap: "butt", join: 2})  

Shape枠のサンプル

移動/変形

setTransformメソッドにより、Shapeオブジェクトを移動/変形できる。setTransformメソッドの引数には、dojo.gfx.matrix.XXX メソッドを渡して、移動/変形方法を指定する。引数に配列を渡して、複数の変形方法を組み合わせることもできる。

rectShape.setTransform(dojo.gfx.matrix.rotategAt(45, 250, 250));

rectShape2.setTransform([dojo.gfx.matrix.translate(100,0), dojo.gfx.matrix.rotateg(-45)]);

以下にsetTransformの引数として指定できるメソッド一覧を示す。メソッド名の最後にgがあるときは、角度を度(degree)ではなくラジアン/弧度(radian)で指定する。 メソッド名の最後にAtがある場合は、変形(回転、縮尺変更、斜めのゆがみ)の中心点を指定できる。通常は原点(0, 0)が中心となる。

メソッド説明
dojo.gfx.matrix.translate(100,100) 位置の移動
dojo.gfx.matrix.scale(2, 1.5) X座標, Y座標の縮尺変換。引数が一つのみのときはX/Y軸を同じ縮尺で変換する
dojo.gfx.matrix.scaleAt(2, 1.5, 100, 50)  
dojo.gfx.matrix.rotate(0.17*3.14) 回転 (角度をラジアンで指定する)
dojo.gfx.matrix.rotateAt(0.17*3.14, 250, 50)  
dojo.gfx.matrix.rotateg(30) 回転 (角度を度で指定する)
dojo.gfx.matrix.rotategAt(30, 250, 50)  
dojo.gfx.matrix.skewX(0.17*3.14) X軸に対して斜めに歪める (角度をラジアンで指定する)
dojo.gfx.matrix.skewXAt(0.17*3.14, 250, 50)  
dojo.gfx.matrix.skewXg(30) X軸に対して斜めに歪める (角度を度で指定する)
dojo.gfx.matrix.skewXgAt(30, 250, 50)  
dojo.gfx.matrix.skewY(0.17*3.14) Y軸に対して斜めに歪める (角度をラジアンで指定する)
dojo.gfx.matrix.skewYAt(0.17*3.14, 250, 50)  
dojo.gfx.matrix.skewYg(30) Y軸に対して斜めに歪める (角度を度で指定する)
dojo.gfx.matrix.skewYgAt(30, 250, 50)  

移動/変形は、Shapeオブジェクト1つずつに対して指定するだけでなく、グループ化してからまとめて指定できる。グループ化するには、まずSurfaceオブジェクトに対してcreateGroup()を実行することでGroupオブジェクトを作成する。

var surface = dojo.gfx.createSurface("shapes", 400, 200);
var g1 = surface.createGroup();

作成したグループに対してShapeオブジェクトを登録するには、Groupオブジェクトのaddメソッドを用いるか、Groupオブジェクトに対して、createXXXメソッドを実行してShapeオブジェクトを作成する。

var rect = { x: 50, y: 50, width: 100, height: 70 };
var rectShape = surface.createRect(rect).setFill([0, 0, 255, 0.5]);

var circle = {cx: 250, cy: 160, r: 35}
var circleShape = surface.createCircle(circle).setStroke({color: "black", width: 2});

g1.add(rect);
g1.add(circleShape);
g1.setTransform(dojo.gfx.matrix.rotateAt(-45, 250, 250));

前面/背面に移動

Shapeオブジェクトの重ね合わせの順番を変えることができる。Shapeオブジェクトに対して、moveToFront()を指定すると前面に移動する。moveToBack()を指定すると背面に移動する。

rectShape.moveToFront();
rectShape2.moveToBack();

ベジェ曲線

ベジェ曲線を描くときは、Surfaceオブジェクトに対してcreatePathメソッドを 実行する。createPathの引数において、直線/曲線の描き方を指定する。

下記の例では、MはmoveTo (座標の移動)、LはlineTo (線を引く)を示している。 大文字で指定すると絶対座標、小文字で指定すると相対座標を示す。 指定の仕方はSVGにおけるpath要素のd属性値と同じである。

var surface = dojo.gfx.createSurface("shapes", 400, 200);
var pathShape = surface.createPath("M10,10 L200 80, l30,50");
pathShape.setStroke({color: "red", cap: "butt"});

直線/曲線の描き方は、createPathの引数として指定するだけでなく、Pathオブジェクト に対するメソッドにより指定することもできる。以下に上記と同じ線を描く例を示す。 setAbsoluteModeは、絶対位置(true または "absolute")/相対位置指定(false または "relative")を指定する。

var pathShape = surface.createPath();
pathShape.setStroke({color: "red", cap: "butt"});
pathShape.moveTo(10, 10);
pathShape.lineTo(200, 80);
pathShape.setAbsoluteMode(false);
pathShape.lineTo(30, 50);

直線/曲線の指定方法を以下に示す。

コンストラクタでの指定メソッド説明
m moveTo(10, 10) 移動
l lineTo(30, 50) 直線を引く
h hLineTo(100) 水平に線を引く
v vLineTo(100) 垂直に線を引く
c curveTo(300, 300, 200, 200, 100, 100) 3次ベジェ曲線を引く
s smoothCurveTo(300, 300, 100, 100) 滑らかな3次ベジェ曲線を引く
q qCurveTo(300, 300, 100, 100) 2次ベジェ曲線を引く
t qSmoothCurveTo(100, 100) 滑らかな2次ベジェ曲線を引く
a arcTo(25, 100, 15, true, true, 150, 125) 楕円の弧を引く
z closePath() Pathを閉じる

イベント割り当て

Shapeオブジェクトに対して、クリックやドラッグなどのイベントを割り当てることができる。イベントを割り当てるには、dojo.event.connectを用いる。dojo.event.connectの最初の引数となるHTML Nodeとして、Shapeオブジェクトのノード(getEventSource()またはgetNode()メソッドで得られる)を指定する。
var circle = {cx: 250, cy: 160, r: 35}
var circleShape = surface.createCircle(circle).setStroke({color: "black", width: 2});
...

dojo.event.connect(circleShape.getEventSource(), "onclick", "func1"});
setFillで塗りつぶしてないと枠のみがonclickに反応する。

2007年4月10日 (火)

Collection

dojoでは、以下のCollectionオブジェクトが提供されている。GraphとSkipListはソースは存在しているが利用できなくなっている(dojo.experimentalにより無効化されている)。

ArrayList

一般にArrayListはサイズ変更可能な配列である。元々JavaScriptの配列はサイズ変更可能であるため、配列の途中に新たな要素を容易に追加したり、削除できる点などがDojoのArrayListの特徴である。

ArrayListの内部では配列として値を保持しており、ArrayListのためのメソッドを追加している。配列のメソッドを利用することはできない。

ArrayListを利用するときは、dojo.collections.ArrayListをrequireする。

dojo.require("dojo.collections.ArrayList");

コンストラクタは、dojo.collections.ArrayListを用いる。

var al = new dojo.collections.ArrayList(["foo","bar","test","bull"]);
メソッド名概要
add(obj) pushと同じ
addRange(array) pushと同じ
clear() splice(0, ary.length)と同じ
clone() ArrayListのクローンを作成する
contains(obj) objがArrayListに含まれるか
count lengthと同じ
forEach(function, scope) ArrayListの各要素にfunctionを適用する
getIterator() dojo.collections.Iteratorを返す
indexOf(obj) objの順番を返す。ないときは-1を返す
insert(index, obj) index番目にobjを挿入する
item(index) index番目の要素を返す
remove(obj) ArrayListからobjを削除する
removeAt(index) index番目の要素を削除する
reverse() reverse()と同じ
setByIndex(index, obj) index番目の要素をobjに置き換える
sort() sort()と同じ
toArray() 配列に変換して返す
toString('str') join('str')と同じ

2分木/BinaryTree

2分木は要素を検索しながら、要素の挿入/削除も行うときに効果がある。 同じ要素を複数挿入することはできない。 また、数値と文字列を混在させることもできない。 2分木/BinaryTreeを利用するときは、dojo.collections.BinaryTreeをrequireする。

dojo.require("dojo.collections.BinaryTree");

以下に利用例を示す。

var tree = new dojo.collections.BinaryTree(2);
tree.add(3);
tree.add(23);
tree.add(12);
tree.add(1);
tree.toString();
--> '1 2 3 12 23'
メソッド名概要
add(obj) 要素を追加する
clear() 全ての要素を削除する
clone() BinaryTreeのクローンを作成する
contains(obj) 要素が含まれるかどうかを返す
count 要素の数を返す
deleteData(obj) 指定した要素を削除する
getIterator() dojo.collections.Iteratorを返す
search(data) 2分木を探索してnodeオブジェクト(プロパティとしてvalue, left, rightを持つ)を返す
toString(order, sep) 探索方法と区切り文字を指定して、各要素を繋げた文字列を返す。引数は省略できる。orderには、dojo.collections.BinaryTree.TraversalMethods.Preorder/Inorder/Postorder (または1/2/3)のいずれかを指定できる

Dictionary/連想配列

Dictionary/連想配列は、文字列(key)を添え字とした配列である。JavaScript自体でも連想配列が提供されているが、Dictionaryではいくつか便利なメソッドを提供している。Dictionaryを利用するときは、dojo.collections.Dictionaryをrequireする。

dojo.require("dojo.collections.Dictionary");

以下に利用例を示す。

var dic = new dojo.collections.Dictionary();
dic.add("foo","bar");
dic.add("baz","fab");
dic.add("buck","shot");
dic.add("apple","orange");
dic.item("foo");

以下にDictionaryのメソッド一覧を示す。keyは文字列のみを指定できる。

メソッド名概要
add(key, obj) 新しい要素を追加
clear() 全ての要素を削除する
clone() Dictionaryのクローンを作成する
count 要素の数を返す
contains(key) 指定したkeyが含まれるかどうか
containsKey(key) contains(key)と同じ
containsValue(obj) 指定した要素が含まれるかどうか
entry(key) keyに対応する要素をdojo.collections.DictionaryEntryとして返す
forEach(function, scope) Dictionaryの各要素にfunctionを適用する
getIterator() dojo.collections.DictionaryIteratorを返す
getKeyList() 登録されている全てのkeyの配列を返す
getValueList() 登録されている全ての要素の配列を返す
item(key) keyに対応する要素を返す。entry(key).valueOf()と同じ
remove(key) keyと対応する要素を削除する

 

DictionaryEntryは、toString()とvalueOf()のメソッドを持つ。 DictionaryIteratorは、以下のメソッドを持つ。

atEnd() カーソルが最後に達したかどうかを判定する
get() 要素を取り出し、カーソルを1つ進める
map(function, scope) 各要素にfunctionを適用する
reset() カーソルをリセットする

SortedList

内部的にkeyでソートされた連想配列を作る。SortedListはDictionaryのメソッドを全て持ち、さらにindexを引数として取るメソッドが追加されている。 登録しながら、ソートされた一覧が欲しいときには便利だが、登録処理は遅くなる。 登録後に置き換えると、indexで取得する要素とkeyで取得する要素が合わなくなるときがある。 SortedListを利用するときは、dojo.collections.SortedListをrequireする。

dojo.require("dojo.collections.SortedList");

以下に利用例を示す。

var sl = new dojo.collections.SortedList();
sl.add("foo","bar");
sl.add("baz","fab");
sl.add("buck","shot");
sl.add("apple","orange");
for(i=0; i

Dictionaryに対して追加されているメソッドのみを以下に示す。

メソッド名概要
copyTo(arry, i) 引数の配列(array)のi番目にSortedListの内容を配列に変換して挿入する
getByIndex(i) i番目の要素を取得する
getKey(i) i番目のkeyを取得する
indexOfKey(key) 指定したkeyのindexを取得する
indexOfValue(obj):指定したobjのindexを取得する
removeAt(i) i番目の要素/keyを削除する
replace(key, obj) 指定したkeyに対応する要素を置き換える
setByIndex(i, obj) i番目の要素をobjに置き換える

Queue

QueueはFirst In First Outのデータ構造である。Queueを利用するときは、dojo.collections.Queueをrequireする。

dojo.require("dojo.collections.Queue");

以下に利用例を示す。

var queue = new dojo.collections.Queue(["foo","bar","test","bull"]);
queue.enqueue("new");
queue.peek();
queue.dequeue();
queue.toArray();
--> ["bar", "test", "bull", "new"]
メソッド名概要
clear() queueを空にする
clone() Queueのクローンを作成する
contains(obj) 指定した要素が含まれるかどうか
copyTo(array, i) 引数の配列(array)のi番目にqueueの内容を配列に変換して挿入する
count 要素数を返す
dequeue() queueの先頭から要素を取得して、queueから削除する
enqueue(obj) queueに要素を追加する
forEach(function, scope) queueの各要素にfunctionを適用する
getIterator() dojo.collections.Iteratorを返す
peek() queueの先頭の要素を取得する。queueからは削除しない
toArray() 配列に変換して返す

Stack

StackはFirst In Last Outのデータ構造である。Stackを利用するときは、dojo.collections.Stackをrequireする。

dojo.require("dojo.collections.Stack");

以下に利用例を示す。

var stack = new dojo.collections.Stack(["foo","bar","test","bull"]);
stack.push("new");
stack.pop();

StackのメソッドはQueueとほぼ同じメソッドが提供されている。Queueのdequeue(), enqueue(obj)が、Stackでは、pop()とpush(obj)の2つのメソッドに置き換わっている。

Store

Storeは連想配列としても配列としても利用できるデータ構造となっている。オブジェクトを削除すると、配列の添え字の番号が自動的に詰められる。 Storeを利用するときは、dojo.collections.ArrayListをrequireする。

dojo.require("dojo.collections.Store");

以下に例を示す。

var data=[
  {Id:"key1", val1:"testval", simpleNum:1.2, getName:function(){return "Bob Smith";}},
  {Id:"key2", val1:null, simpleNum:56, getName:function(){return "Jane";}},
  {Id:"key3", val1:"value", simpleNum:1, getName:function(){return "Bam bam";}, nested:{name:"value"}}
];
var store=new dojo.collections.Store(data);

Storeのメソッド一覧を示す

メソッド名概要
addData(obj, key) オブジェクトを追加する。keyが指定されないときは、オブジェクトのIdフィールドがkeyとして使われる
addDataRange(array) オブジェクト配列を追加する
clearData() Storeをクリアする
forEach(function) 登録されている全ての内部オブジェクトにfunctionを適用する
forEachData(function) 登録されている全てのオブジェクトにfunctionを適用する
get() 内部オブジェクト(keyとsrcフィールドを持つ)の配列を返す
getByIndex(index) 指定したindexの内部オブジェクトを返す
getByKey(key) 指定したkeyに対応する内部オブジェクトを返す。登録したオブジェクトを返すときはgetDataByKey(key)を用いる
getData() オブジェクトの配列を返す
getDataByIndex(index) 指定したindexのオブジェクトを返す
getDataByKey(key) keyに対応するオブジェクトを返す
removeData(obj) 指定したオブジェクトを削除する
removeDataByIndex(index) 指定したindexのkeyとオブジェクトを削除する
removeDataByKey(key) keyと対応するオブジェクトを削除する
setData(array) Storeをクリアした後、指定したオブジェクト配列を登録する
update(obj, fieldPath, val) 指定したオブジェクトのフィールド(fieldPath)の値をvalに変更する。fieldPathは文字列として[.]で区切って指定することができる

2007年4月 8日 (日)

グラフ/dojo.widget.Chart

dojo.widget.Chartを使ってグラフを描くこともできる。dojo.widget.Chartは、widgetとして提供されるため、JavaScriptを記述せずにHTMLだけでグラフを描くことができる。dojo.widget.Chartは、dojo.charting.Chartよりも低機能であり、縦向きのグラフ種類のみを提供する。

まず、グラフを描画する部分にdojoTypeとしてchartを指定したdiv要素を作る。

<div dojoType="chart" style="border:1px solid black;width:400px;height:250px;">

グラフの情報は、divの子要素にtableとして記述する。table要素では、軸の情報と、グラフの種類を指定する。

<table padding="12 12 20 30" axisAt="0 xmin" rangeX="0 100" rangeY="-100 100">
  • plotType: グラフの種類
  • axisAt: Y軸/X軸の位置
  • rangeX: X軸の値の範囲
  • rangeY: Y軸の値の範囲

axisAtでは、先にY軸の位置を指定し、半角スペース空けてX軸の位置を指定する。ymax, ymin, xmax, xminのように記述して、Y軸/X軸の最大値、最小値を軸に指定できる。

plotTypeは、line (なめらかな線グラフ), bar (棒グラフ), area (なめらかな面グラフ), scatter (散布図), bubble (バブルチャート)のいずれかを指定できる。thead/tr/thにおいてデータの系列ごとに個別にグラフの種類を指定することもできる。指定しないとデフォルトでlineが指定される。

thead/tr/thで、データ系列ごとにグラフ種類と色を指定できる。最初の列はX軸の値になるため、属性を指定しても無視される。2列目移行では、plotTypeとcolorを属性として指定できる。color属性でグラフの色を指定できる。

<thead>
  <tr>
    <th>X</th>
    <th plotType="area">Series A</th>
    <th plotType="area">Series B</th>
  </tr>
</thead>

tbody/tr/tdにグラフの値を指定する。bubbleのときは、tdのsize属性で点の大きさを指定できる。

<tbody>
<tr><td>0</td><td>-92.45</td><td>63.06</td></tr>
<tr><td>4</td><td>94.23</td><td>-100</td></tr>
<tr><td>8</td><td>-93.12</td><td>-33.54</td></tr>
...
</tbody>

なめらかな折れ線グラフ

<div dojoType="chart" style="border:1px solid black;width:400px;height:250px;background-color:#ededde;">
  <table padding="12 12 20 30" axisAt="ymin xmin" rangeX="0 50" rangeY="0 130">
    <thead>
      <tr>
        <th>X</th>
        <th plotType="line">Series A</th>
        <th plotType="line">Series B</th>
      </tr>
    </thead>
    <tbody>
      <tr><td>0</td><td>110</td><td>20</td></tr>
      <tr><td>10</td><td>24</td><td>4</td></tr>
      <tr><td>15</td><td>63</td><td>32</td></tr>
      <tr><td>25</td><td>5</td><td>13</td></tr>
      <tr><td>40</td><td>98</td><td>7</td></tr>
      <tr><td>45</td><td>54</td><td>18</td></tr>
    </tbody>
  </table>
</div>
                                                                                                   
XSeries ASeries B
0 110 20
10 24 4
15 63 32
25 5 13
40 98 7
45 54 18

動的にグラフの値を変えることもできる。以下のボタンを押すと系列が追加される。

function addSeries(){
  var test = dojo.widget.byId('test');
  var seriesC = new dojo.widget.Chart.DataSeries("SeriesB", "Third", "line", "red");
  seriesC.values=[
{x:0,value:20},
{x:10,value:50},
{x:15,value:32},
{x:25,value:13},
{x:40,value:7},
{x:45,value:18}
  ];
  test.series.push(seriesC);
  test.render();
}

2007年4月 6日 (金)

グラフ/dojo.charting.Chart

Dojoでは、グラフを描画する方法として、dojo.charting.Chartとdojo.widget.Chartの2つが提供されている。 dojo.charting.ChartはJavaScriptでグラフの描画方法を指定するのに対して、dojo.widget.Chartは主にHTMLのtable要素として指定する。

dojo.charting.Chartで指定する方法を説明する。

まず、以下の2つをrequireする。

dojo.require("dojo.collections.Store");
dojo.require("dojo.charting.Chart");

次にJSON形式のグラフデータをdojo.collections.Storeに読み込む。

var json = [
   { x: 0, y: 110, y2: 20},
   { x: 10, y: 24, y2: 4},
   { x: 15, y:63, y2: 32},
   { x: 25, y: 5, y2: 13},
   { x: 40, y: 98, y2: 7},
   { x: 45, y: 54, y2: 18}
];
var store = new dojo.collections.Store();
store.setData(json);

読み込んだデータを使って、データ系列を指定する。以下の例では、X軸とY軸の値のみを指定しているが、バブルチャートのときは、点の大きさを示すsizeも指定する。

var s1 = new dojo.charting.Series({
  dataSource:store,
  bindings:{ x:"x", y:"y"},
  label:"Line"
});
var s2 = new dojo.charting.Series({
  dataSource:store,
  bindings:{ x:"x", y:"y2"},
  label:"Line 2"
});

範囲やラベルなど、X軸/Y軸の情報を指定する。originには"max","min"または数値を指定でき、軸の位置を指定する。

//X軸の情報
var xA = new dojo.charting.Axis();
xA.range={upper:50, lower:0};
xA.origin="max";
xA.showTicks = true; //ラベルを指定した値の強調点のライン上に表示する
xA.label = "X-Axis";
xA.labels = [0, 20, 40];

//Y軸の情報
var yA = new dojo.charting.Axis();
yA.range={upper:130,lower:0};
yA.showLines = true; //ラベルを指定した値の点線を表示する
yA.showTicks = true; //ラベルを指定した値の強調点のライン上に表示する
yA.labels = [ {label:"min", value:0 }, { label:"35",value:35 }, { label:"max", value:120 } ];
yA.label = "Y-Axis"

グラフの種類を指定する。dojo.charting.Plotters.Lineと指定しているところで、グラフの種類を指定できる。

var p = new dojo.charting.Plot(xA, yA);
p.addSeries({ data:s1, plotter: dojo.charting.Plotters.Line });
p.addSeries({ data:s2, plotter: dojo.charting.Plotters.Line });
  • Line (折れ線グラフ)
  • CurvedLine (なめらかな線グラフ)
  • DataBar (棒グラフ)
  • Area (面グラフ)
  • CurvedArea (なめらかな面グラフ)
  • Scatter (散布図)
  • Bubble (バブルチャート)  [データとしてx, y, sizeを指定]

以下の積み重ねグラフでは、グルーピングが必要となる。

  • StackedArea (積み重ね面グラフ)
  • StackedCurvedArea (なめらかな積み重ね面グラフ)

グルーピングを指定するには、dojo.charting.PlotのrenderTypeとして、dojo.charting.RenderPlotSeries.Groupedを指定する。

var p = new dojo.charting.Plot(xA, yA);
p.renderType = dojo.charting.RenderPlotSeries.Grouped;
p.addSeries({ data:s1, plotter: dojo.charting.Plotters.Line });
p.addSeries({ data:s2, plotter: dojo.charting.Plotters.Line });

その他のグラフとして、以下を指定できる。

  • HorizontalBar [データとしてyを指定]
  • Gantt (ガントチャート) [データとしてhigh, lowを指定]
  • HighLow [データとしてx, high, lowを指定]
  • HighLowClose [データとしてx, high, low, closeを指定]
  • HighLowOpenClose [データとしてx, high, low, open, closeを指定]

グラフの描画領域を指定する。同じ描画領域に複数のグラフを指定することもできる。

var pa = new dojo.charting.PlotArea();
pa.size={width:400,height:250};
pa.padding={top:20, right:20, bottom:30, left:50 };
pa.plots.push(p);

系列に色を割り当てる。

s1.color = pa.nextColor();
s2.color = pa.nextColor();

グラフを描画する。

var chart = new dojo.charting.Chart(null, "Title", "Description");
chart.addPlotArea({ x:50,y:50, plotArea:pa });
chart.node = dojo.byId("chart");
chart.render();

グラフを描画した後も、dojo.collections.Storeの値を変更した後に、dojo.charting.Chartのrender()メソッドを呼ぶことで、グラフの値を変更できる。dojo.collections.Storeの値を変更するには、setData, addData, addDataRange, addDataByIndex, addDataRangeByIndex, removeData, removeDataRange, removeDataByKey, removeDataByIndexなどのメソッドが使える。

function changedata(){
  b0.removeDataByIndex(0);
  chart.render();
}

折れ線グラフ

なめらかな線グラフ

棒グラフ

バブルチャート

積み重ね面グラフ

ガントチャート

HighLowグラフ

HighLowOpenCloseグラフ

2007年4月 5日 (木)

Date/日時

DojoのDate/日時処理を用いるときは、dojo.date.formatをrequireする。

dojo.require("dojo.date.format");

日付 → 文字列

Dojoでは、JavaScriptのDateを文字列に変換する関数として、dojo.date.formatが提供されている。一つ目の引数にDateオブジェクト、2つ目の引数として変換方法を示したパラメータを渡す。

var sdate = dojo.date.format(new Date(), {selector:'dateOnly', locale:'ja-jp'});
=> 2007年4月5日木曜日
var sdate = dojo.date.format(new Date(), {selector:'dateOnly', formatLength:'short', locale:'ja-jp'});
=> 07/04/05

パラメータとして以下を指定できる。

  • selector: 'dateOnly' or 'timeOnly' or 'dateTime'のいずれかを指定する
  • locale: 'ja-jp', 'en-us', 'fr-fr, 'es', 'de-at', 'zh-cn'などのロケール。ハイフン「-」で繋ぐのに注意。指定しなければ、ブラウザのロケールが使われる
  • formatLength: 'full', 'short', 'long', 'medium'のいずれかを指定する
  • strict: trueまたはfalseを指定する
  • timePattern:'h:m:s'など、時間のフォーマットを指定する
  • datePattern:"ddMMyyyy"など、日付のフォーマットを指定する

timePattern、datePatternでは、以下を指定できる。

  • %a: 'Sun', '木', 短縮形の曜日
  • %A: 'Sunday', '木曜日', 曜日
  • %b: 'Jan', '4 月', 短縮形の月
  • %B: 'January', 4 月', 月
  • %c: 'Sunday, January 1, 2006 6:23:00 PM', '2007年4月5日木曜日 17時29分22秒GMT+09:00', 日時の文字列
  • %C: '20', 世紀
  • %d: '05', 日付
  • %D: '04/05/07', selector: 'dateOnly', formatLength: 'short'の日付文字列
  • %e: ' 5', 日付 (一桁のときに0を付けない)
  • %h: '4 月', 月 (%bと同じ)
  • %H: '17', 時
  • %I: '05', 時 (12時間表示)
  • %j: '095', その年から数えて何日目かを3桁で返す
  • %k: '17', 時
  • %l: ' 5', 時 (12時間表示)
  • %m: '04', 月
  • %M: '55', 分
  • %p: 'PM', '午後', AMかPMかを返す
  • %r: '06:23:00 PM', "%I:%M:%S %p"を返す
  • %R: '18:23', "%H:%M"を返す
  • %S: '00', 秒
  • %T: '18:23:00', "%H:%M:%S"を返す
  • %u: '7', 曜日を数字で返す
  • %U: '14' その年から数えて何週目かを返す
  • %w: '4', 日
  • %x: 'Sunday, January 1, 2006'
  • %X: '6:23:00 PM'
  • %y: '06', 年 (下2桁)
  • %Y: '2006', 年
  • %z: '+09:00', timezone
  • %%: '%', %のエスケープシーケンス指定

以下のように出力形式を指定することもできる。

dojo.date.strftime(new Date(), "%y/%m/%d");
dojo.date.format(new Date(), "%y/%m/%d");

文字列 → 日付

文字列から日付を得るには、dojo.date.parseを用いる。指定する文字列の形式は、dojo.date.formatで得られる文字列と同じである。

var date = dojo.date.parse("2006/8/11", {formatLength:'short', locale:'ja'});
var date = dojo.date.parse('2006/08/11", {formatLength:'medium', locale:'ja'});
var date = dojo.date.parse('2006/8/11", {formatLength:'medium', locale:'ja'});
var time = dojo.date.parse("12:30", {selector:'timeOnly', strict:true, timePattern:"h:mm"});

日時チェック

文字列で指定した日付または時間のフォーマットをチェックする関数が、dojo.validateに用意されている。日時チェックの関数を利用するときは、dojo.validate.datetimeをrequireする。

日付または時間のチェックをする関数は以下の4つが用意されている。

  • dojo.validate.isValidTime(value, flags)
  • dojo.validate.is12HourTime(value)
  • dojo.validate.is24HourTime(value)
  • dojo.validate.isValidDate(dateValue, format)

isValidTimeの引数flagsには、formatとしてフォーマット指定、amSymbol/pmSymbolとしてAM/PMのフォーマットを指定できる。amSympl/pmSymbolのデフォルト値は"AM"/"PM"である。

formatの指定には、以下のパターン文字を組み合わせて用いる。

  • h: 12時間指定
  • hh: 12時間指定, 1桁のとき0をつけて常に2桁指定
  • H: 24時間指定
  • HH: 24時間指定, 1桁のとき0をつけて常に2桁指定
  • m: 分
  • mm: 分, 1桁のとき0をつけて常に2桁指定
  • s: 秒
  • ss: 秒, 1桁のとき0をつけて常に2桁指定
  • t: 'AM' or 'PM'

is12HourTimeのフォーマットは、isValidaTimeのフォーマット指定で、format: ["h:mm:ss t", "h:mm t"]と同じとなる。is24HourTimeのフォーマットは、format: ["HH:mm:ss", "HH:mm"]と同じとなる。

以下に例を示す。この例は全てtrueになる例である。

dojo.require("dojo.validate.datetime");

dojo.validate.isValidTime('5:15:05 pm');
dojo.validate.isValidTime('5:15:05 p.m.', {pmSymbol: "P.M."});
dojo.validate.isValidTime('5:15 pm', {format: "h:mm t"});
dojo.validate.isValidTime('15:15:00', {format: "H:mm:ss"});

dojo.validate.is12HourTime('5:15:05 pm');
dojo.validate.is24HourTime('22:03:59');

isValidDateは日付のフォーマットをチェックする。引数のformatは、日付のフォーマットを以下のパターン文字を組み合わせて指定する。

  • YYYY: 年, 4桁指定
  • M: 月
  • MM: 月, 1桁のとき0をつけて常に2桁指定
  • D: 日
  • DD: 日, 1桁のとき0をつけて常に2桁指定
  • DDD: 001-365の日付
  • ww: 01-53の週
  • d: 1-7の曜日

以下に例を示す。この例は全てtrueになる例である。

dojo.validate.isValidDate("2005/08/06", "YYYY/MM/DD");
dojo.validate.isValidDate("2005-08-06", "YYYY-MM-DD");
dojo.validate.isValidDate("2005-W42-3", "YYYY-Www-d");
dojo.validate.isValidDate("2005-292", "YYYY-DDD");

Dojoを利用しているツール

Dojoをベースに使っているJavaScriptライブラリ

Dojoを利用しているフレームワーク

Dojoに対応した開発環境

Dojoを利用しているWebサイト

2007年4月 3日 (火)

Effect

効果を指定するときは、以下のように記述する。1つ目の引数としてID(配列として渡すことで複数指定できる)、2つ目の引数として効果を実行にかかる時間をミリタイムで指定する。play()メソッドを指定して実行する。play()メソッドの引数として実行時間をミリタイムで指定することもできる。

dojo.lfx.fadeOut("elem", 500).play();

以下にEffectの例を一覧で示す。

フェードイン/アウト、ワイプイン/アウト

  • dojo.lfx.fadeOut: フェードイン
  • dojo.lfx.fadeIn: フェードアウト
  • dojo.lfx.fadeShow: フェードイン、既に表示されているときは消してからフェードインする
  • dojo.lfx.fadeHide: フェードアウト、display:noneを適用する
  • dojo.lfx.wipeIn: ワイプイン
  • dojo.lfx.wipeOut: ワイプアウト
  • dojo.lfx.fadeWipeIn: フェードインしながらワイプイン
  • dojo.lfx.fadeWipeOut: フェードアウトしながらワイプアウト

フェードイン/ワイプインするオブジェクトは、display: none、またはopacity:0の状態から現れる。以下の4つの引数を取る。

  • nodes: 効果を指定するDOMノード (配列により複数指定できる)
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • callbackfunc (option): 効果が終わった後に呼び出す関数

なめらかな移動

  • dojo.lfx.html.slideBy: 全体位置を指定して移動
  • dojo.lfx.html.slideTo: 相対位置を指定して移動

以下の5つの引数を取る。

  • nodes: 効果を指定するDOMノード (配列により複数指定できる)
  • coords: 移動位置を指定する。{ top: Decimal, left: Decimal }
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • callbackfunc (option): 効果が終わった後に呼び出す関数

拡大/縮小表示

  • dojo.lfx.html.explode: 拡大表示
  • dojo.lfx.html.implode: 縮小表示

以下の5つの引数を取る。

  • start: スタート位置を示すDOMノード
  • endNode: 終了位置を示すDOMノード
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • callbackfunc (option): 効果が終わった後に呼び出す関数

ハイライト

  • dojo.lfx.html.highlight: ハイライト
  • dojo.lfx.html.unhighlight: アンハイライト

以下の4つの引数を取る。

  • startColor/endColor: 変化を始める/終わるときの色
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • callbackfunc (option): 効果が終わった後に呼び出す関数

縮尺

  • dojo.lfx.html.scale: 縮尺を変える

以下の7つの引数を取る。

  • nodes: 効果を指定するDOMノード (配列により複数指定できる)
  • percentage: 縮尺を変える割合をパーセンテージで指定する
  • scaleContent: trueのとき、コンテンツ内のフォントの縮尺も変える
  • fromCenter: trueのときは、右上ではなく中心から変化させる
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • callbackfunc (option): 効果が終わった後に呼び出す関数

アニメーション

  • dojo.lfx.html.propertyAnimation: 変化内容を指定してアニメーション

以下の5つの引数を取る。

  • nodes: 効果を指定するDOMノード (配列により複数指定できる)
  • propertyMap: 変更するプロパティの値を定義するオブジェクト {property: String start: Decimal, end: Decimal?, units: String} の配列
  • duration: 効果を実行する時間(ミリ秒)
  • easing (option): dojo.lfx.easeIn, dojo.lfx.easeOut, dojo.lfx.easeInOutのいずれかを指定する
  • handlers (option): 効果が終わった後に呼び出す関数(複数指定することもできる)

効果の組み合わせ

dojo.lfx.chainを使って、複数のEffectを連続して実行できる。
dojo.lfx.chain(
  dojo.lfx.fadeOut("3", 500),dojo.lfx.fadeIn("3", 500)
).play();
dojo.lfx.combineを使うと、複数のEffectを同時に実行できる。
dojo.lfx.combine(
  dojo.lfx.scale("16", 0, true, false, 1000),
  dojo.lfx.fadeOut("16", 1000)
).play(1000);

サンプルコード

//Fade Out
dojo.lfx.fadeOut("1", 1000).play();

//Fade In
dojo.lfx.fadeIn("2", 1000).play();

//Fade Out-In
dojo.lfx.chain(
  dojo.lfx.fadeOut("3", 500),dojo.lfx.fadeIn("3", 500)
).play();

//Fade Out-All
dojo.lfx.fadeOut(["1","2","3","4"], 1000).play();

//透明度50%
dojo.html.setOpacity(dojo.byId('5'), 0.5);

//200, 200へ
dojo.lfx.html.slideTo('6', { top: 200, left: 200 }, 1000).play();

//現在位置から50,50へ
dojo.lfx.html.slideBy('7', { top: 50, left: 50 } , 1000).play();

//Highlight
dojo.lfx.html.highlight("8", [230, 180, 180], 1000).play();

//Unhighlight
dojo.lfx.html.unhighlight("9", [230, 180, 180], 1000).play();

//Explode
dojo.lfx.explode(dojo.byId('button10'), "10", 1000).play();

//Implode
dojo.lfx.implode("10", dojo.byId('button11'), 1000).play();

//Wipeout
dojo.lfx.html.wipeOut('12', 1000).play();

//Wipein
dojo.lfx.html.wipeIn('13', 1000).play();

//Wipein-out
var wipeOut = dojo.lfx.wipeOut('14', null, null, function(n) {
  n.innerHTML = "innerHTMLを変更";
  dojo.lfx.wipeIn(n).play();
});
wipeOut.play();

//PropertyAnimation
var anim = dojo.lfx.propertyAnimation(
  ["15"],
  [
    { property: "height", end:1},
    { property: "opacity", end: 0} ,
    { property: "top", end: 0},
    { property: "left", end: 0},
    { property: "width", end: 0}
  ],
  1000,
  dojo.lfx.easeInOut
).play();

//Scale
dojo.lfx.scale("16", 30, true, true, 500).play(1000);

//Fade Wipeout
dojo.lfx.fadeWipeOut('17', 1000).play();

//Fade Wipein
dojo.lfx.fadeWipeIn('18', 1000).play();

//Fade Show
dojo.lfx.fadeShow('19', 1000).play();

//Fade Hide
dojo.lfx.fadeHide('20', 1000).play();

2007年3月31日 (土)

ドラッグ&ドロップ

Dojoのドラッグ&ドロップ機能を用いるときは、"dojo.dnd.*"をrequireする。

dojo.require("dojo.dnd.*");

利用するときは、ドラッグ&ドロップするHTML要素を指定する。HTMLとしての記述は特にない。 ドラッグ対象となるオブジェクト(HTML要素)をHtmlDragSourceとして設定する。 ドラッグしたオブジェクトをドロップする場所を、HtmlDropTargetとして設定する。

ドロップできる場所では、水平の線が現れる。ドラッグしたオブジェクトを、ドロップ対象ではない場所でドロップしたら、ドラッグしたオブジェクトは元の場所に戻る。

HtmlDragSource/HtmlDropTargetの引数として、1つ目にドラッグ対象となるオブジェクト、2つ目にドラッグ/ドロップ対象の範囲を示すコードを指定する。HtmlDragSourceではコードを文字列として1つ、HtmlDropTargetではコードを配列で複数指定できる。

以下の例では、aaa, bbb, cccをドラッグして、ddd, eeeにドロップできる。

     
  • aaa
  • bbb
  • ccc
    • ccc-1
    • ccc-2
  • ddd
  • eee
<html>
  <head>
    <title>Dojo Demos</title>
    <script type='text/javascript' src='dojo.js'></script>
    <script type='text/javascript'>
      dojo.require('dojo.dnd.*');
      
      function init() {
        new dojo.dnd.HtmlDropTarget(dojo.byId('ddd'), ['dest']);
        new dojo.dnd.HtmlDropTarget(dojo.byId('eee'), ['dest']);

        new dojo.dnd.HtmlDragSource(dojo.byId('aaa'), 'dest');      
        new dojo.dnd.HtmlDragSource(dojo.byId('bbb'), 'dest');
        new dojo.dnd.HtmlDragSource(dojo.byId('ccc'), 'dest');
      }

      dojo.addOnLoad(init);
    </script>
  </head>
  <body>
    <ul>
      <li id='aaa'>aaa</li>
      <li id='bbb'>bbb</li>
      <li id='ccc'>ccc
        <ul>
          <li>ccc-1</li>
          <li>ccc-2</li>
        </ul>
      </li>
    </ul>
    <ul>
      <li id='ddd'>ddd</li>
      <li id='eee'>eee</li>
    </ul>
  </body>
</html>

HtmlDragMoveSourceを使うと、ドラッグ&ドロップではなく、指定したHTML要素を自由に動かすことができる。 HtmlDragMoveSourceを使うときは、dojo.dnd.HtmlDragMoveをrequireする。コンストラクタの引数にはHTML要素のみを指定する。

以下のfffは自由に動かすことが出来る。

 

  • fff
dojo.require('dojo.dnd.HtmlDragMove');

function init() {
new dojo.dnd.HtmlDragMoveSource(dojo.byId('fff'));
}
dojo.addOnLoad(init);

setDragHandleでドラッグできる場所を指定できる。disableSelectionでは、ドラッグできない場所を指定できる。

var drag = new dojo.dnd.HtmlDragSource(dojo.byId('outer1'));
drag.setDragHandle(dojo.byId('inner1'));

dojo.html.disableSelection(dojo.byId('inner1'));

イベント

ドラッグ&ドロップのイベントを取得する方法として、既存のクラス(dojo.dnd.HtmlDropTargetなど)を継承したクラスを利用する方法と、dojo.event.connectを使う方法とがある。

ドロップ対象において発生するイベントには以下がある。

  • onDrop(e) ドラッグ対象をドロップしたとき
  • onDragOver(e) ドロップ対象の上に、ドラッグ対象が入ったとき
  • onDragOut(e) ドロップ対象の上から、ドラッグ対象が出たとき
  • onDragMove(e) ドラッグ対象の上で、ドラッグ対象を動かしたとき (うまく動きませんできた)
  • onDropStart(e) ドラッグが始まったとき。ドロップ対象の検証をするときに使える
  • onDropEnd(e) ドラッグが終わったとき

各イベントでは、引数としてdojo.dnd.DragEventオブジェクトを受け取る。DragEventオブジェクトは以下のプロパティを持つ。

  • dragObjects: ドラッグしたオブジェクト
  • dragSource: ドラッグ対象のオブジェクト。dragSource.dragObjectはdragObjectと同じ。ドロップ先の情報もパラメータとして持つ。
  • target: ドロップ対象のオブジェクト。まだドロップしてなければnullが返る。

ドラッグ対象のイベントには以下がある。

  • onSelected(e) ドラッグ対象がクリックされたとき
  • onDragStart(e) ドラッグを始めたとき
  • onDragEnd(e) ドラッグが終わったとき。ドロップ対象のイベントonDropの前に呼ばれる。

以下の例では、ドロップ対象の上にドラッグ対象が重なったら、ドロップ対象の色を赤色に変えるようにしている。

  • ggg
  • hhh
  • iii
    • iii-1
    • iii-2
  • jjj
  • kkk
<html>
<head>
  <title>Dojo Demos</title>
  <script type="text/javascript">
    var djConfig = { isDebug: true };
  </script>
  <script type="text/javascript" src="dojo.js"></script>
  <script type="text/javascript">
    dojo.require("dojo.dnd.*");
      
    function init() {
      dojo.declare("dojo.dnd.DestDropTarget",dojo.dnd.HtmlDropTarget,{
        onDragOver: function(e) {
          dojo.debug('dragOver');
          this.domNode.style.color = "red";
          return dojo.dnd.HtmlDropTarget.prototype.onDragOver.apply(this, arguments);
        },
        onDragOut: function(e) {
          dojo.debug('dragOut');
          this.domNode.style.color = "black";
          return dojo.dnd.HtmlDropTarget.prototype.onDragOut.apply(this, arguments);
        }
      });
      
      new dojo.dnd.DestDropTarget(dojo.byId("ddd"), ["dest"]);
      new dojo.dnd.DestDropTarget(dojo.byId("eee"), ["dest"]);

      new dojo.dnd.HtmlDragSource(dojo.byId("aaa"), "dest");      
      new dojo.dnd.HtmlDragSource(dojo.byId("bbb"), "dest");
      new dojo.dnd.HtmlDragSource(dojo.byId("ccc"), "dest");
    }

    dojo.addOnLoad(init);
  </script>
</head>

<body>
  <ul>
    <li id="aaa">aaa</li>
    <li id="bbb">bbb</li>
    <li id="ccc">ccc
      <ul>
        <li>ccc-1</li>
        <li>ccc-2</li>
      </ul>
    </li>
  </ul>
  <ul>
    <li id="ddd">ddd</li>
    <li id="eee">eee</li>
  </ul>

 </body>
</html>

以下の例では、xxx, yyy, zzzをドラッグして、入力フォームに値を設定できる。  

  • xxx
  • yyy
  • zzz

<html>
<head>
  <title>Dojo Demos</title>
  <script type="text/javascript" src="dojo.js"></script>
  <script type="text/javascript">
    dojo.require("dojo.dnd.*");
    
    function init4() {
      dojo.declare("dojo.dnd.DestDropTarget",dojo.dnd.HtmlDropTarget,{
        onDragOver: function(e) {
          dojo.byId('text').value = e.dragObjects[0].domNode.innerHTML;
        }
      });
      
      new dojo.dnd.DestDropTarget(dojo.byId("text"), ["dest"]);

      new dojo.dnd.HtmlDragSource(dojo.byId("xxx"), "dest");      
      new dojo.dnd.HtmlDragSource(dojo.byId("yyy"), "dest");
      new dojo.dnd.HtmlDragSource(dojo.byId("zzz"), "dest");
    }

    dojo.addOnLoad(init4);
  </script>
</head>

<body>
<ul>
<li id="xxx">xxx</li>
<li id="yyy">yyy</li>
<li id="zzz">zzz</li>
</ul>

<input id="text" type="text">

</body>
</html>

2007年3月28日 (水)

スタイル

スタイル情報の取得および設定をするときは、dojo.html.layoutをrequireする。

dojo.require("dojo.html.layout");

サイズ

HTML要素のオブジェクトまたはHTML要素のIDを文字列と指定して、 以下の3つのサイズを得ることができる。 dojoのwidgetオブジェクトを渡しても結果はNaNが返る。

     
  • content: コンテンツ自身のサイズ
    • dojo.html.getContentWidth(obj)/ dojo.html.getContentHeight(obj)
  • inner: content + padding + borderのサイズ
    • dojo.html.getOuterWidth(obj) / dojo.html.getOuterHeight(obj)
  • outer: content + padding + border + marginのサイズ
    • dojo.html.getInnerWidth(obj) / dojo.html.getInnerHeight(obj)

以下のように幅と高さを持つオブジェクト一緒に返すこともできる。

var c= dojo.html.getMarginBox(obj)/getBorderBox(obj)/getContentBox(obj);
c.width;
c.height;

サイズを取得するだけでなく、サイズを設定することもできる。

dojo.html.setMarginBox(obj, { width: 110, height: 60 });

位置情報

dojo.html.getAbsolutePosition(obj, boolean)により、指定したHTML要素の絶対位置を得られる。2つ目の引数では、trueを指定するとbody要素内における絶対位置を返す。falseを指定するとウィンドウ枠内の表示位置における絶対位置を返す。

trueのときは、body要素内の絶対位置であるため、ウィンドウのスクロールバーの位置に関係なく同じ値となる。falseのときは、ウィンドウのスクロールバーの位置によって、表示されるHTML要素の位置が変わる。

var pns = dojo.html.getAbsolutePosition(obj, false);
var pws = dojo.html.getAbsolutePosition(obj, true);
pns.x; // X座標
pns.y; // Y座標

dojo.html.getScrollLeft()/Top()により、ウィンドウのスクロールバーのスクロール位置を返す。 dojo.html.getScroll()を使ったときは、

var scroll = dojo.html.getScroll();
scroll.left;
scroll.top;

表示のON/OFF

指定したHTML要素の表示をON/OFFと切り替える。setShowing/show/hide/setDisplayを用いたときは、CSSのdisplayプロパティでnoneを指定するかしないかを切り替える。setVisibilityを用いたときは、CSSのvisibilityプロパティをvisible/hiddenに切り替える。

displayプロパティでnoneを指定すると、HTML要素自体がなくなる。一方、visibilityをvisible/hiddenに切り替えたときは、表示しないだけで、指定したHTML要素はなくならない。そのため、visibilityを切り替えてもページ全体のレイアウトは変わらない。

表示をONにする。

dojo.html.setShowing(obj, true);
dojo.html.show(obj);
dojo.html.setDisplay(obj, true);
dojo.html.setVisibility(obj, true);
dojo.html.setVisibility(obj, '');

表示をOFF/非表示にする。

dojo.html.setShowing(obj, false);
dojo.html.hide(obj);
dojo.html.setDisplay(obj, false);
dojo.html.setVisibility(obj, false);
dojo.html.setVisibility(obj, 'hidden');

表示されているかどうかをチェックする。isShowingとisDisplayedのときは、displayプロパティがnoneかどかをチェックする。ただし、visibility: visibleのときは、display:visibleでもtrueとなる。isVisibleは、visibilityがvisibleかhiddenかをチェックする。このときは、display:noneでもvisibility: visibleのときはtrueになる

dojo.html.isShowing(obj); 
dojo.html.isDisplayed(obj);
dojo.html.isVisible(obj);

以下のtoggleXXXでは、表示されているときは非表示、表示されていないときは表示に切り替える。

dojo.html.toggleShowing(obj);
dojo.html.toggleDisplay(obj);
dojo.html.toggleVisibility(obj);

CSSの追加

insertCssTextを用いてCSSを追加できる。
dojo.html.insertCssText("table{ background-color: red;}");
insertCssFileを使うことで、リンクするCSSファイルを追加することもできる。
dojo.html.insertCssFile("./css/test.css");

2007年3月25日 (日)

ローカルディスクへのデータ保存

dojo.storageを使うことでクライアント側にデータを保存して利用することができる。一般的に、ブラウザ側の保存領域として使うことができるCookieでは数kbyteまでしか保存できないが、dojo.storageではクライアントPCのディスク容量の限りデータを保存できる。

クライアントにデータを保存することで、サーバとのやりとりを減らすことができ、作業の中断をいつでもできるようになる。また、Webベースで提供されているOfficeアプリケーションをオフラインでも動作させることができるようになる。

dojo.storageでは、データの保存とアクセスは、単純なHashテーブルとしてアクセスできる。

dojo.storageを利用するときは、dojo.storage.*とdojo.event.*をrequireする。

dojo.require("dojo.event.*");
dojo.require("dojo.storage.*");

dojo.storageの処理は、dojo.storageがinitializeされてから、実行するようにする。以下の例では、TestStorageオブジェクトのinitializeメソッドにおいてdojo.storageにアクセスして初期化処理(データの取得)をしている。

if(dojo.storage.manager.isInitialized() == false){
dojo.event.connect(dojo.storage.manager, "loaded", TestStorage,
                  TestStorage.initialize);
}else{
dojo.event.connect(dojo, "loaded", TestStorage, TestStorage.initialize);
}

データを取り出すときは、dojo.storage.get(key)を用いる。

var results = dojo.storage.get(key);

データを保存するときは、dojo.storage.put(key, value, saveHandler)を用いる。

try{
  dojo.storage.put(key, value, saveHandler);
}catch(exp){
  alert(exp);
}

valueは、文字列だけでなく、JavaScriptのオブジェクトを指定できる。ローカルファイルに保存するときには、内部でJSON形式の文字列に変換している。

saveHandlerには、保存した後のコールバック関数を指定する。saveHandlerは保存が失敗したかどうかを受け取る。2つの引数を取り、1つ目はstatusで以下の3つの値のどれかとなる。

  • dojo.storage.SUCCESS - 保存に成功
  • dojo.storage.FAILED - ユーザが保存を拒否した
  • dojo.storage.PENDING - ユーザは保存の可否を指定するUIプロンプトを表示している

2つ目の引数は、保存されたkeyNameである。保存は非同期なので、どのkeyが保存されたのかをコールバックで知りたいときもある。以下に、saveHandlerの例を示す。

var saveHandler = function(status, keyName){
  if(status == dojo.storage.PENDING){
     // ... 
  }else if(status == dojo.storage.FAILED){
     // ...
  }else if(status == dojo.storage.SUCCESS){
     // ...
  }
}

dojo.storage.getKeys()を使うと利用できるキーの一覧を取得できる。

var availableKeys = dojo.storage.getKeys();

dojo.storageにより保存された情報は、Cookieと同じく保存時と同じドメインにおいてのみアクセスできる。他のドメインからはアクセスできない。

以下の例は、ボタンを押すと入力フォームの値をローカルファイルに保存する。ブラウザを開いたら、過去に保存した値を入力フォームに戻している。

<html>
  <head>
    <title>Dojo Demos</title>
    <script type="text/javascript" src="dojo.js"></script>
    <script type="text/javascript">
dojo.require("dojo.event.*");
dojo.require("dojo.storage.*");
dojo.require("dojo.widget.Button");

function buttonPressed(event){
  try{
    dojo.storage.put('inputtext', dojo.byId('inputtext').value, saveHandler);
  }catch(exp){
    alert(exp);
  }
}

var saveHandler = function(status, keyName){
  if(status == dojo.storage.PENDING){
     // ...
  }else if(status == dojo.storage.FAILED){
     // ...
  }else if(status == dojo.storage.SUCCESS){
     // ...
  }
}
      
var TestStorage = {
  initialize: function(){
    if(dojo.storage.get('inputtext')){
      dojo.byId('inputtext').value = dojo.storage.get('inputtext');
    }
  }
}
      
function init(){
  var saveButton = dojo.widget.byId('saveButton');
  dojo.event.connect(saveButton, 'onClick', 'buttonPressed');
      
  if(dojo.storage.manager.isInitialized() == false){
    dojo.event.connect(dojo.storage.manager, "loaded", TestStorage,
                    TestStorage.initialize);
  }else{
    dojo.event.connect(dojo, "loaded", TestStorage, TestStorage.initialize);
  }
}

dojo.addOnLoad(init);
    </script>
  </head>
 
  <body>
    <input type="text" id="inputtext" />
    <button dojoType="Button" widgetId="saveButton">Press Me</button>
  </body>
</html>

2007年3月24日 (土)

配列

dojo.langに含まれる配列に関する関数を説明する。

dojo.lang.isArray()は、配列かどうかをチェックする。空の配列も、trueとなる。

dojo.lang.isEmpty()で、配列を引数に渡すと、配列が空かをチェックする。空の配列は、isEmpty()ではtrueとなる。

dojo.lang.find()は、配列の中に指定したオブジェクトが何番目含まれるかを返す。以下の例では2を返す。

var foo = new Array(128, 256, 512);
dojo.lang.find(foo, 512);

dojo.lang.forEach()を使うことで、配列の全ての要素に同じ関数を適用できる。

var colors = ["red", "white", "blue"];
dojo.lang.forEach(colors, alert);

dojo.lang.map()では、配列の全ての要素に同じ関数を適用して、その結果を配列で受け取ることができる。以下の例では、2乗した値の配列 [1,4,9,16,25]を返す。

var integers = [1,2,3,4,5];
var squares = dojo.lang.map(integers, function(x){ return x*x; });

dojo.lang.every()は、配列の全ての要素に対して、指定した関数を適用した結果が全てtrueになるかどうかを返す。1つでもfalseがあったときはfalseを返す。以下の例はtrueを返す。

var integers = [1,2,3,4,5];
var result = dojo.lang.every(integers, function(x){ if (x <10) return true; return false;});

dojo.lang.some()は、配列の要素に対して指定した関数を適用して、1つでもtrueになればtrueを返す。全てfalseのときはfalseを返す。以下の例をtrueを返す。

var integers = [1,2,3,4,5];
var result = dojo.lang.some(integers, function(x){ if (x == 3) return true; return false;});

配列の比較

dojo.collections.Setには、2つの配列を比較するメソッドが提供される。

メソッド名概要
difference(arrayA, arrayB) 引数として指定した2つの配列が全て同じかどうか
intersection(arrayA, arrayB) arrayAの全ての要素がarrayBに含まれないかどうか
isSubSet(arrayA, arrayB) arrayBがarrayAの部分集合がどうか
isSuperSet(arrayA, arrayB) arrayBがarrayAを含んでいるかどうか
union(arrayA, arrayB) arrayAとarrayBを結合した配列を返す

JavaScriptの配列

参考に、JavaScriptの配列が元々持つメソッドを以下に示す。

メソッド名概要
concat(ary2) aryとary2を連結した配列を返す。引数の配列は複数指定することもできる
join('str') 引数の文字列で配列の各要素を繋げた文字列を返す。引数を省略したときはカンマ(,)で連携する
length 配列の要素数を返す
pop() 配列の最後の要素を取り除く
push(e1) 配列の最後に引数の要素を追加する。引数の要素を複数指定することもできる
reverse 逆順に並び替えた配列を返す
shift() 配列の最初の要素を削除して、その要素を返す
splice(start, end) start~endまでの要素を抜き出した配列を返す。引数のendは省略できる
sort ソートした配列を返す
toString() 文字列に変換した結果を返す
unshift(e1) 配列の最初に引数の要素を追加する。引数の要素を複数指定することもできる

ブラウザのバックボタン/履歴への対応

バック/フォワードボタンへの対応

Ajaxによりデータを取得して画面の一部を書き換えた場合、ブラウザのバックボタンを押しても画面の一部の書き換えを元に戻すことはできない。間違ってバックボタンを押すと、これまでの操作内容は失われてしまう。

画面の一部を書き換えただけでは、ブラウザの履歴(history)、URLを更新しないためである。

dojo.undo.browser を使うことで、Ajaxアプリケーションにおいてもブラウザのバック/フォワードボタンを利用することができるようになる。dojo.undo.browserでは、バック/フォワードボタンの通知を受けて動作するオブジェクト/関数を指定することで、ブラウザのバック/フォワードボタンに対応できるようになる。

dojo.undo.browserを利用するには、まず、djConfigで、preventBackButtonFix: falseを指定する。これにより隠れたiframeが追加される。

次に、dojo.require("dojo.undo.browser"); を指定し、dojo.undo.browser.setInitialState(state)により初期状態を設定する。以降は、ブラウザの履歴に追加するタイミングで、dojo.undo.browser.addToHistory(state)を呼び出す。ここで、stateオブジェクトには、バック/フォワードボタンが押されたときに呼ばれるメソッドを指定する。

バックボタンの通知を受けるには、stateオブジェクトに、back(), backButton(), handle(type)のいずれかのメソッドを定義する。typeには、"forward"または"back"が指定される。

フォワードボタンの通知を受けるには、forward(), forwardButton() or handle(type)のメソッドいずれかを定義する。

簡単なstateオブジェクトの例をあげる。

var state = {
back: function() { alert("Back was clicked!"); },
forward: function() { alert("Forward was clicked!"); }
};

dojo.io.bindを使って、画面を書き換えているのであれば、dojo.io.bindを呼び出すタイミングで、その情報をstateオブジェクトに入れることで、バックボタンが押されたときに、状態を元に戻すような動作を行うことが可能になる。

URL

dojo.io.bindを使うことで、ブラウザのロケーションバーのURLを変えることもできる。URLを指定するには、stateオブジェクトのchangeUrlプロパティを使う。

changeUrlプロパティの値としてstringを指定したときは、Urlの最後に#の後に続けて、指定した値が入る。 changeUrlプロパティの値としてtrueを指定すると、dojoが自動的にユニークな値を設定する。

ブラウザの状態を示す情報をURLに指定して、URLが指定されたら状態を復元ようにすることで、ユーザはブックマークに状態を追加したり、他の人にブラウザの状態を伝えることができるようになる。

同じ値をchangeUrlに続けて含むstateオブジェクトを渡したときは、ブラウザの履歴には1つのstateオブジェクトだけが残る。

addToHistory()を呼び出すときにchangeUrlを使うときは、必ずchangeUrlを使うようにしなければならない。changeUrlを使わないaddToHistory()呼び出しが含まれていると正しく動作しない。

サンプルコード

<html>
  <head>
    <title>Dojo Demos</title>
    <script type="text/javascript">
      var djConfig = { isDebug: true, preventBackButtonFix: false };
    </script>
   
    <script type="text/javascript" src="dojo.js"></script>
    <script type="text/javascript">
dojo.require("dojo.lang.declare");
dojo.require("dojo.undo.browser");

function buttonPressed(){
  dojo.byId('message').innerHTML = 'buttonPressedが押されました。';
  dojo.undo.browser.addToHistory(new State('button 1'));
}

function buttonPressed2(){
  dojo.byId('message').innerHTML = 'buttonPressed2が押されました。';
  dojo.undo.browser.addToHistory(new State('button 2'));
}      

function init(){
  dojo.declare("State", null, {
    initializer: function(name){
      this.name=name;
    },
    back: function() {
        dojo.debug("Back was clicked in "+this.name);
    },
    forward: function() {
        dojo.debug("Forward was clicked in "+this.name);
    }
  });
      
  dojo.undo.browser.setInitialState(new State("initial"));

  var historyButton = dojo.byId('historyButton');
  var historyButton2 = dojo.byId('historyButton2');
  dojo.event.connect(historyButton, 'onclick', 'buttonPressed');
  dojo.event.connect(historyButton2, 'onclick', 'buttonPressed2');
}

dojo.addOnLoad(init);
    </script>
  </head>
 
  <body>
    <button id="historyButton">Press Me 1</button>
    <button id="historyButton2">Press Me 2</button>
    <div id="message"></div>
  </body>
</html>

2007年3月21日 (水)

publish/subscribe

異なるメソッド間で連携する手段として、publish/subscribeメソッドが用意されている。publish/subscribeを用いた場合、共通のtopic名を指定することで、直接やり取りする相手を明示せずに呼び出すことができる。 topic名を指定してpublishを実行すると、同じtopic名を指定して実行しているsubscribeメソッドが呼ばれる。同じtopic名に対してsubscribeされる先は複数設定できる。

subscribeを実行するときは、topic名以外に、同じtopic名でpublishが実行されたときに実行されるオブジェクトとそのメソッド名を指定する。 publishを実行するときは、topic名と、subscribeで指定したオブジェクトのメソッドが実行されるときに渡す値を指定する。

var foo = new function() {
    this.init = function() {
        dojo.event.topic.subscribe("/mytopic", this, processMessages);
    }

    function processMessages(message) {
        alert("Message: " + message.content);
   }
}

var bar = new function() {
    this.showMessage = function(message) {
        dojo.event.topic.publish("/mytopic", {content: message});
    }
}

foo.init();
bar.showMessage("Hello Dojo Master");

同じオブジェクト内の

上記の例では、topic名として "/mytopic"を指定して、publish/subscribeが実行されている。 foo.init()によりsubscribeがまず実行された後、bar.showMessageによりpublishが実行され、subscribeの実行時に指定したオブジェクトのメソッドが呼ばれる。

publishを実行したとき、contentプロパティの値としてshowMessageが呼ばれたときの引数を指定している。 subscribeで指定したprocessMessagesメソッドでは、引数オブジェクトのcontentプロパティとして値を受け取っている。

HTML要素の取得

WidgetId

DojoのWidgetオブジェクトを取得するには、dojo.widget.byId()を使う。 例えば、以下のようにwidgetIdとして'foo'を指定したときは、

<div widgetid="foo" dojotype="datepicker"> 

'foo'を引数に指定してDojo Widgetオブジェクトを取得できる。

var foo = dojo.widget.byId('foo');

Id

通常のHTML Elementを取得するAPIは、dojo.byId()として用意されている。

<input type="button" value="ボタン" id="bar" />

上記のボタンのElementは、以下のように取得できる。

var bar = dojo.byId('bar');

取得するHTML Elementの範囲を指定するときは、dojo.byId(doc, 'bar')のように、第一引数で範囲を指定するHTML Elementを指定する。

DojoのWidgetは、表示されたときのHTML要素と異なる場合があるためdojo.widget.byIdを用いてwidgetidを指定して取得する必要がある。dojo.byIdとは動作が異なるので注意が必要。

クラス名

dojo.html.getElementsByClassName()を用いて、クラス名を指定してHTML要素を取得することもできる。

 

<div class="sample">1</div>
<div class="sample">2</div>

以下の例で、上記の2つのdiv要素を取得できる。

dojo.require("dojo.html.style");

dojo.html.getElementsByClassName('sample')

2007年3月16日 (金)

関数の呼び出しイベント

dojo.event.connect("after", exampleObj, "foo", exampleObj, "bar");

のように記述することで、exampleObj.foo()が呼ばれると、続けてexampleObj.bar()を呼び出すようになる。"after"ではなく "before"と書くと、exampleObj.foo()を呼びだすと、foo()が実行される前にexampleObj.bar()が実行されてから、foo()が実行される

Dojoの関数に対して処理を追加したいときなど、既存のコードに処理を追加するときなどに使える。

var o = new Object();
o.init = function (){alert('a');};
o.next = function (){alert('b');};

dojo.event.connect("before", o, "init", o, "next");

この例では、initを呼びだすと、initが実行される前にnextが実行されてから、initが実行される。

最初の引数 "before" または  "after"が省略されると、"after"として処理される。

以下のようにobjectの指定なしで、記述することもできる。この場合は、func1を呼び出すと、その後にfunc2が呼ばれる。

dojo.event.connect("func1", "func2");

引数

引数を指定して関数を呼び出したときは、両方の関数に同じ引数が渡される。

after, beforeではなく、aroundを指定することで、関数が呼ばれる前に引数をいじることができる。以下の例では、helloPressed('a','b')と呼び出されいるが、argSwapAroundAdviceで、1つ目と2つ目の引数の順番を入れ替えて、3つ目の引数として'c'を追加している。

function helloPressed(message, message2, message3){
  dojo.debug('Hello World! '+message+', '+message2+', '+message3);
}

function argSwapAroundAdvice(miObj){
  var tmp = miObj.args[1];
  miObj.args[1] = miObj.args[0];
  miObj.args[0] = tmp;
  miObj.args[2] = 'c';
  ret = miObj.proceed();
  return ret;
}

function init(){
  helloPressed('a', 'b');
}
dojo.event.connect('around', 'helloPressed', 'argSwapAroundAdvice');
dojo.addOnLoad(init);

aroundにより、helloPressedが呼び出される前に、argSwapAroundAdviceが呼ばれる。argSwapAroundAdviceは、引数として、helloPressedを呼び出したときの引数をargs配列として受け取る。このargsを変更して、最後にproceed()を呼び出して、returnする。

2007年3月14日 (水)

クラス/オブジェクト

クラスの作成

クラスを作成するに、dojo.declare()を用いることができる。dojo.declare()を用いるときは、事前にdojo.require('dojo.lang.declare')を宣言しておく。

dojo.declare("ClassName",null, {
  //class body
});

ClassNameには、my.class.ClassNameのように「.」を含めて、パッケージ名のように指定できる。

以下の例では、initializerとmoveToNewCityメソッドを含むPersonクラスを定義している。initializerメソッドがコンストラクタとなる。

dojo.declare("Person", null, {
    //acts like a java constructor
    initializer: function(name, age, currentResidence){
      this.name=name;
      this.age=age;
      this.currentResidence=currentResidence;
    },
    moveToNewCity: function(newState) {
      this.currentResidence=newState;
    }
});

このクラス定義を用いて、インスタンス化するには、以下のようにinitializerメソッドの引数を指定する。initializerメソッドは、オブジェクトが作られたときに一度だけ呼ばれる。

var matt= new Person('Matt', 25, 'New Mexico');

dojo.declare()において、2つ目の引数で、継承するクラスを指定することができる。以下の例では、Personクラスを継承してEmployeeクラスを宣言している。

dojo.declare('Employee', Person, {
    //acts like a constructor
    initializer:function(name, age, currentResidence, position){
      Employee.superclass.initializer(name, age, currentResidence);
      this.password=';
      this.position=position;
    },

    login: function(){
      if(this.password!='' && this.password!=null){
        alert('you have successfully loged in with the password '+this.password);
      }else{
        alert('please ask the administrator for your password');
      }
    }
});

Employee.superclass.initializerにより、Personクラスのinitializerを呼んでいる。

親クラスをのプロパティを参照するときは、superclassを指定する。配列やオブジェクトをプロパティとして用いるときは、initializerで宣言することが必要となる。プロパティの値として直接宣言することはできない。

オブジェクトに関連したメソッド

オブジェクトのメソッド呼び出しに関する関数dojo.lang.hitch()は引数により2種類の使い方がある。

1つ目の引数としてオブジェクト、2つ目の引数としてメソッド名を文字列で指定すると、指定したオブジェクトのメソッドのfunctionを返す。例えば、var func = dojo.lang.hitch(foo, "bar")を実行するとfoo.bar()を返す。

dojo.declare('my.classes.foo', null, {
initializer: function(arg) {
this.id = 'foo';
},
getId: function() {
return "I am a foo";
},
method: function() {
return "A method in foo";
}
});

var obj = new my.classes.foo();
var func = dojo.lang.hitch(obj, 'getId');
func();
--> "I am a foo"

dojo.lang.hitch()に対して、1つ目の引数としてscope、2つ目の引数としてfunctionを指定することで、scopeを指定してfunctionを実行できる。

dojo.lang.hitch(this, func); 

dojo.lang.has()は、連想配列/オブジェクトの添え字/プロパティの名前の中に指定した名前が含まれるかどうかを返す。以下の例ではtrueを返す。

dojo.lang.has( { a: "A", b: "B" }, "b" );

2007年3月13日 (火)

イベント割り当て

Fromなどのオブジェクトにイベント時の動作を割り当てることができる。例えば、以下のDojo widgetに対して、onClickを割り当てるときは、

<button dojoType="Button" widgetId="helloButton">Press Me</button>

以下のように、dojo.event.connectを用いる。1つ目の引数としてオブジェクト、2つ目にイベント、3つ目が割り当てる関数を指定する。これより、ボタンが押されたら、helloPressedが呼び出される。

function helloPressed(){
  dojo.debug('Hello World!');
}
var helloButton = dojo.widget.byId('helloButton');
dojo.event.connect(helloButton, 'onClick', 'helloPressed');

Dojoのwidgetだけでなく、通常のFormオブジェクトに対しても割り当てることができる。例えば、以下のボタンに対して、

<input type="button" id="testbutton" value="ボタン">

以下のように同じdojo.event.connectを用いてイベントを割り当てられる。なぜか、Dojo 0.4.1では、'onclick'のようにcがこのときは小文字となるので注意すること。

var testButton = dojo.byId("testbutton");
dojo.event.connect(testButton, 'onclick', 'helloPressed');

o.helloPressed()のように、オブジェクトのメソッドを呼び出したいときは、3つ目の引数でオブジェクト、4つ目の引数でメソッド名を指定する。

var testButton = dojo.byId("testbutton");
dojo.event.connect(testButton, 'onclick', o, 'helloPressed');
呼び出される関数は、引数としてイベントオブジェクトを取得することもできる。
function helloPressed(event){
  dojo.debug(event.pageY);
}

var helloButton = dojo.widget.byId('helloButton');
dojo.event.connect(helloButton, 'onClick', 'helloPressed');

dojo.event.connet()は、HTMLの読み込みが完了してから実行されるように、HTMLのbodyのonload属性で呼び出した関数内に記述するのがよいようです。Dojoでは、dojo.addOnLoad()でonloadで呼ばれる関数を指定することもできる。

ここでは、1つのオブジェクトに1つのイベントだけを割り当てているが、1つのオブジェクトに対してdojo.event.connect()を複数記述して、複数のイベントを割り当てることも出来る。このとき、dojo.event.connect()で指定した順番に呼ばれる。

dojo.event.disconnect()により、割り当てたイベントを削除することもできる。dojo.event.disconnect()の引数はdojo.event.connect()と同じものを指定する。

Dojoインストール

Dojoは http://dojotoolkit.org/ からダウンロードできます。dojo-xxx-ajax.zip をダウンロードして解凍したら、dojo.js, iframe_history.html, srcディレクトリを、Dojoを利用する場所にまとめて置きます。

Dojoのコードは以下の順番で記述します。dojo.jsのロードのみが必須で、その他は必要に応じてこの順番で記述します。HTMLのロードが終わってからでなければ、dojo.widget.byId("helloButton")などのHTMLオブジェクトを参照できないので、この順番を守ることが重要となります。

  1. djCofigの設定
  2. dojo.jsのロード
  3. dojo.requireの実行
  4. 初期化関数の定義
  5. addOnLoadによる初期化関数の呼び出し

以下に簡単な例を示します。

<html>
<head>
   <script type='text/javascript'>
    var djConfig = { isDebug: true };
   </script>

   <script src='dojo.js' type='text/javascript'>

   <script type="text/javascript">
            dojo.require("dojo.widget.Button");

            function helloPressed(){
              dojo.debug('Hello World!');
            }

            function init(){
              var helloButton = dojo.widget.byId('helloButton');
              dojo.event.connect(helloButton, 'onClick', 'helloPressed');
            }

            dojo.addOnLoad(init);
        </script>
</head>
<body>
  <button dojotype="Button" widgetid="helloButton">Press Me</button>
</body>
</html>

1. djCofigの設定

最初にdjConfigによりDojoの設定をします。djConfigで設定できる値を以下に示します。「:」の後は、デフォルト値です。

  • isDebug: false
  • allowQueryConfig: false
  • baseScriptUri: ""
  • baseRelativePath: ""
  • libraryScriptUri: ""
  • iePreventClobber: false
  • ieClobberMinimal: true
  • locale: undefined
  • extraLocale: undefined
  • preventBackButtonFix: true
  • searchIds: []
  • parseWidgets: true 

 

2. dojo.jsのロード

Dojoを利用するHTMLでは、下記のようにsrcriptタグでdojo.jsを読み込みます。

<script type="text/javascript" src="dojo.js" />

Dojo 0.4.2から、クロスドメインに対応した。これにより、Dojoのライブラリを自分で配置せずに、AOLのCDNで配信しているDojoのライブラリを直接参照して利用できる。AOLのCDNを直接参照するときは、以下のように記述する。 Editor Widgetなど一部の機能では、HTMLファイルをローカルサーバに置く必要がある。

<script type="text/javascript" src="http://o.aolcdn.com/dojo/0.4.3/dojo.js"></script>

3. dojo.requireの実行

srcディレクトリに含まれるその他のDojoのファイルは細分化されており、必要なリソースのみをロードするようになっています。

dojo.require()を用いて利用するwidgetなどのDojoのリソースを呼び出します。例えば回のように記述します。

dojo.require("dojo.lfx.html");
dojo.require("dojo.lfx.extras");

下記のようにワイルドカード(*)を用いてリソースを指定することもできます。

dojo.require("dojo.lfx.*");

Dojoのrequireで指定する名前空間の名前は、各リソースファイル(.js)のディレクトリ構成にそのまま対応します。

例えば、dojo.requre("dojo.i18n.number");によりロードされる、リソースファイルは、dojo\src\i18n\number.jsです。

dojo.requireIf(condition, "package")を使うと、conditionがtrueのときだけpackageをロードします。

4. 初期化関数の定義

次のaddOnLoadで呼ばれる初期化関数を定義します。先の例では、init()が初期化関数になります。

5. addOnLoadによる初期化関数の呼び出し

dojo.addOnLoad()で、HTMLページが読み込まれた後に呼び出される関数を指定します。関数を直接指定する方法と、下記のように、オブジェクトとそのメソッド名を指定する方法があります。dojo.addOnLoadはHTML bodyタグのonLoad属性に関数を書く場合や、window.onLoadと同じ動作をする。しかし、Dojoでは、windows.onLoadを上書きしているので、dojo.addOnLoadで呼び出す必要がある。

dojo.addOnLoad(object, "functionName")

HTMLのロードが終わらないとWidgetオブジェクトがインスタンス化されないため、DojoのWidgetオブジェクトを取得するときは、HTMLのロードが終わってから実行する必要がある。dojo.addOnLoadで呼び出した関数内であれば、確実にHTMLのロードが終わってから呼ばれる。

dojo.addOnLoadと同じ引数を取るdojo.addOnUnloadはページがアンロードされたとき、リロードされたときやページが移ったときなどに呼ばれる関数を指定する。

2007年3月11日 (日)

Dojo 0.4.2のまとめ

Dojo 0.4.2について少しずつ書いていきます。ここはまとめページ。

Dojo http://dojotoolkit.org/ は、The Dojo Foundationにより提供されているオープンソースのJavaScriptツールキットである。

Dojoは、Ajax呼び出しから、イベント処理、タブやツリーなどの各種GUI部品など、広範な機能を提供しており、機能ごとにファイルが分かれていて必要な機能だけを動的にロードする仕組みとなっているのが特徴となっている。 ブラウザは、Safari 2.0.x, Opera 9.0+, IE(Windows) 6.0+, Firefox 1.0+/Mozilla, Konqueror 3.5+に対応している。

概要

オブジェクト

文字列

XML

基本機能

Ajax機能

デザイン

フォーム部品

レイアウト

その他のGUI部品

その他

書籍

デバッグ

DojoのデバッグAPIを用いるには、dojo.jsを読み込む前にdjConfigのパラメータisDebugをtrueに設定する。

var djConfig = {isDebug: true};

指定しなければデバッグ情報は最後に表示される。デバッグ情報の表示先を指定したいときは、表示する場所でid="dojoDebug"を指定する。例えば、<div id="dojoDebug"></div>のように記述する。

指定するidの値を "dojoDebug"から変更したいときは、下記のようにdjConfig.debugContainerIdの値を指定する。この例では、<div id="test"></div>となる。

var djConfig = {
  isDebug: true,
  debugContainerId : 'test'
};

デバッグ表示したいときは、下記のAPIを用いる。

  • dojo.debug(message);
    • 引数のメッセージを表示する
  • dojo.debugShallow(object);
    • 引数のオブジェクトの全てのメンバー(メソッドとパラメータ)を表示する
  • dojo.debugDeep(object);
    • 新しくウィンドウを開いて、引数のオブジェクトのtree構造を表示する

その他のカテゴリー