CoffeeScript – クラスのメソッド

アクセス可能性

以下のコードで、クラスの関数へのアクセス可能性を確認する。

各関数へのアクセス可能性は以下の通り。

定義\引用 クラス インスタンス メソッド内
(@なし)
 メソッド内
(@つき)
fnc: ->  TypeError  ○ ReffError
@fnc: ->  ○ TypeError ReffError TypeError
fnc = -> TypeError TypeError TypeError
@fnc = -> TypeError ReffError TypeError

なお、上記コードの定義部分のJavaScriptコンパイル結果は以下の通り。

クラス・メソッド

クラス内で@つきでメソッドを定義すると、クラスメソッドになる。

上記のいずれもJavaScriptへのコンパイル結果は同じになる。

クラスメソッドは、クラス内で呼び出すときでもクラス名をつける。

publicなインスタンス・メソッド

最も多く用いる形で、クラス内でコロン(:)によって関数を定義すると、インスタンス・メソッドになる。

JavaScriptへのコンパイル結果では、prototype宣言されている。

同じクラスのメソッド内で呼び出すときは、@つきで。

privateなクラス・メソッド

クラス内でfnc = ->のように定義すると、クラスの外からは見えないprivateなメソッドになる。

JavaScriptコードでは、クラス内のスコープで宣言されており、外からは見えない。

 

CoffeeScript – クラスのプロパティ

アクセス可能性

以下のコードで、クラスに関する変数へのアクセス可能性を確認する。

各変数へのアクセス可能性は以下の通り。

定義\引用 クラス インスタンス メソッド内
(@なし)
メソッド内
(@つき)
クラス直下 v=val undef undef undef
@v=val undef undef RefError undef
v:val undef RefError
@v:val undef RefError undef
コンストラクタ v=val undef undef RefError undef
@v=val undef RefError

この表から、以下のように整理できる。特にpublicなインスタンス・プロパティとstaticなクラス・プロパティを使っていくことになる。

クラス直下で@v:val定義 staticなクラス・プロパティ
クラス直下でv:val publicなインスタンス・プロパティ
 コンストラクタで@v=val publicなインスタンス・プロパティ
 クラス直下でv=val  privateなクラス・プロパティ

なお、定義部分のJavaScriptへのコンパイル結果は以下の通り。

クラス・プロパティ

クラス直下で@v:valでプロパティを定義する場合、プロパティはクラスに一つの共有のものとして扱われる。コンパイルされたJavaScriptコードでは正に”[クラス名].[プロパティ名]“となっている

インスタンスの中から参照する場合も、[クラス名].[プロパティ名]で参照する。

publicなインスタンス・プロパティ

クラス直下でv:valと定義した場合とコンストラクタで@v=valと定義した場合は、いずれもインスタンス・プロパティとして扱われる。

挙動としては同じなのでどちらでもよさそうだが、インスタンス・プロパティとしてはコンストラクタで定義する形式の方がよいと考えた。

以下のように、それぞれの定義方法でJavaScriptのコードが異なるが、メソッドのようにクラス内で共通化したい場合はprototypeがよいが、そもそもインスタンスごとに異なる値をとることを想定しているプロパティの場合は、thisによる定義の方が意味に即している。

privateなクラス・プロパティ

クラス直下でv=valと定義すると、そのクラスの各インスタンスで共有されたprivateなプロパティになる。

JavaScriptコードを見るとクラス宣言の最初でvar宣言されているため、クラス内スコープで外からは見えない変数となる。

 

CoffeeScript – jQueryによるINPUT要素の操作

jQueryによるINPUT要素の操作

ボタンのテスト

ここではボタン操作に対するイベントを確認している。

ボタンはinput要素のタイプの一つとして作成される。
ボタンが押された時のイベントはonclick属性で定義してもよいが、ここではそれを使わず、jQueryのハンドラで処理している。

ボタンが押下されたときのイベントは、(そのボタンが動的に後から追加されたものでなければ)click()で捕捉される。

テキストボックスのテスト

入力:
出力:

ここではテキストボックスの内容の取得や書き込みについて確認している。

テキストボックスの内容の取得や設定はval()メソッドで行う。

チェックボックスのテスト

チェックボックスの確認。

チェックボックスのチェック状態の取得には、prop()メソッドを用いる。

ラジオボタンのテスト

通知エリア

  

ラジオボタンの動作を確認している。ここでは選択状態が変わるごとにイベントが発生して、通知エリアの表示が変わる。

上段はブラウザ側のonchange属性でイベントハンドラを指定し、下段はjQueryのハンドラを使っている。

セレクトボックスのテスト

通知エリア




