スクロールするメッセージは、視覚に訴える効果があると考えられているのか、しばしば使われます。
スクリプトを実行できる環境なら、メッセージがスクロールして表示されます。
スクリプトを実行できない環境でも、以下に<noscript>要素でマークアップしているメッセージが表示されます。
この機能を実現するスクリプト「PullDownMenu.js」は以下の通りです。
// 初期設定。size=32; mess='いらっしゃいませ。しらぎくさいとへようこそ。'; interval=300;// スクロール文字列の補正。while(mess.length<size) { mess+=' '; }// <form>要素の書出し。document.write('<form action="#"><div>'+ '<input type="text" name="Message" value="'+mess+'" size="'+size+'" />'+ '</div></form>');// スクロール函数の起動。tm=setTimeout("msg()",interval);// スクロール函数。function msg() {// setTimeoutのキャンセル。clearTimeout(tm);// メッセージの入ったフォームを探し出して操作する。i=document.forms.length; while (--i>=0) {// メッセージの入ったフォームか。if (document.forms[i].Message) {// メッセージをスクロールする。str=document.forms[i].Message.value; document.forms[i].Message.value= str.substring(2,str.length)+ str.substring(0,2); break; } }// 再度このスクロール函数を起動させる。tm=setTimeout("msg()",interval); return; }
このスクリプトの流れは、以下のようになります。
スクリプト冒頭の以下の部分が必要な初期設定です。
// 初期設定。size=32; mess='いらっしゃいませ。しらぎくさいとへようこそ。'; interval=300;// スクロール文字列の補正。while(mess.length<size) { mess+=' '; }
// 初期設定。
size=32;
mess='いらっしゃいませ。しらぎくさいとへようこそ。';
interval=300;
sizeはスクローリングメッセージを表示するフォームの横幅を半角文字数で指定します。
messはスクローリングメッセージそのものです。
\」を追加して下さい。intervalはスクロールの間隔を千分の一秒単位で指定します。極端に小さな値だと見て貰えないだけでなく、動作そのものが巧くいかない事があるので最低でも200(=0.2秒)くらいにはしておきましょう。// スクロール文字列の補正。
while(mess.length<size) {
mess+=' ';
}
次のステップで、スクローリングメッセージの長さを補正しています。
mess.lengthで与えられるmessの字数が、sizeで指定したフォームの幅に満たない場合は、後ろに全角空白をつけています。
// <form>要素の書出し。
document.write('<form action="#"><div>'+
'<input type="text" name="Message" value="'+mess+'" size="'+size+'" />'+
'</div></form>');
フォームの<input>要素に、name="Message"属性が与えられています。メッセージ本体はvalue属性で、フォームの幅はsize属性でそれぞれ与えます。
/>」となっていますが、XHTML文書以外の場合は「/」を取り去って下さい。// スクロール函数の起動。
tm=setTimeout("msg()",interval);
setTimeoutで、intervalで指定した時間経過後に初めてスクロール函数が起動されます。
// スクロール函数。function msg() {// setTimeoutのキャンセル。clearTimeout(tm);// メッセージの入ったフォームを探し出して操作する。i=document.forms.length; while (--i>=0) {// メッセージの入ったフォームか。if (document.forms[i].Message) {// メッセージをスクロールする。str=document.forms[i].Message.value; document.forms[i].Message.value= str.substring(2,str.length)+ str.substring(0,2); break; } }// 再度このスクロール函数を起動させる。tm=setTimeout("msg()",interval); return; }
clearTimeout(tm);」でsetTimeoutでの指定をキャンセルします。こうしないと旧いブラウザではクラッシュの原因となるからです。document.forms.length」で「document.forms[]」の要素の個数、すなわちFormオブジェクトの個数を得られます。if (document.forms[i].Message) {」は撰んだFormオブジェクトの下位にMessageオブジェクトがあれば実行されるというものです。スクローリングメッセージを表示している<input>要素には「name="Message"」属性が与えられていました。
name="Message"」属性が与えられている要素があるとそちらを選択して巧くいかない可能性があります。対策としてはname属性の値を文書中で一意的なものにする、すなわち同じname属性値を他の要素では使わないというのが考えられます。document.forms[i].Message」が見つからない可能性もありますが、その場合はこの函数は何もしないだけです。str=document.forms[i].Message.value;
document.forms[i].Message.value= str.substring(2,str.length)+ str.substring(0,2);
break;
具体的には「document.forms[i].Message.value」で<input>要素のvalue属性値(スクローリングメッセージ)を得て、先頭二文字を末尾に移したもの<input>要素のvalue属性値に返す動作をしています。最後に必要な動作が終わったのでもうフォーム探しも不要となり、break文で脱出します。
tm=setTimeout("msg()",interval);」はintervalで指定した時間が経過したら再度この函数を呼出すと言うものです。呼び出された函数が再度自分自身を呼出すように設定する事で、無制限にこの函数が繰返し実行されることになります。Copyright ©平成15年-平成24年 さいたま・しらぎくさいと 版権所有
marguerite.site@gmail.com