wiss inc

WISS inc.

Blog Image

有限会社 ウィス

WEBアプリケーション・システム開発

- 事務所移転しました -
長野県松本市中央1-7-13カネモ公園ビル3F
※本サイトは弊社ブログシステムで動作しております。

モジュールの動的ロードとロードイベントの処理

core. ブログの記事内などでのスクリプトに便利

モジュールの動的ロード (dojo.require)
もし以下のような関数を使うなら、

dojo.someModule.someFunction();
その前に関数が含まれるモジュールをロードしておきます。
dojo.require("dojo.someModule");
これによって遅延ロードが可能でページの初期表示を軽くすることが可能です。また、JAVAのパッケージのインポート(import)と同じで、重複してロードされる事はありません。
また必要なモジュールを必要な時に安全に呼べることは、ブログの制約内ではかなり便利です。

ページのロードイベント
BODYタグの「onLoad」、もしくは、window.onload の設定はイベントを代入しているため1つしか指定できません。
初期化の関数を複数登録することができ、Dojoではよく使います。ただし、GoogleMapsなどの他のAPIを使っている場合には注意が必要です。
dojo.addOnLoad(
  function(){dojo.byId('box').innerHTML='Loaded<br/>'});
dojo.addOnLoad(
  function(){dojo.byId('box').innerHTML+='Loaded(2)'});

サンプル:

DIV要素をHOVER指定できるリンクにする

core. jQuery拡張のBiggerlinkがあまりに素敵なので。

リスト表示ブロック内に写真と文字を配置するような場合でもごっそりリンク領域にできると嬉しいです、ポータルなどで活用できそうです。Aタグをブロック要素にすることでも可能ですが構造的に限界があります。これをDojoで出来るかやってみました。

まず、マウスオーバー時に自動追加されるHOVER用ののスタイルを定義(初期値.hover)。追加されるクラスは既存のクラスの上位に配置されるようなので"!important"が必要です。

<style type="text/css">	
.hover {
	cursor: pointer;
	background-color:#DAF1F1 !important;
}
.hover a:link,.hover a:visited {
	color: #006666 !important;
}
.hover .bar {
	background-color:#C7D8C6 !important;
}
</style>

HTML部分はこんな感じ、ここではCSSクラス"links"がリンクになります。
<div class="listBox links">
  <strong><a href="http://...">Wiss</a></strong>
  <div>
    Dojo (Dojo Toolkit)は...<br/>
    <a href="http://...">Read more</a>
  </div>
</div>
・・・以上の繰り返し

スクリプトはbiggerlinkの仕様を参考にしました。
<script type="text/javascript">
function biggerlink(opts) {
  var settings = { hoverclass:'hover', 
    targetclass:'hot' };
  if (opts) for (var k in opts) settings[k] = opts[k];
  //対象クラスすべてに処理
  dojo.query("."+settings.targetclass).forEach(
    function(el){
      dojo.connect(el,"onmouseover",function(){
        dojo.addClass(el,settings.hoverclass);
      });
      dojo.connect(el,"onmouseout",function(){
        dojo.removeClass(el,settings.hoverclass); 
      });
      dojo.connect(el,"onclick",function(e){
        var o = dojo.query("a",el)[0]; if (!o) return;
        window.location = o.href;
        e.stopPropagation(); //イベントの伝搬を中止
        e.preventDefault();  //デフォルト処理停止
      });
    }
  );
}
</script>

サンプルでは効果を確認するため、ボタンに"biggerlink({targetclass:"links"})"を割り当てています。実際は、dojo.addOnLoad などで呼びます。

リンクに変更したいクラス(targetclass)、HOVER時に付加するクラス(hoverclass)を関数(biggerlink)のパラメータで指定すると対象のDIV要素すべてに対して、そのDIV要素内の最初のAタグのリンクを参照して、各イベントを自動割り当てします。

サンプル:


