Javascript

【jQuery】data属性に特定の値を持つ要素を指定する方法。

めも。

単に要素内に特定の値を持つノードを選択したいのであれば、下記のように「:contains()」を用いれば拾える。

■HTML

<div data-hoge="fuga">piyo</div>

■jQuery

$(function(){
	var elem = $('div:contains("piyo")');
	console.log(elem.data('hoge'));
})
[console]
fuga

これをどうにかごにょごにょして、data属性に特定の値を持つノードを選択できないかと色々調べてみたけれど、結局以下のようにするしかなさそう(?)な感じがした。

■HTML

<div data-hoge="fuga">piyo</div>

■jQuery

$(function(){
	var elem = $('[data-hoge="fuga"]');
	console.log(elem.text());
})
[console]
piyo

とりあえず動作は問題ないけど、もっとスマートな記述方法はないだろうか。属性セレクタはパフォーマンスがクッソ重いからなるべくなら使いたくないところ。
見つけたらもっかいまとめよう。

【Javascript】NaN(Not a Number)の判定方法。

if(parseInt(num) != ‘NaN’){}、とかやってたおろかな自分への戒めも。

if(isNaN(parseInt(num))){
	// 処理
}

ですよねー。そりゃ関数あるよねー。

【jQuery】特定の要素が画面内にレンダリングされた際、処理を実行する。

ブログなどの画面をスクロールしていると、読み終わるころにぴょこっと右下からお勧め記事が出てきたりする際にやってるやーつー。

いたって実装は単純。

$(function(){
	// 処理実行の引き金となる要素を設定
	var target = $("#target");
	$(window).scroll(function(){
		// 実行のトリガーになる要素のオフセット(一番上からの距離)から
		// 画面の縦幅を引いたものを処理実行までの距離とする(画面の下端を基準に設定)
		var tPos = $(target).offset().top - $(window).height();	
		// スクロールされた長さが上記で求めた距離を越えた場合、処理を実行
		if ($(window).scrollTop() >= tPos) {
			// 処理を記述
		}
	});
});

以下関数の解説。

■scroll()
画面のスクロールをトリガーに処理を実行する。

■offset()
指定した要素が可視状態の場合(display:noneとかじゃない)、ドキュメント内最上端から指定要素上端までの距離を取得する。

■height()
指定した要素の高さを取得する。$(window).height()の場合、現在の表示領域(画面の高さ)を返却する。

■scrollTop()
ドキュメントの最上端から現在までにスクロールされた距離をピクセルで返却する。

これらの関数を用いれば、ユーザー操作に連動したダイナミックな処理を簡単に実装することが出来る。
例えばフッターをターゲット要素に設定した場合、自動で次ページを取得しDOMに追加するといった、オートページャー的処理も簡単に行えちゃうのである。

【jQuery】無の状態から特定のページに値をポストする方法。

例えばフォームタグの設置場所に困ったとき。DOMの文法的に配置するのを躊躇してしまうとき。めんどくさいとき←。

そんなときに超絶便利で素敵なポスト方法。

例えば以下のようなボタンをトリガーにしてポストを行う場合。

<button id="button">submit now</button>

jQuery側では以下のようにしてやる。

$(function(){
	$('#button').click(function(){
		// POSTしたいページを指定
		var post = './';
		var form = $('<form>', {'action':post, 'method':'POST'});
		var input1 = $('<input>', {'type':'hidden', 'name':'n1', 'value':'v1'});
		var input2 = $('<input>', {'type':'hidden', 'name':'n2', 'value':'v2'});
		var input3 = $('<input>', {'type':'hidden', 'name':'n3', 'value':'v3'});
		$('body').append($(form).append(input1).append(input2).append(input3));
		$(form).submit();
	})
})

これは何をしているのか。至って簡単。
その場でフォームを生成→bodyにアペンド→サブミット→完了。
inputタグ内のvalueは適宜jQueryで集めてきてやればよい。そして集めた分だけformタグ内にぶち込んでターゲットページにぶん投げればよいのである。

 

jQuery最強伝説。

 

【jQuery】セレクタにHTMLタグを渡すと、その要素を内部で生成してくれる。

という自分的大発見!

こいつはいったい何を言っているんだ?と言わずにまぁ落ち着いて。

例えば。

$(function(){
	var elem = $('<div>');
	$('body').append(elem);
})

2行目でやってることが、タイトルで言ったまんまの操作。jQueryのセレクタ指定部分にタグを渡している。
すると変数elemには内部的に「<div></div>」を保持していることと同等になる。
なので3行目でbodyに対してappend()を行うと、そのままbodyタグ内に上記のdiv要素がそのまま挿入されることになるのである。これは近年まれに見る世紀の大発見。

しかも第2引数にオブジェクトを渡すことでアトリビュートの設定も出来てしまうという神仕様。

$(function(){
	var elem = $('<div>', {'id':'hoge', 'class':'piyo', 'data-foo':'fuga'});
	$('body').append(elem);
})

例えば上記のようにオブジェクトを渡してやった場合、変数elemは内部的に以下のHTMLを生成してくれている。

<div id="hoge" class="piyo" data-foo="fuga"></div>

素晴らし過ぎるjQuery。これはもうやめられない。止まらない。

かっぱえb(ry

 

【jQuery】クリックしたチェックボックスの状態を調べる。

前もやった気がするけど忘れてるのでメモ。

<input type="checkbox" id="check" name="check" value="1" />

例えば上記のようなチェックボックスをクリックした際、自分自身の状態を取得したい場合は下記のような感じでブーリアンを取得することができる。

$(function(){
	$('#check').click(function(){
		var bool = $(this).prop('checked');
		console.log(bool);
	})
})

[console]
※クリックする度に↓
true
false
true
false
true
false
true

prop()の第1引数に「checked」、第2引数に「true」を渡せばチェックが付き、第2引数に「false」を渡せばチェックをはずすことが出来る。

// チェックが付く
$('#check').prop('checked', true);

// チェックが外れる
$('#check').prop('checked', false);

結構使うからいい加減覚えようね、俺。

 

【jQuery】配下に指定された文字列を含む要素を取り出す方法。

めも。

例えばdiv要素の配下にhogeというテキストが存在している要素を選択したい時。

<div id="piyo">hoge</div>

以下のような記述で要素を指定する事が出来る。

var elem = $('div:contains(hoge)');
var id = $(elem).attr('id');
console.log(id);
↓
piyo

これは相当便利。
てかjQueryマジ便利。

Javascript、setTimeout()のthis問題。

直前の記事でsetTimeout()について触れたので、ついでにメモ。

下記ページより引用。
window.setTimeout – Web API リファレンス | MDN

 

setTimeout() によって実行されるコードは、setTimeout() が呼び出された関数とは別の実行コンテキスト内で実行されます。結果的に、呼び出された関数の this キーワードは window (または global) オブジェクトに設定され、setTimeout が呼び出された関数の this 値と同じにはなりません。この問題は JavaScript リファレンス でより詳細に説明されています。

 

とのこと。

一定間隔で定期実行したい処理などを記述する際、setTimeout()を用いると便利であるが、いつもの感覚でthisを使うと意図しない動作になるので注意されたし。