スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



mirrorMan 正規表現ライブサーチ2

その2は前回のソースです。
with(document.body) onkeydown = handleKeydown;
textboxに入力された値をonkeydownで取得すると、htaではその入力が取れませんでした。
onkeyupだと取れそうですが、onkeyupは押しっぱなしだとダメなので、ワンテンポ遅れたりします。
setTimeout('textbox.valueを参照する処理()',0)すればonkeydownでも大丈夫ですね。

onkeyupイベントは、mirrorManではshiftキーを押していると更新ボタンのアイコンが変わり、location.reload(true)で再起動、押していないと画面更新処理で、マウスクリックでもF5キーでも大丈夫なのですが、shitkeyを離したときに拾う処理で使っています。
で、
function handleKeydown(){
setTimeout('loadItms()',0);
}
そのsetTimeout、待ちを0秒でsetTimeoutするのはなぜかといと、たとえば画面に「loading中...」と表示させてから次の処理をsetTimeoutし、処理の順序を明示的に最後尾に指定することで、htaで非同期処理的に画面を更新されているように見せることができます。
そうでないと、画面に「loading中...」を表示させる処理が次の処理が終わるまでコミットされず、実際には表示されていないように見えしまうことになります。onkeydownで入力されたkeyを確実に拾いたいのも同じ意図だったり。unixではflushで明示的にやったりも。JSエンジン内の詳細な動きを説明することは私にはできないのですが、htaではこういう使い方もできます。

function loadItms(){
createItmsHtML();
}
function createItmsHtML(){
if(document.all.filterLstBox){
rhtStatsbar.innerText ="";
try{
var re = filterLstBox.value ? new RegExp(filterLstBox.value,'i') : /./
}catch(e){
filterLstBox.style.backgroundColor='#d8efff';
return rhtStatsbar.innerText = " "+e.description
}
filterLstBox.style.backgroundColor="";
for(var fc=new Enumerator(erfo.Items()); !fc.atEnd(); fc.moveNext()){
if(re) if(!re.test(itm)) continue;
...
}
}
}
検索入力textboxのfilterLstBoxが表示されていたら、その値をnew RegExp()してreに入れています。その後、ファイルやフォルダのコレクションでhtmlを組み立てるループの中でre.test()しています。

ライブサーチ、マシンパワーにものを言わせる機能です。
Vistaのスタートメニュー内のテキストボックスにも実装されていますが、いつもHDをカリカリさせてインデックスを作成しているのを許す気分になれますか?



スポンサーサイト



comment

Secret

while(aho.atEndofStream)

笹部 政宏
笹部 政宏
mail




フリーソフツ
Category
はてブ
Monthly Archive
New Entry
New Comment
New Trackback
RSS
Copyright © Kittens flewby me All Rights Reserved.

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。