セレクトボックス(ドロップダウンリスト)の例。

  • ボックス内の選択肢を選ぶたびに通知エリアの表示が変わる
  • “LONDONへ”ボタンを押すと、ロンドンが選択された状態になる。
  • “追加”ボタンで選択肢に”パリ”が追加され、”削除”ボタンで削除される

セレクトボックスの状態変化のイベントは、change()メソッドで捕捉される。

“追加”と”削除”のボタンはprop()メソッドを使って選択状態をトグルさせているが、ページのテーマ/デザインによっては明確にはわからないことがある。

 

CoffeeScript – CSソースとJSコンパイル結果

概要

様々なソースに対するコンパイル結果。

クロージャと変数のスコープ

グローバルなし

グローバルのつもりでも、必ず無名関数で括られる。

変数の宣言位置

変数は、それが属する関数の先頭で必ずvar宣言される。つまり、各変数はそれが属する関数内のローカルスコープを持つ。

引数なしの無名関数によるクロージャ

引数ありの無名関数によるクロージャ

クロージャとdoの違い

クラス

プロパティの宣言

 

WordPressでjQueryを使う場合

WordPressにはもともとjQueryがビルトインされて読み込まれるので、headセクションで読み込むとかjQueryサイトから引っ張ってこなくても、すぐに使えるらしい。

ただ、”$”が他のエイリアスになっているらしく、常套句である以下の表現は使えない。

これに対しては、最初のclosureの部分だけを書き換えれば、その中では”jQuery”→”$”と通常の構文が使えるとのこと。

この際、headerセクションでjquery関係のファイルを読み込む必要はない。

 

WordPressでonclickが消えてしまう

たとえば以下のようにボタンを配置するために、エディタの”テキスト”モードで直接次のように打ち込む。

ここで一度ビジュアルモードに移ってから再度テキストモードに戻ると、onclickがきれいに消えている。

これを回避するのにテーマフォルダ下のphpを修正する方法があるらしいが、テーマを変更したらどうなるのかなど素人には不安なので、手っ取り早い回避策を2つ

  • 全体のページ構成を打ち込んでいった後、onclickなどの実装時以降、テキストモードからビジュアルモードに移らない
  • HTMLでonblickなどを使わず、jQueryのイベントハンドラを使う

なお、上のinputタグを”<…>”で書いても、ビジュアルモードを経由すると、”<… />”とW3Cに準拠した書き方になおされている。

 

jQuery – イベント

ソース別イベント

個別イベントハンドラの一般形

要素に発生しうるイベントは下記一覧の通りで、イベントが発生した時、対応したハンドラが呼ばれる。

たとえばクリックイベントに対する処理の記述は以下の通り。

ただしこの形式のハンドラは、動的に追加された要素には対応していない。

マウスイベント

click クリック時
dblclick ダブルクリック時
mousedown マウスボタンを押した時
mouseup マウスボタンを離したとき
mouseover マウスカーソルが要素内に入った時(子要素を含む)
mouseout マウスカーソルが要素から出たとき(子要素を含む)
mouseenter マウスカーソルが要素に入った時(子要素は除く)
mouseleave マウスカーソルが要素から出た時(子要素は除く)
mousemove 要素内でマウスカーソルが移動した時
hover mouseenter / mouseleaveを一つにまとめたもの
toggle クリックの度に異なる処理を実行。v1.9以降廃止。

キーイベント

keydown キーを押した時
keypress キー入力があった時
keyup キーを離した時
focusin フォーカスされた時(子要素を含む)
focusout フォーカスが外れた時(子要素を含む)

フォームイベント

focus フォーカスされた時(子要素は除く)
blur フォーカスが外れた時(子要素は除く)
change 内容が変更された時
select 文字が選択された時
submit データ送信時

ブラウザイベント

resize リサイズした時
scroll スクロールした時
error エラーが発生した時

ロードイベント

load 読み込みが完了した時
unload ページから離れる時
ready DOMの読み込みが完了した時

イベントハンドラ・アタッチメント

イベントハンドラを要素にアタッチするメソッド。

たとえばon()メソッドの書き方の一つとして以下がある。

on()メソッドのハンドラとして、1つのイベントオブジェクトを引数に持つ関数を指定する。

探索範囲を限定してオブジェクトを探索する場合は以下の構文を用いる。

下表のbindoffまでのうち、現在はon/offメソッドのみ使えばよい。

また、on/offメソッドに指定できるイベントは、上記ソース別イベントの内、hoverとtoggle以外で指定する。

