SlideShare una empresa de Scribd logo
1 de 16
JavaScript Lunch 5
         June 5, 2008

         Naofumi HAIDA
     Cirius Technologies
JavaScript Lunch 目次

•   Object 指向的 JavaScript (第1回)   •   ライブラリ
     • 継承                              • jQuery
     • クロージャ                               • Introduction ($ 関数)
•   Reusable Codes                           (第2回)
     • Packaging                           • jQuery UI
•   デバッグ、テストツール                        • prototype.js
     • Firebug                         • Yahoo! UI
                        Today’s
•   DOM                  Topic!        • Mochi Kit
     • Basics of DOM              •   Effect
     • XPath                           • JavaScript & CSS (第4回)
•   Events                             • Improving Forms
•    Ajax                         •   その他
     • 仕組み (第3回)                       • Processing JS
     • デザインパターン
アジェンダ

•   DOM とは?
•   標準的な DOM アクセス
•   JavaScript における DOM アクセス
•   ライブラリを利用した DOM アクセス
DOM: Document Object Model とは?

HTML 文書や XML 文書をアプリケーショ
  ンから利用するための API
• XML データをツリー構造として扱う
• 対象のXML文書を全て読み込んでからの
  扱いを前提
 – 動作速度が遅い
 – メモリーの使用量が大きい
• JavaScript では HTML の DOM を利用し
  た各要素への操作が必要なことが多い
ノード間の関係性の例

         Parent Node                       p                 Parent Node

                       First Child                  Last Child


              strong                 Next Sibling        How are you doing?


                                 Previous Sibling
Parent      First Child,
Node        Last Child


               Hello
                                 <p><strong>Hello</strong>How
                                 are you doing?</p>
各ノードは他のノードへのポインタを持つ

                     Parent Node




Previous Sibling        DOM        Next Sibling
                        Node




       First Child                   Last Child
<html>
 <head>                              このHTML
                                     の各要素へ
    <title>初めてのDOM</title>           アクセスし
 </head>                             てみます。
 <body>
    <h1></h1>
    <p class= “test” >DOMとは?</p>
    <ul>
          <li id= quot;everywherequot; >A</li>
          <li class= quot;testquot; >B</li>
          <li class= quot;testquot; >C</li>
    </ul>
 </body>
 </html>
ノードポインタを利用した DOMアクセス

ルート要素 <html> へのアクセス
 document.documentElement

<h1> へのアクセス
 document
    .documentElement
    .firstChild
    .nextSibling
    .firstChild
ノードポインタを利用した DOMアクセスの注意点


• 整形された、見た目奇麗な HTML におい
  ては失敗する
 – ホワイトスペースを除去することで解決
• 冗長、実用的でない
• テキスト要素に直接アクセスするケース
  は稀
 – 通常はその周囲の DOM 要素にアクセスする
こんな関数を用意すると、、、

// XML Document 内のホワイトスペースを除去する関数
function cleanWhitespace( element ) {
  element = element || document;
  var cur = element.firstChild;

    // 子ノードがなくなるまでホワイトスペースを除去
    while ( cur != null ) {
      // 対象ノードがテキストノードかつホワイトスペースのみの場合
      if ( cur.nodeType == 3 && ! /¥S/.test( cur.nodeValue ) )
        element.removeChild( cur );

        else if ( cur.nodeType == 1 )
         cleanWhitespace( cur );

        cur = cur.nextSibling;
    }
}
ノードポインタを利用した DOMアクセス

// 文書内のホワイトスペースを除去
cleanWhitespace();
// ポインタを利用して <p> にアクセス
document.documentElement
  .firstChild   // <head>
  .nextSibling // <body>
  .firstChild   // <h1>
  .nextSibling; // <p>
よく利用するノードのタイプ

• Element (nodeType == 1)
  – XML における主要要素にマッチ
  – <a>,<p>,<body>
• Text (nodeType == 3)
  – ドキュメントないのテキストにマッチ
• Document (nodeType == 9)
  – ドキュメントのルート要素にマッチ
  – HTML なら <html>
