2008年12月27日土曜日

今さらながら入力補完JavaScript(7)

【段取り】
(3)補完候補の選択確認

【詳細】
生成したDIV要素をキーボード/マウスで選択できるようにします。
次に選択された文字列をテキストボックスに入れ込みます。

TAB、ENTERが押された場合、その時に選択されていた値をテキストボックスに入力し、リストを消去します。すんなり行きました(なんだか動きに違和感があるような気もしますが気にしないことにします)。

ディレクトリ構造は変更なしです。
WebContent
- js/prototype.js
- js/my.js
- a.html
- my.css

■my.js
// 外出しです。
var div1 = null;
var cursor_pos = -1;
var element_len = 0;

Event.observe(window, 'load', function(event) {
// イベントを登録します。
var keyevent = 'keydown';
if (window.opera || (navigator.userAgent.indexOf('Gecko') >= 0
&& navigator.userAgent.indexOf('KHTML') == -1)) {
keyevent = 'keypress';
}
Event.observe($('hoge'), keyevent, function(event) {
if(div1) {
if (event.keyCode == Event.KEY_DOWN) {
if ((element_len - 1) > cursor_pos) {
cursor_pos++;
}
var hogeTmp = $('div1'+cursor_pos);
initiateListColors();
hogeTmp.style.backgroundColor = '#00FF00';
}
if (event.keyCode == Event.KEY_UP) {
if (cursor_pos > 0) {
cursor_pos--;
}
var hogeTmp = $('div1'+cursor_pos);
initiateListColors();
hogeTmp.style.backgroundColor = '#00FF00';
}
if (event.keyCode == Event.KEY_TAB
|| event.keyCode == Event.KEY_RETURN) {
var hogeTmp = $('div1'+cursor_pos);
$('hoge').value = hogeTmp.innerHTML;
$('candidate').style.visibility = "hidden";
}
}
});
// onFocus イベントを登録します。
Event.observe($('hoge'), 'focus', function(event) {
if (div1) {
// div1*がnullでなければcandidateをvisibleにします。
$('candidate').style.visibility = "visible";
} else {
// nullの場合はエレメントを作成して<div id="candidate"></div>に
// appendします。
var i;
for (i = 0; i < week.length; i++) {
var tmpId = 'div1'+i;
div1 = new Element('div', {'id' : tmpId });
div1.innerHTML = week[i];
div1.style.backgroundColor = "#FF0000";
div1.style.width = "100px";
$('candidate').appendChild(div1);
Event.observe(tmpId, 'mouseover', function(event) {
this.style.backgroundColor = "#00FF00";
});
Event.observe(tmpId, 'mouseout', function(event) {
this.style.backgroundColor = "#FF0000";
});
Event.observe(tmpId, 'mousedown', function(event) {
$('hoge').value = this.innerHTML;
$('candidate').style.visibility = "hidden";
});
}
element_len = i;
}
});
// onBlur イベントを登録します。
Event.observe('hoge', 'blur', function(event) {
if (div1) {
// div1がnullでない場合はhiddenにします。
$('candidate').style.visibility = "hidden";
// ポジションを初期化します。
cursor_pos = -1;
}
});
});

function initiateListColors() {
// .style.backgroundColor = "#FF0000";
for (k = 0; k < element_len; k++) {
$('div1'+k).style.backgroundColor = "#FF0000";
}
}

■a.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<script type="text/css" src="my.css"></script>
<!-- 変数をmy.jsより先に読み込む必要があります。 -->
<script type="text/javascript">
var week = new Array("日","月","火","水","木","金","土");
</script>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/my.js"></script>
<title>Ajax tutorial - a</title>
</head>
<body>
<input type="text" id="hoge" name="hoge" />
<div id="candidate" />
</body>
</html>

■my.css
<pre>@CHARSET "UTF-8";
/* CSSは表示と関係ありません */
#div1 {
visibility:hidden;
}

.

0 件のコメント: