<li>の数字を(1),(2)…にしたい

[新着] Webテンプレートを仮オープンしました



0   名前: yamaV1.02β : 2006/05/18(木) 21:07
お世話になります。
http://www.tagindex.com/cgi-lib/q2bbs/patio.cgi?mode=view&no=248
↑このスレッドが気になって
書いてみたところOLが2つあった時
1)
2)
3)

1)
2)
3)
としたいところが、書き方を思いつかず
1)
2)
3)

4)
5)
6)
となってしまいます。

また、スクリプトオフの時に
通常のOLの表示にしたいので、
ヘッダーでスタイルの指定してみるのですが、
期待通りの表示になりません。

どう書いたらよいのでしょうか。

<SCRIPT type="text/javascript">
<!--
window.onload = function()
{
if(!document.getElementsByTagName)return;
var oOl = document.getElementsByTagName('ol');
var oLi = document.getElementsByTagName('li');
for(var i = 0; i < oLi.length ;i++)
{
oLi[i].firstChild.nodeValue= "(" + ( i + 1 ) + ") " + oLi[i].firstChild.nodeValue;
}
oOl.style.list-style-type="none";
}
-->
</SCRIPT>
<style type="text/css">
ol{list-style-type:decimal;}
</style>

<BODY>
<ol>
<LI>sample
<LI>sample
<LI>sample
</OL>
<OL>
<LI>sample
<LI>sample
<LI>sample
</OL>

よろしくおねがいいたします<(_ _)>

1   名前: PUREST : 2006/05/18(木) 21:07
とりあえず動くサンプル。
細かいところは要検討。

<script type="text/javascript">
<!--
window.onload = function()
{
if(!document.getElementsByTagName)return;
var oOl = document.getElementsByTagName('ol');
//var oLi = document.getElementsByTagName('li');
for(var j = 0 ; j < oOl.length ;j++){
for(var i = 0 ; i < oOl[j].childNodes.length ;i++)
{
if(oOl[j].childNodes.item(i).firstChild){
var k = 0;
if(document.all && !window.opera) k = 1;
oOl[j].childNodes.item(i).firstChild.nodeValue= "(" + (i + k) + ") " + oOl[j].childNodes.item(i).firstChild.nodeValue;
}
}
}
for(i = 0 ; i < oOl.length ; i++){
oOl[i].style.listStyleType="none";
}
}
//-->
</script>
<style type="text/css">
ol{list-style-type:decimal;}
</style>

<BODY>
<ol>
<LI>sample
<LI>sample
<LI>sample
</OL>
<OL>
<LI>sample
<LI>sample
<LI>sample
</OL>

2   名前: yamaV1.02β : 2006/05/18(木) 21:07
(^o^)おお!。oOl[j]この書き方がわかりませんでした。
PUREST さん、ありがとうございました。

自分なりに微調整してみました。


<script type="text/javascript">
<!--
window.onload = function()
{
if(!document.getElementsByTagName)return;
var oOl = document.getElementsByTagName('ol');
for(var j = 0 ; j < oOl.length ;j++){
for(var i = 0 ; i < oOl[j].childNodes.length ;i++)
{
if(oOl[j].childNodes.item(i).firstChild){
var k = 0;
if(document.all && !window.opera) k = 1;
oOl[j].childNodes.item(i).firstChild.nodeValue= "(" + (i + k) + ") " + oOl[j].childNodes.item(i).firstChild.nodeValue;
}
}
}
for(i = 0 ; i < oOl.length ; i++){
with(oOl[i].style){
listStyleType="none";
position="relative";
left="-1.5em";
}
}
}
//-->
</script>
<style type="text/css">
ol{list-style-type:decimal;}
</style>

<BODY>
<ol>
<LI>sample
<LI>sample
<LI>sample
</OL>
<OL>
<LI>sample
<LI>sample
<LI>sample
</OL>

JSは「極めて習得の容易な言語」と書かれていたりするのを
どこでとなく見かけた事がありますが、
かじりはじめて2年以上になる筈ですが、どうも
正体がよくわかりません。

例えばここ↓
>if(document.all && !window.opera) k = 1;

>// IE4以上
とコメントふってあるサイトを見つけましたが、
なんの事やらさっぱりわかりません。

>document.all
これ、よく見かけるフレーズですが、
意味がわかっていません。
「文章の全て 且つ ウィンドウ.オペラでない」
ってどう理解したらよいのでしょうか???

これが理解できたらかなりスッキリできるのです。
解説お願いいたします<(_ _)>


3   名前: PUREST : 2006/05/18(木) 21:07
とりあえず動くこと優先でよく考えずに書いたので…
下記の部分はループの外に出した方がいいですね。

var k = 0;
if(document.all && !window.opera) k = 1;

IEとMozilla,Netscape,Operaでノードの取り扱いが異なるので、ブラウザ判別しています。
IEは空白や改行をノードとして扱いませんが、他のブラウザではノードとしてカウントしますので、IEだけインデックス番号(i)に1を加えているのです。

document.allはIE独自拡張のDOM用オブジェクトで、Operaも対応しています。
if(document.all)だけだとIEだけでなく、Operaもtrueになるので、!window.operaとしてOperaをはじいています。

4   名前: yamaV1.02β : 2006/05/18(木) 21:07
PUREST さん、解説ありがとうございました。

>document.allはIE独自拡張
とはちっとも知りませんでした。

たまに顔出すかもしれませんが、
今後ともよろしくお願いいたします<(_ _)>

[解決済み!]

5   名前: ネス家deチャチャチャ : 2006/05/18(木) 21:07
こんなに長いスクリプト書かなくてもHTMLで一発では?

6   名前: カヅサツ ◆ThCi95HEzw : 2006/05/18(木) 21:07  [URL]  ID:O5hEMlpW
> HTMLで一発では?

どうやってやるのですか?

7   名前: Pid ◆byEkK9OALr : 2006/05/18(木) 21:07
大して簡単にはなりませんが,空白類ノードを考えたくなければこんなのでも。

if (document.implementation
    && document.implementation.hasFeature ('HTML', '2.0')
    && document.implementation.hasFeature ('Events', '2.0')
    && document.implementation.hasFeature ('XPath', '3.0'))

/*document.*/ addEventListener ('load', function () {
    
    var resolver = document.createNSResolver (document.documentElement);
    var type = XPathResult.ORDERED_NODE_ITERATOR_TYPE;
    
    var lists = document.evaluate ('//ol', document.body, resolver, type, null);
    var list;
    
    while (list = lists.iterateNext ()) {
        var texts = document.evaluate ('li/text()', list, resolver, type, null);
        var text, i = 1;
        
        while (text = texts.iterateNext ())
            text.insertData (0, '(' + i++ + ') ');
    }

}, false);


一覧へ戻る