標準 DOM メソッド

JavaScript では DOM へ効率的にアクセスで
  きるメソッドが用意されている (最もよく使
  う)

getElementByID(quot;everywherequot;)
  everywhere にマッチする ID 属性を持つ
  DOM 要素にアクセスできる
getElementsByTagName(quot;liquot;)
  li にマッチするノードのリスト(配列のよう
  なもの)を返す
利用例

document.getElementsByTagName(quot;h1“)[0];

var li =
   document.getElementsByTagName( 'li' );
for ( var j = 0, k = li.length; j < k; j++ ) {
  li[j].style.border = '1px solid #000';
}

document.getElementById(quot;everywherequot;).style.
  fontWeight = 'bold';
その他の DOM 要素へのアクセス方法

• よく利用される DOM へのアクセス方法は他に、
  以下の3種類
• いずれもライブラリを利用
 – クラス名でアクセス
   • hasClass('test');
   • http://simon.incutio.com/
 – CSS クエリでアクセス
   • cssQuery( 'div > p' );
   • http://dean.edwards.name/my/cssQuery/
 – XPath でアクセス
   • document.evaluate('//div', document, null, 7, null);
   • http://coderepos.org/share/wiki/JavaScript-XPath
jQuery

//<div class=quot;linksquot;><p></p></div>
$( 'div.links[p]' );

// <p></p>, <div></div> の子孫全て
$( 'p, div' ).find( '*' );

// <a href='google.com'> 以外のリンク
$('a[@href^=quot;google.comquot;]:even');

Más contenido relacionado

La actualidad más candente

