Javascript

【Javascript】CSSセレクタとマッチする要素を取得する。

めも。

document.querySelector()メソッドを用いる。

例えば下記のようなHTML要素を取得したい場合。

<div class="target">Click</div>
<span id="target">Click</span>

下記の通り、CSSと同様のセレクタを渡すことで要素を選択してくれる。

var div = document.querySelector('.target');
var span = document.querySelector('#target');
console.log(div, span);

document.querySelector()は同一の要素が複数ある場合、最初にマッチした要素のみを返却する。
そのため下記のように一致する要素全てを取得したい場合はdocument.querySelectorAll()を用いるとよい。

■HTML

<div class="target">Click1</div>
<div class="target">Click2</div>
<div class="target">Click3</div>
<div class="target">Click4</div>
<div class="target">Click5</div>
<div class="target">Click6</div>

■Javascript

var divs = document.querySelectorAll('.target');
console.log(divs);

 

【Javascript】キャプチャリングとバブリングの違い。

DOMのイベントには、キャプチャリングフェーズとバブリングフェーズという二つのフェーズが存在しており、addEventListenerの第三引数にて指定することが出来る。trueを渡すと、キャプチャリングフェーズ、falseを渡すとバブリングフェーズで実行される。デフォルトはバブリングフェーズで実行される。

■実行順
キャプチャリングフェーズ => バブリングフェーズ

■キャプチャリングフェーズ
DOMの外側からイベントが発生した要素に向かってイベントが伝わる。

■バブリングフェーズ
イベントが発生した要素から外側に向かってイベントが伝わる。

 

挙動に関しては要実験。

 

【Javascript】特定の要素に対して複数のイベントを設定する。

めも。

例えば以下のようなボタン要素に対して複数のイベントをバインドさせたい場合。

<button class="js_btn">Click</button>

下記の様にaddEventListener()メソッドを用いることで同時に複数のメソッドを結びつけることができる。

<script>
var obj = {};

obj.hoge = function(){
	alert('hoge');
}

obj.piyo = function(){
	alert('piyo');
}

obj.fuga = function(){
	alert('fuga');
}


$(function(){
	var btn = document.querySelector('.js_btn');
	btn.addEventListener('click', obj.hoge, false);
	btn.addEventListener('click', obj.piyo, false);
	btn.addEventListener('click', obj.fuga, false);
})
</script>

 

【jQuery】ajax()関数のラッパーメソッドまとめ。

メモ。

// GETメソッドで通信を行う。送信データ、成功時コールバック関数、レスポンスデータタイプを指定可能
get(url, data, success, dataType);

// POSTメソッドで通信を行う。引数は上記get()と同様
post(url, data, success, dataType);

// JSONデータをGETメソッドで取得する。送信データ、成功時コールバック関数を指定可能
getJSON(url, data, success);

// JavascriptをGETメソッドで取得し、実行する。成功時のコールバック関数を指定可能
getScript(url, success);

ajaxSetup()関数を用いるとajax()関数で指定可能なオプションの初期値をセットできる。
ajaxSetup()でイニシャライズを済ませておき、実際の通信はラッパー関数で行えば非常にスマートなコードにできそう。

 

【Javascript】windowオブジェクトまとめ。

めも。

// 言語情報やユーザーエージェントなどの情報が格納されている
window.navigator

// URLに関する情報が格納されている
window.location

// ブラウザ履歴を戻るback()メソッドや進めるforward()メソッドなど、履歴操作に纏わるメソッドが格納されている
window.history

// 表示している画面の幅、高さ、色数などの情報が格納されている
window.screen

// 画面内に複数のフレームが存在している場合、そのフレームへの参照が格納される
window.frames

// レンダリングされているDOMが全て格納される
window.document

たとえば。

> window.navigator.userAgent
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"

> window.screen.width
1440

といった具合に情報を取り出すことが出来る。

 

【Javascript】時間、回数、パフォーマンスを詳細に計測する。

めも。

console.profile()、console.profileEnd()を用いると各関数の実行回数、合計の実行時間などを計測し、コンソールへ詳細に吐き出してくれる。
上記関数にはそれぞれ同一のキーを引数として渡し、同じキーが指定されたものをペアとしてその区間の計測結果を出力してくれる。

例えば下記のようなjQueryを用いたコードのパフォーマンスを詳細に計測したい場合。

<script>
var obj = {};

obj.test = function(){
	console.log('ok');
}

$(function(){
	for(var i = 0; i < 100; i++){
		for(var j = 0; j < 10; j++){
			obj.test();
		}
	}
})
</script>

下記のようにconsole.profile()、console.profileEnd()を挿入してみる。

<script>
var obj = {};

obj.test = function(){
	console.log('ok');
}

$(function(){
	console.profile('key');
	for(var i = 0; i < 100; i++){
		for(var j = 0; j < 10; j++){
			obj.test();
		}
	}
	console.profileEnd('key');
})
</script>

そして、これを実行すると下記のようなデバッグ結果が出力される。
※下記はChromeで実行した場合のデバッグコンソール。

c7321b7fafc05912cf004164673dfe9a

パフォーマンスを極限まで追及する際に欠かせない非常に強力な機能だね。

 

【Javascript】コンソールでスタックトーレスを表示する。

めも。

console.trace();

変数のデバッグ時はconsole.log()関数を用いるが、その関数がどこから呼ばれたのかを詳細に表示したい場合は、console.trace()関数を用いるとよい。
console.trace()はトリガーになったイベントがどのオブジェクトのものであるかまで判明するため、イベントドリブン形式でプログラムを記述している場合は非常に有用。

 

【Javascript】外部JSファイルの実行を遅延させる方法。

めも。

<script src="//example.com/hoge.js"></script>
<script src="//example.com/fuga.js" defer></script>

上記2行目のようにscriptタグに対しdefer属性を追加してやると、そのscriptタグの評価を他全てのscriptタグの評価終了後に遅延させることが出来る。
逆に非同期で外部JSファイルを読み込み逐次評価させたい場合は下記のように、async属性を追加してやればよい。

<script src="//example.com/hoge.js"></script>
<script src="//example.com/fuga.js" async></script>

まぁ普通にjQueryの$(function(){…})でやればいいことなんだけれども。