JavaScriptで表の並び替え

これは大きい順や小さい順に並び替えるのではなく単純に順番を逆にする方法です。

JavaScriptで、大きい順や小さい順に並び替えたいとき(ソート)には
sort関数を使いますが、今回は触れません。

テーブル(表)の順序を逆にする関数

var swap=function(id){
	var elem=document.getElementById(id);
	if(!elem){return;}

	var tr_elems=elem.getElementsByTagName('tr');
	var min=0,max=tr_elems.length-1;

	while(min<max){
		var td_min=tr_elems[min].getElementsByTagName('td');
		var td_max=tr_elems[max].getElementsByTagName('td');
		var tmp1=td_min[0].innerHTML;
		var tmp2=td_min[1].innerHTML;
		td_min[0].innerHTML=td_max[0].innerHTML;
		td_min[1].innerHTML=td_max[1].innerHTML;
		td_max[0].innerHTML=tmp1;
		td_max[1].innerHTML=tmp2;
		min++;
		max--;
	}
}

“JavaScriptで表の並び替え” の続きを読む

年齢計算フォーム

今の年齢を自動計算してくれるスクリプトです。
フォームを作るに当たって、selectタグのinnerHTMLに書き込もうとしたら、FirefoxではうまくいくのにIEでは動きませんでした。それを直すためにDOMを使っています。参考ソースは以下の通りです。

別のサイトで下のような選択フォームを作りました

1月、3月、5月、7月、8月、10月、12月は日付を31日まで選択できますが、
4月、6月、9月、11月は30日まで、2月は年によって28日か29日になります。
(西暦は大正元年にあたる1912年まで対応)

誤入力を防止するため、存在しない日付は表示しません。

たとえば、今年、今月を選択すれば、1日から今日の日付までしか選べません。

昭和64年は1月7日までなので、昭和64年1月を選べば7日まで、平成元年1月を選べば
8日からの表示となります。

元号年から西暦への変換も出来ます。
たとえば平成1年を選択した後に、西暦を押すと1989年と表示されます。

これを実現するのに以下のソースを書いてFirefoxで試したらうまくいきました。
ところが、IE(インターネット エクスプローラー)ではset_select関数が動きません。

Internet ExplorerではselectタグのinnerHTMLへの挿入はサポートしていないそうです。

“年齢計算フォーム” の続きを読む

addEventListenerとattachEvent

addEventListenerattachEvent はオブジェクトにイベントを追加する関数です。

この2つは起動時に、window.onload と併用しても使えます。

window.onload は、複数書くと上書きされて消えてしまうため最後の1個だけが作動しますが、この関数を使うことで起動時の関数を複数動作させられます。

addEventListener

addEventListener は Internet Explorer 以外で使えます。

addEventListener(イベント名, イベント発生時に呼び出す関数, イベントの伝達方向)

イベント名には on がつきません。第3引数は通常は false を指定します。
true にすると、イベントが発生した瞬間、バブリングを待たずにイベントを処理できるようになります。

登録した関数は、登録順に実行されます。

例: window.addEventListener(‘load’, function(){alert();}, false);

attachEvent

attachEvent は Internet Explorer と Opera で使える関数で addEventListener と同等の働きをします。

attachEvent(イベント名, イベント発生時に呼び出す関数)

イベント名には on がつきます。

登録した関数の実行順は不規則です。

例: window.attachEvent(‘onload’, function(){alert();});

Internet Explorer とそれ以外のブラウザの両方に対応させるには

function ev(elem, event, func, useCapture){
	if(elem.addEventListener){
		elem.addEventListener(event, func, useCapture);
	}else if(elem.attachEvent){
		elem.attachEvent('on'+event, func);
	}
}

または

function ev(elem, event, func, useCapture){
	try{
		elem.addEventListener(event, func, useCapture);
	}catch(e){
		elem.attachEvent('on'+event, func);
	}
}

という形で関数を作って、次のように使います。

ev(window, 'load', function(){alert();}, false);

window.addEventListenerwindow.attachEvent は、window.onload と一緒に使うことも出来ます。

その場合は、window.onload の後に、この関数でイベントを追加する形になります。
ですから、呼び出される順番は、window.onload で定義した関数より後になります。

起動時に、window.onload と併用する例

<script type="text/javascript">

window.onload=function(){
	/* 既に window.onload で起動スクリプトが指定されているとする */
}

/* 起動時のアクションを追加 */

function ev(event , func, useCapture){
	if(window.addEventListener){ 
		window.addEventListener(event, func, useCapture);
	}else if(window.attachEvent){ 
		window.attachEvent('on'+event, func);
	}
}

function addAction(){
	/* 起動時に実行したい処理 */
}

/* このように関数を別に定義して、関数名を入れても動作する */
ev('load', addAction, false);

</script>

DOMでIEのstyleタグやscriptタグに書込む法

Internet ExplorerのDOM操作で下のように、styleタグやscriptタグにtextNode
appendChildしようとするとエラーになります。そういう時の対処法です。

var css=document.createElement('style');
css.setAttribute('type','text/css');

var str=document.createTextNode('div.entryInfo{clear:both}'); css.appendChild(str);
var head=document.getElementsByTagName('head'); head[0].appendChild(css);

“DOMでIEのstyleタグやscriptタグに書込む法” の続きを読む