bind jQueryで最初に登場したアタッチメント。動的な要素に対応していないため、v1.3でliveが導入される。
unbind bindで設定された処理を解除。
live 動的な要素に対応したアタッチメント。処理負荷が高いため、v1.9で廃止された。
die liveで設定された処理を解除。v1.9で廃止。
delegate イベントの調査範囲を限定できるアタッチメント。v1.7で”on”に移行。
undelegate delegateで設定された処理を解除。
on イベントハンドラ・アタッチメントの最終形。
off onで設定されたイベント発生時の処理を解除。
one 1回だけ利用できるイベント発生時の処理を設定。構文はonと同じ。
triggerHandler 要素に指定したイベントを発生させるが、要素に対するブラウザ標準の機能は実行されない。
trigger 要素に指定したイベントを発生させ、ブラウザ標準の機能も実行させる。

イベントオブジェクト

概要

イベントオブジェクトはイベントハンドラに必ず渡されるobjectオブジェクト。イベント発生ごとに作成される。

基本形のコンストラクタでは、引数にイベント名を指定して作成する。たとえばclickイベントに対応するイベントオブジェクトは以下の様に作成される。

プロパティ

e.type イベントの種類
e.data イベントハンドラに渡された情報
e.pageX イベントが発生したX座標(ブラウザの座標系)
e.pageY イベントが発生したY座標(ブラウザの座標系)
e.timeStamp イベントが発生した時間(1970-01-01からのミリ秒)
e.which 正規化されたキーコード
e.result 直前に実行したイベントハンドラが返した値
e.namespace 名前空間に設定された名称
e.target イベントが発生したDOM要素
e.currentTarget 現在のDOM要素
e.delegateTarget デリゲート時の調査範囲のDOM要素
e.relatedTarget イベントの発生に関連したDOM要素

メソッド

e.stopPropagation()
バブリング(親要素方向へのイベントの伝播)を停止。
e.stopImmediatePropagation()
バブリングとイベントハンドラの実行を停止。
e.preventDefault()
ブラウザ標準の機能を停止。
e.isPropagationStopped()
stopPropagation()メソッドが実行されたかを調査。
e.isImmediatePropagationStopped()
stopImmediatePropagation()メソッドが実行されたかを調査。
e.isDefaultPrevented()
preventDefault()メソッドが実行されたかを調査。

 

jQuery – メソッド

値の取得

メソッドを通して、オブジェクトの持つプロパティなどを取得する。

※引数がない場合もある。

オブジェクトの操作

メソッドによりオブジェクトにプロパティを設定したり、動作させたりする。

※引数がない場合もある

イベント処理

構文1

オブジェクトに発生したイベントに対応して呼び出されるハンドラで、引数に処理を記述。

この構文では、後から動的に追加された要素には対応できない。

ハンドル用の関数を別に定義して引数に関数名を書いてもよいが、多くの場合無名関数が使われる。

構文2

動的に追加された要素にも対応するため、イベントが発生するたびに指定された範囲内でセレクタで指定されたオブジェクトを探索する。

この場合のon()メソッドは”イベントハンドラ・アタッチメント”の一つで、特定のイベントとそれに対するハンドラを結び付ける機能を持つ。

イベント名とセレクタは文字列で指定。

以下の例では、body要素の中の任意の要素がクリックされるとalertが立ち上がる。この場合は、H1、H2のいずれをクリックしてもalertが立ち上がる

また、on()メソッドの引数を以下のようにすると、H1をクリックしても反応せず、H2をクリックした時だけalertが立ち上がる。

イベントの種類、イベントハンドラ・アタッチメントについては、jQueryのイベントを参照。

 

JS/ES – JQuery – 基本

準備

JQueryのライブラリーを読み込む。

CDN (Contents Delivery Network)から読み込む場合の例は以下のとおり。

<script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>

ライブラリーをダウンロードする場合はURLをローカルのファイルパスにする。

記述位置~readyイベント

HTML要素に作用する処理(スタイル変更など)はDOMの読み込み後でなければならない。

JQueryスクリプトの記述位置記述方法

オブジェクトとメソッド

オブジェクトの作成

jQueryの操作対象はページのDOM要素だが、jQueryでは、DOMのidやクラス名を使ってそのDOMのオブジェクトを作成し、それらのメソッドを通して操作する。

オブジェクトの作成はjQuery()コンストラクタを使い、セレクタとしてcssのセレクタを指定。

先の例では、id=”header”を与えられたオブジェクトを以下の様に作成している。

要素指定

様々な要素指定方法を参照。

メソッドによる操作

メソッドは各オブジェクトのクラスに定義されており、他のオブジェクト指向言語と同じ形で呼び出す。

この例では”#header”で作成したオブジェクトに対して、cssメソッドで前景色を青にするよう指定している。

これをエイリアスを用いて書くと以下の通り。

メソッドの機能

メソッドには、機能に応じて以下の種類がある。

  • オブジェクトの情報を取得するもの
  • オブジェクトに対して操作を行うもの
  • オブジェクトのイベント処理を行うもの

JQuery – メソッドに詳細。