[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発
[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発
[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発Yuichi Tanaka
 
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!devsumi2009
 
Xen+DRBDによるライブマイグレーション
Xen+DRBDによるライブマイグレーションXen+DRBDによるライブマイグレーション
Xen+DRBDによるライブマイグレーションmkawase
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)龍一 田中
 
Candycane overview
Candycane overviewCandycane overview
Candycane overviewYusuke Ando
 
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]bookbooming1
 
淺嚐新火狐
淺嚐新火狐淺嚐新火狐
淺嚐新火狐Bob Chao
 
イケテルRuby開発環境
イケテルRuby開発環境イケテルRuby開発環境
イケテルRuby開発環境mokada
 
Wikiスパムの傾向と対策
Wikiスパムの傾向と対策Wikiスパムの傾向と対策
Wikiスパムの傾向と対策Makio Tsukamoto
 
Agile Requirements Management
Agile Requirements ManagementAgile Requirements Management
Agile Requirements ManagementAlexey Krivitsky
 
通用 web 开发技术体系介绍
通用 web 开发技术体系介绍通用 web 开发技术体系介绍
通用 web 开发技术体系介绍zhyq0826
 
CSS 排版 - 基礎觀念篇
CSS 排版 - 基礎觀念篇CSS 排版 - 基礎觀念篇
CSS 排版 - 基礎觀念篇Jace Ju
 
Java Script для насыщенных интерфейсов андрей оконечников
Java Script для насыщенных интерфейсов   андрей оконечниковJava Script для насыщенных интерфейсов   андрей оконечников
Java Script для насыщенных интерфейсов андрей оконечниковMedia Gorod
 
CAPとBASEとEventually Consistent
CAPとBASEとEventually ConsistentCAPとBASEとEventually Consistent
CAPとBASEとEventually ConsistentYohei Yamamoto
 
Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xWiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xMakio Tsukamoto
 

La actualidad más candente (19)

[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発
[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発
[12_B_6] PHP/MySQL を用いた大規模向けパッケージソフトウェア開発
 
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!
【13-D-4】 アナタのアプリ性能改善の秘訣、オラクルが教えます!
 
Xen+DRBDによるライブマイグレーション
Xen+DRBDによるライブマイグレーションXen+DRBDによるライブマイグレーション
Xen+DRBDによるライブマイグレーション
 
Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)Web技術勉強会9回目(Slideshare用)
Web技術勉強会9回目(Slideshare用)
 
Candycane overview
Candycane overviewCandycane overview
Candycane overview
 
Test 134
Test 134Test 134
Test 134
 
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]Cac giai phap_lap_trinh_c___final_[bookbooming.com]
Cac giai phap_lap_trinh_c___final_[bookbooming.com]
 
淺嚐新火狐
淺嚐新火狐淺嚐新火狐
淺嚐新火狐
 
イケテルRuby開発環境
イケテルRuby開発環境イケテルRuby開発環境
イケテルRuby開発環境
 
Wikiスパムの傾向と対策
Wikiスパムの傾向と対策Wikiスパムの傾向と対策
Wikiスパムの傾向と対策
 
Agile Requirements Management
Agile Requirements ManagementAgile Requirements Management
Agile Requirements Management
 
通用 web 开发技术体系介绍
通用 web 开发技术体系介绍通用 web 开发技术体系介绍
通用 web 开发技术体系介绍
 
CSS 排版 - 基礎觀念篇
CSS 排版 - 基礎觀念篇CSS 排版 - 基礎觀念篇
CSS 排版 - 基礎觀念篇
 
Java Script для насыщенных интерфейсов андрей оконечников
Java Script для насыщенных интерфейсов   андрей оконечниковJava Script для насыщенных интерфейсов   андрей оконечников
Java Script для насыщенных интерфейсов андрей оконечников
 
CAPとBASEとEventually Consistent
CAPとBASEとEventually ConsistentCAPとBASEとEventually Consistent
CAPとBASEとEventually Consistent
 
Way to Wikiwyg
Way to WikiwygWay to Wikiwyg
Way to Wikiwyg
 
Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.xWiki Wiki Decade - WikiBaseとYukiWiki 1.x
Wiki Wiki Decade - WikiBaseとYukiWiki 1.x
 
okyuu.com x Rails x OpenID
okyuu.com x Rails x OpenIDokyuu.com x Rails x OpenID
okyuu.com x Rails x OpenID
 
CYD إطار في
 CYD إطار في CYD إطار في
CYD إطار في
 

Más de Nao Haida

プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針
プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針
プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針Nao Haida
 
OpenID Tutorials
OpenID TutorialsOpenID Tutorials
OpenID TutorialsNao Haida
 

Más de Nao Haida (7)

プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針
プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針
プロダクトマネージャとセールスチームはどう連携すべきか 〜 失敗例と方針
 
Jslunch6
Jslunch6Jslunch6
Jslunch6
 
Jslunch4
Jslunch4Jslunch4
Jslunch4
 
Jslunch3
Jslunch3Jslunch3
Jslunch3
 
Jslunch2
Jslunch2Jslunch2
Jslunch2
 
Jslunch1
Jslunch1Jslunch1
Jslunch1
 
OpenID Tutorials
OpenID TutorialsOpenID Tutorials
OpenID Tutorials
 

Jslunch5

  • 1. JavaScript Lunch 5 June 5, 2008 Naofumi HAIDA Cirius Technologies
  • 2. JavaScript Lunch 目次 • Object 指向的 JavaScript (第1回) • ライブラリ • 継承 • jQuery • クロージャ • Introduction ($ 関数) • Reusable Codes (第2回) • Packaging • jQuery UI • デバッグ、テストツール • prototype.js • Firebug • Yahoo! UI Today’s • DOM Topic! • Mochi Kit • Basics of DOM • Effect • XPath • JavaScript & CSS (第4回) • Events • Improving Forms • Ajax • その他 • 仕組み (第3回) • Processing JS • デザインパターン
  • 3. アジェンダ • DOM とは? • 標準的な DOM アクセス • JavaScript における DOM アクセス • ライブラリを利用した DOM アクセス
  • 4. DOM: Document Object Model とは? HTML 文書や XML 文書をアプリケーショ ンから利用するための API • XML データをツリー構造として扱う • 対象のXML文書を全て読み込んでからの 扱いを前提 – 動作速度が遅い – メモリーの使用量が大きい • JavaScript では HTML の DOM を利用し た各要素への操作が必要なことが多い
  • 5. ノード間の関係性の例 Parent Node p Parent Node First Child Last Child strong Next Sibling How are you doing? Previous Sibling Parent First Child, Node Last Child Hello <p><strong>Hello</strong>How are you doing?</p>
  • 6. 各ノードは他のノードへのポインタを持つ Parent Node Previous Sibling DOM Next Sibling Node First Child Last Child
  • 7. <html> <head> このHTML の各要素へ <title>初めてのDOM</title> アクセスし </head> てみます。 <body> <h1></h1> <p class= “test” >DOMとは?</p> <ul> <li id= quot;everywherequot; >A</li> <li class= quot;testquot; >B</li> <li class= quot;testquot; >C</li> </ul> </body> </html>
  • 8. ノードポインタを利用した DOMアクセス ルート要素 <html> へのアクセス document.documentElement <h1> へのアクセス document .documentElement .firstChild .nextSibling .firstChild
  • 9. ノードポインタを利用した DOMアクセスの注意点 • 整形された、見た目奇麗な HTML におい ては失敗する – ホワイトスペースを除去することで解決 • 冗長、実用的でない • テキスト要素に直接アクセスするケース は稀 – 通常はその周囲の DOM 要素にアクセスする
  • 10. こんな関数を用意すると、、、 // XML Document 内のホワイトスペースを除去する関数 function cleanWhitespace( element ) { element = element || document; var cur = element.firstChild; // 子ノードがなくなるまでホワイトスペースを除去 while ( cur != null ) { // 対象ノードがテキストノードかつホワイトスペースのみの場合 if ( cur.nodeType == 3 && ! /¥S/.test( cur.nodeValue ) ) element.removeChild( cur ); else if ( cur.nodeType == 1 ) cleanWhitespace( cur ); cur = cur.nextSibling; } }
  • 11. ノードポインタを利用した DOMアクセス // 文書内のホワイトスペースを除去 cleanWhitespace(); // ポインタを利用して <p> にアクセス document.documentElement .firstChild // <head> .nextSibling // <body> .firstChild // <h1> .nextSibling; // <p>
  • 12. よく利用するノードのタイプ • Element (nodeType == 1) – XML における主要要素にマッチ – <a>,<p>,<body> • Text (nodeType == 3) – ドキュメントないのテキストにマッチ • Document (nodeType == 9) – ドキュメントのルート要素にマッチ – HTML なら <html>
  • 13. 標準 DOM メソッド JavaScript では DOM へ効率的にアクセスで きるメソッドが用意されている (最もよく使 う) getElementByID(quot;everywherequot;) everywhere にマッチする ID 属性を持つ DOM 要素にアクセスできる getElementsByTagName(quot;liquot;) li にマッチするノードのリスト(配列のよう なもの)を返す
  • 14. 利用例 document.getElementsByTagName(quot;h1“)[0]; var li = document.getElementsByTagName( 'li' ); for ( var j = 0, k = li.length; j < k; j++ ) { li[j].style.border = '1px solid #000'; } document.getElementById(quot;everywherequot;).style. fontWeight = 'bold';
  • 15. その他の DOM 要素へのアクセス方法 • よく利用される DOM へのアクセス方法は他に、 以下の3種類 • いずれもライブラリを利用 – クラス名でアクセス • hasClass('test'); • http://simon.incutio.com/ – CSS クエリでアクセス • cssQuery( 'div > p' ); • http://dean.edwards.name/my/cssQuery/ – XPath でアクセス • document.evaluate('//div', document, null, 7, null); • http://coderepos.org/share/wiki/JavaScript-XPath
  • 16. jQuery //<div class=quot;linksquot;><p></p></div> $( 'div.links[p]' ); // <p></p>, <div></div> の子孫全て $( 'p, div' ).find( '*' ); // <a href='google.com'> 以外のリンク $('a[@href^=quot;google.comquot;]:even');