※jQueryのBiggerlinkも同じなのですが、taget="_blank"には対応できませんでした。

マウスオーバーのイメージを差し替える(rollover)

core. ロールオーバーの画像差し替え機能。よく使いそうなので考えてみました。

これもよく使われる機能ですので、Dojoを使ってシンプルなものを作ってみます。基本的なスクリプトの仕様は最もシンプルで快適なDaniel Nolan氏作のものを参考にしました。

<img src=".../rollover.gif"
      alt="Some Image" class="imgover" />
<script type="text/javascript">
dojo.addOnLoad(rollover);
function rollover(opts) {
  var settings = { hoverclass:'imgover',suffix:'_o' };
  if (opts) for (var k in opts) settings[k] = opts[k];
  //対象クラスすべてに処理
  dojo.query("img."+settings.hoverclass).forEach(
    function(el){
      var src = el.getAttribute('src');
      el.setAttribute('osrc', src);
      var hsrc = src.replace(/(\.gif|\.jpg|\.png)/,
          settings.suffix+"$1");
      el.setAttribute('hsrc', hsrc);
      //preload
      var temp = new Image();
      temp.src = hsrc;
      dojo.connect(el,"onmouseover",function(){
      el.setAttribute('src', el.getAttribute('hsrc'));
      });
      dojo.connect(el,"onmouseout",function(){
      el.setAttribute('src', el.getAttribute('osrc'));
      });
    }
  );
}
</script>

マウスオーバーで変更したいAタグに定義するクラス(hoverclass)、オーバー時に表示する画像ファイル名のあとに付加する名称(suffix)を指定します。初期値はそれぞれ、"imgover", "_o" です。

サンプル:
Some Image Some Image

ボタンウィジェットとイベントの接続

dijit. DijitのGUI部品の基本であるボタンの使い方

headタグでスクリプトをロードします。

<script type="text/javascript" 
  src="/js/dojoroot/dojo/dojo.js"
  djConfig="parseOnLoad: true"></script>
Dijitのウィジェットを使用する場合は、dojo.jsを呼ぶ際、djConfig="parseOnLoad: true" と指定します。これはページ読込み時にDOMをパースする指定で、dojoがウィジェットタイプを参照し表示を変えるため必要になります。

<script type="text/javascript">
  dojo.require("dijit.form.Button");
  dojo.require("dijit.Menu");
</script>
<style>
  @import "/js/dojoroot/dijit/themes/tundra/tundra.css";
  @import "/js/dojoroot/dojo/resources/dojo.css";
</style>

<div class="tundra">
<button dojoType="dijit.form.Button" id="test">
  <span>Click here</span>
  <script type="dojo/method" event="onClick">
    alert('押しましたね?');
  </script>
</button>

<div dojoType="dijit.form.DropDownButton" id="test2">
  <span>Edit</span>
  <div dojoType="dijit.Menu" id="Edit">
    <div dojoType="dijit.MenuItem" label="Copy"
      onclick="alert('Copy!');"></div>
    <div dojoType="dijit.MenuItem" label="Cut" ></div>
  </div>
</div>
</div>
require で Button と Menu を呼び出します。
GUI部品なのでスタイルシートを呼び、テーマ名のクラスのDIVで囲みます。テーマは3種類が用意されています。dojo.css は基本セレクタの初期化などです。

Clickイベントへの接続は上のようにbuttonタグ内にスクリプトを入れ、type, event属性を指定します(buttonタグ内に、onclick=でももちろんOK)。DropDown内の Menu アイテムは onclick で指定します。

サンプル:
Edit


※今回、dojo.css を読んだらこのブログエントリーの一部のタグのスタイルが書き換えられたのでコメントにしました。(preタグなど)
またボタン文字の色は逆にブログのスタイルが適用されたのでインラインスタイルで定義しています。
dojo.css は初期化がメインなのでスタイルの呼び出し順には少し注意が必要です。

TITLE