RAILS PRESS RUBY on RAILS, it’s DRY and COOL …

RSS Feed

RAILS PRESS RSS

Tag Cloud

はてなブックマーク - railspress.matake.jp の注目エントリー
象形文字くさび形文字ミイラそろばんの玉そろばんコーラン占いの板?象牙大英博物館
Tagged by Ajax

Posted on
2008/09/06

Tags
Ajax, JavaScript

0 Comment

この記事をはてなブックマークに登録 この記事のはてなブックマーク数 この記事を livedoor クリップに登録この記事の livedoor クリップ数 このエントリを del.icio.us に追加
ブックマークに追加する

外部HTMLをAjaxで読みこんで表示するAjaxViewer

最近ようやくJavaScriptの勉強を始めました。
いままではJavaScriptのオブジェクト指向的な部分が全く分かっていなかったのですが、ようやく少し分かり始めた気がします。

今日はJavaScriptの勉強を兼ねて、外部のHTMLを非同期に読み込んで指定されたDOM要素の中に吐き出すスクリプトを書いてみました。元々「京の路(MovableType)」のサイドバー再構築の負荷を軽減するため、別ファイルに書き出したサイドバーをAjaxで読み込んでいたのですが、今回書いたスクリプトはそこで使っていたスクリプトをオブジェクト指向的に書き直したものです。

「こういう風に書くともっとスマートだよ」とか、アドバイスや感想などいただけるとうれしいです!

LANG : JAVASCRIPT
  1. var AjaxViewer = function( id ) {
  2.   this.initialize( id );
  3. };
  4.  
  5. AjaxViewer.prototype = {
  6.   /* デフォルトでは ajax_viewer_id を書き換える */
  7.   id : 'ajax_viewer_id',
  8.  
  9.   initialize : function( id ) {
  10.     /* 引数で id が与えられたら this.id を変更 */
  11.     if ( id ) this.id = id;
  12.    
  13.     /* XMLHttpRequest を生成 */
  14.     if ( window.XMLHttpRequest ) {
  15.       // Firefox, Safari, IE7
  16.       this.request = new XMLHttpRequest( );
  17.     } else {
  18.       try {
  19.         // IE 6.0 以上
  20.         this.request = new ActiveXObject( 'Msxml2.XMLHTTP' );
  21.       } catch( e ) {
  22.         try {
  23.           // IE 5.5 以下
  24.           this.request = new ActiveXObject( 'Microsoft.XMLHTTP' );
  25.         } catch( e ) {
  26.           this.request = null;
  27.         }
  28.       }
  29.     }
  30.   },
  31.  
  32.   escape_for_safari : function( low_text ) {
  33.     /**
  34.      * Safari の文字化対応
  35.      * (参考:http://kawa.at.webry.info/200511/article_9.html)
  36.      */
  37.     if ( navigator.appVersion.indexOf( 'KHTML' )> -1 ) {
  38.       var escaped_text = escape( low_text );
  39.       if ( escaped_text.indexOf( '%u' ) <0 &&
  40.            escaped_text.indexOf( '%'  )> -1 ) {
  41.         return decodeURIComponent( escaped_text );
  42.       }
  43.     }
  44.     return low_text;
  45.   },
  46.  
  47.   callback : function( self ) {
  48.     var area = document.getElementById( self.id );
  49.     area.innerHTML = self.escape_for_safari( self.request.responseText );
  50.   },
  51.  
  52.   load : function( url ) {
  53.     if ( !this.request ) return;
  54.     this.request.open( 'GET', url, true );
  55.     /**
  56.      * 内部で定義された function() では this にアクセスできないので
  57.      * this の代わりに self という変数を用意する
  58.      * (参考:http://d.hatena.ne.jp/cloned/20070301)
  59.      */
  60.     var self = this;
  61.     this.request.onreadystatechange = function( ) {
  62.       if ( self.request.readyState == 4 &&
  63.            self.request.status     == 200 ) {
  64.         self.callback( self );
  65.       }
  66.     };
  67.     this.request.send( '' );
  68.   }
  69.  
  70. };

使い方は以下の通り。
あらかじめ外部HTMLを吐き出すために、指定したid要素(ここでは'menu')を持つdivを用意しておいてください。

LANG : JAVASCRIPT
  1. /* idを引数で渡す */
  2. var menu = new AjaxViewer( 'menu' );
  3. /* urlを引数で渡す */
  4. menu.load( 'http://blog.matake.jp/menu.html' );


Ajaxタグ