2008年12月アーカイブ

JavaScriptで目次を自動作成

| コメント(0)

JavaScriptで目次を自動作成してしまおうと、考えた。
もちろん、PHPを使ったって良いんだけれど、PHPはローカルでは確認できないので....

あらかじめ、目次項目にしたいものを<h4>タグにしておく。
もちろん、<h3>だって何だっていいんだが、混ぜたらだめである。

もうひとつ、あらかじめ、目次を置きたい場所に
<span id=mokuji></span>
を置いておく。

それからもうひとつ、<body>タグのオプションに
onLoad = "ol();"
を入れておく。
<body bgcolor = "#ffffff" onLoad = "ol();">
といった具合である。

あとは、内部でも外部でもいいから、JavaScriptで次の関数を置いておくだけである。


function ol () {
var mokujilist = document.getElementsByTagName('h4');
//目次の見栄えはご自由に↓
var out = '<div style = "border:#dbf 1px solid;">';
//項目が少ないときは目次を作らない
if (mokujilist.length < 2) {
return;
}
for (var i = 0; i < mokujilist.length; i++) {
var idname = "mokuji" + i;
//h4タグから取得した文字列から改行を削除して、各々の目次を作成する。見栄えはご自由に。
out = out + ((i) ? '- ' : '')
+ '<a href = "#' + idname + '">'
+ mokujilist[i].innerHTML.replace(/\n/g, '')
+ '</a> ';
//h4タグにidを付ける
mokujilist[i].setAttribute ("id", idname);
}
document.getElementById("mokuji").innerHTML = out + '</div>';
}

楽典.comで活用中。

onPropertyChange

ウェブページで、テキストボックスの内容を、もうひとつのテキストボックスに飛ばす、というのは、JavaScriptではお馴染みのパターン。
使うイベントハンドラは、onChange。
ところが、これが、IEで、思ったように動かないことがあることがわかった。
Submitボタンを押せば、飛ぶ。
ところが、Submitボタンを押さずに改行キーを押すと、直前の入力分が、飛ばない。
モジラ系、サファリ系、オペラでは、こういうことはない。

もちろん、普通のページでは、Submitボタンを押しても、改行キーを押しても、ページがすぐリロードしてしまうので、結果は似たようなもの。
でも、よく見ていると、Submitボタンを押したときには一瞬飛んでいるのが確認できるのに対して、改行キーの場合には飛んでいること自体が確認できない。
どういうときに違いが明確になるかというと、たとえば、飛ばし先を、frameを使って別ページにしているような場合。
<input type="text" name="thisBox" onChange="parent.otherPage.document.forms.formID.theBox.value = this.form.thisBox.value;">
なんてときだ。
ページがリロードしても、飛んだ結果は別ページの方に残るから。

入力したあとに、Submitボタンでなくても、どこかをマウスで空打ちするなど、明示的にフォーカスを外せば、正常にonChangeが発生する。
ところが、改行キーを押してしまうと、onChangeが発生しない。
なんとも不思議である。
そういえば、エクセルでも似たようなことがあったなあ、などとは思うが。

解決策はあればあるもので、onPropertyChangeというのを代わりに使えばいいらしい。
つまり、
<input type="text" name="thisBox" onChange="parent.otherPage.document.forms.formID.theBox.value = this.form.thisBox.value;" onPropertyChange="parent.otherPage.document.forms.formID.theBox.value = this.form.thisBox.value;">
のように書き足すだけ。

あまり紹介されていないイベントハンドラだし、どうもIE以外では使えないようなのだが。

onPropertyChangeは、本来は、「プロパティーが変化したとき」だから、色が変わったりしたときに発生するらしいのだが、テキストボックスの中身が変わったときにも発生してくれる。

もっとも、onChangeが、フォーカスが外れたときにはじめてイベントが発生するのに、onPropertyChangeは1字入力するごとに発生する。
なんとも、ぜいたく、お節介すぎるのだが、実用としては、同じように使える。

このアーカイブについて

このページには、2008年12月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年10月です。

次のアーカイブは2009年2月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。