11章 実践クライアントサイドJavaScript
- p281 DOM操作とイベントの扱いがクライアントサイドJavaScriptの基本
スタイル
スタイル変更方法
- classNameプロパティでclass名を変更する
- スタイル操作でもっとも簡単な方法
- p282 指定した要素が隣接要素や子要素を持つ場合、大量の変更が発生してパフォーマンスが落ちる
- 個別にクラス名を設定しておくなど
- classListプロパティでclass名を変更する
- p283 HTML5で追加されたclassListプロパティを使うとより簡単にクラスの変更が可能
- p284 this.classList.変更コマンド(クラス名)
- contains(クラス名)…指定のオブジェクトのクラスに指定のクラスが含まれているか
- add(クラス名)…クラス名を追加する
- remove(クラス名)…クラス名を削除
- toggle(クラス名)…クラス名を追加したり、削除
- styleプロパティを変更する
- DOMのstyleプロパティを直接操作
- CSSで!importantが付与されているものを除いて、styleに設定した方が優先される
- プロパティ名は、ハイフンを削除して、接続文字を大文字にする
- floatはcssFloatプロパティで指定
- p285 機能とデザインの分離ができないので、あまり推奨しない
- スタイルシートそのものを変更する
位置の指定
- p287 position属性
- staticは、デフォルト値。自動的にレイアウトが決まる
- fixedは、ブラウザウィンドウを基準とした相対位置で配置できる。スクロールの影響は受けない。IE6未対応
- absoluteは、その要素を含む要素からの相対位置で配置できる
- p288 relativeは、タグに従って配置された後、その位置を基準とした相対位置で配置。absoluteの基準となる要素にrelativeを指定するような使い方をする。absoluteは、static属性の要素は基準にならないので、relativeを利用する
位置
- MouseEventが発火した際のEventオブジェクトにマウスの座標が入っている
- スクリーン座標は、screenX,screenYで取得できる。ディスプレイの左上を基準とした座標系
- ウィンドウ座標は、clientX,clientYで取得できる。ブラウザの表示領域の左上を基準とした座標系。文章・要素のスクロール量の影響は受けない
- ドキュメント座標は、pageX,pageYで取得できる。ドキュメントの左上を基準とした座標系。スクロールの影響を受ける。これは独自実装で、IE8以前では使えない
- p289 layerX,layerYあるいはoffsetX,offsetYは、発火した要素内での相対座標を取得できる。Webブラウザの独自実装
- Element.getBoundingClientRect()で、ウィンドウ座標系での要素の領域情報を取得できる
アニメーション
- p290 setInterval()で定期的な呼び出しを行い、座標や透過度などの変化をさせる
- CSS3でも可能。実装次第だが、通常はCSS3によるアニメの方がパフォーマンスがよい
AJAX
- 2005年にJesse James Garrett氏により命名
- p291 技術自体はGoogleのGmailがすでに利用
- AJAXによりJavaScriptが再評価された
非同期処理の利点
XMLHttpRequest
- JavaScriptからサーバに対して動的にリクエストを送るにはXMLHttpRequestオブジェクトを利用する
- 標準化されていないが、IE7以降を含むモダンブラウザには実装されている
- IE6での実装例
基本的な処理の流れ
同期通信
- send()で送信したあと、通信が返るまで待つので、そのあとで戻り値を処理すればよい
- 分かり易いが操作性として難があるので動作確認程度
レスポンス
クロスオリジン制限
クロスオリジン通信
- p297 異なるオリジンに対してリクエストを発行することをクロスオリジン通信という
JSONP
- XMLHttpRequestはクロスオリジン通信できないが、scriptタグはscrプロパティに別ドメインのJavaScriptを指定して読み込める
- JavaScriptで動的にscriptタグを生成すれば、別ドメインのデータが読めるが、データを取り出すだけでは利用ができないので、JSONPが考案
- JSON with Paddingの略で、PaddingとはJSONデータに関数名を付加する意味
- p298 サーバはJSONに関数名を付加したデータを返す。クライアントは受け取ったデータに付加されている関数名があればその関数を実行するという仕組み
- JSONPは、scriptタグのデータを処理しているだけなので、POSTでの通信ができない
iframeハック
- 親ページと孫iframeを同じドメインで、子iframeが違うドメイン
- 親ページから、子ページのドメインのhtmlを指定してiframeを作成。この時、URLにハッシュフラグメントを含める。ハッシュフラグメントにAPI呼び出しに利用したいデータを指定
- 子ドメイン内に、親孫ドメインのページを指定したiframeを作成。これが孫iframe
- 孫iframeのURLにもハッシュフラグメントを指定
- 孫iframeのonloadで、親ページの関数を呼び出し、location.hashの値を引数に渡す
- p301 IEでも動作し、JSONPよりも安全。JSONPはサーバに悪意があれば対処できないが、iframeだと自ドメインにある孫iframeを経由しないと親ページを操作できないので、安全性が上がる
window.postMessage
- HTML5で定義されたwindow.postMessageを使うとクロスオリジン通信が可能
XMLHttpRequest Level2
クロスオリジン通信のセキュリティ問題
- 異なるドメインとの通信は基本的にリスクがある
- 信頼できたサイトが乗っ取られてリスクになることもある
フォーム
- フォームでは、submitするとページ遷移が発生してしまう。ページの遷移はAJAXには不要
- submitを使わなくても、XMLHttpRequestで通信すればよい
- フォームを使った方がよい方法を紹介
フォーム要素
- p304 HTMLFormElementというHTMLElementを継承したインターフェースを持つ
- elementsは、フォーム内のコントロール要素
- フォーム要素自体は、document.formsで参照できる
- p305 いずれも、HTMLで記載されている順に列挙されるが、順番よりname属性を使うべき
- submit()メソッドで、submitボタンを押した時の処理を実行できる。submitイベントは発火しない。resetも同様
- onsubmit()イベントハンドらがfalseを返すとフォームのデータはサーバに送信されない。resetも同様
フォームコントロール要素
内容の検証
- p307 内容の研修のタイミング
- submitボタンが押されたとき
- データが入力された直後