画像を使用したタブメニュー

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



0   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
こちら(http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=1200)を参考にし、
それぞれ違う画像を使ったタブメニューを作成しているのですが、
切り替えができなくて困っています。
又、firefoxでは画像がうまく表示されません。。
どなたかお分かりの方がおりましたら、助けて頂けますでしょうか。
宜しくお願い致します。


HTML
============================================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body onLoad="seltab('box', 'head', 10, 1)">
<div id="tabheader">
<ul onmousedown="changeTabs (event); ">
<li class="head1 open"><a href="javascript:seltab('box', 'head', 10, 1)">内容1</a></li>
<li class="head2 close"><a href="javascript:seltab('box', 'head', 10, 2)">内容2</a></li>
<li class="head3 close"><a href="javascript:seltab('box', 'head', 10, 3)">内容3</a></li>
<li class="head4 close"><a href="javascript:seltab('box', 'head', 10, 4)">内容4</a> </li>
</ul>
</div>
<div class="tabbody">
<div id="box1">内容1</div>
<div id="box2">内容2</div>
<div id="box3">内容3</div>
<div id="box4">内容4</div>
</div>
</body></html>

JAVASCRIPT
============================================================================================
function view(divId,divClass){
var divs=document.getElementsByTagName('div');
for(var i=0;i<divs.length;i++){
if(divs[i].className==divClass){
if(divs[i].id==divId) divs[i].style.display="block";
else divs[i].style.display="none";
}
}
}


// bpref = tab body prefix, hpref = tab header prefix
function seltab(bpref, hpref, id_max, selected) {
if (! document.getElementById) return;
for (i = 0; i <= id_max; i++) {
if (! document.getElementById(bpref + i)) continue;
if (i == selected) {
document.getElementById(bpref + i).style.visibility = "visible";
document.getElementById(bpref + i).style.position = "";
document.getElementById(hpref + i).className = "open";
} else {
document.getElementById(bpref + i).style.visibility = "hidden";
document.getElementById(bpref + i).style.position = "absolute";
document.getElementById(hpref + i).className = "close";
}
}
}


function swapClassName (element, newName, oldName) {
var r = new RegExp ('\\s+(' + oldName + '|' + newName + ')\\s+', 'i').exec (' ' + element.className + ' ');
if (r)
element.className = element.className.replace (r[1], newName);
else
element.className += ' ' + newName;
}


function setTabState (node, open) {
if (node.nodeType == 1 /*Node.ELEMENT_NODE*/)
if (open)
swapClassName (node, 'open', 'close');
else
swapClassName (node, 'close', 'open');
}

function changeTabs (evt) {
var n, t = evt.target || evt.srcElement;

if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
setTabState (t = t.parentNode, true);
for (n = t; n = n.previousSibling; setTabState (n, false));
for (n = t; n = n.nextSibling; setTabState (n, false));
}
}



CSS
============================================================================================
#tabheader li {
float: left;
}
#tabheader {
list-style-image: none;
list-style-type: none;
}

#tabheader li a{
display: block;
}

.head1.close {
background: url(画像.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.head1.open {
background: url(画像.gif) no-repeat 0px 0px;
width: 120px;
height: 34px;
text-indent: -9999px;
display: block;
}

.head2.close {
background: url(画像.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.head2.open {
background: url(画像.gif)no-repeat 0px 0px;
width: 120px;
height: 34px;
text-indent: -9999px;
display: block;
}


.head3.close {
background: url(画像.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.head3.open {
background: url(画像.gif)no-repeat 0px 0px;
width: 120px;
height: 34px;
text-indent: -9999px;
display: block;

}

.head4.close {
background: url(画像.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.head4.open {
background: url(画像.gif)no-repeat 0px 0px;
width: 120px;
height: 34px;
text-indent: -9999px;
display: block;

}

1   名前: 匿名 : 2007/08/26(日) 03:19  ID:1UUOYEkw sub-Cz
Firefox をお持ちなら、「ツール」→「JavaScript コンソール(エラーコンソール)」を開いて下さい。

ページを読み込んだとき、何というエラーが生じていますか。そこに質問に対する原因が全て書かれています。

2   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ご返答ありがとうございます。
お教え頂いた方法でエラーを確認し、
javascriptを修正し、なんとかFirefoxでは、正しく動作しました!

しかし、IEではタブをクリックできず、
選択されていない3つのタブが、全て.head4.close の画像になっています。

修正したjavascriptは以下のとおりです。
宜しくお願いします。

function seltab(bpref, hpref, id_max, selected) {
if (! document.getElementById) return;
for (i = 0; i <= id_max; i++) {
if (! document.getElementById(bpref + i)) continue;
if (i == selected) {
document.getElementById(bpref + i).style.visibility = "visible";
document.getElementById(bpref + i).style.position = "";
} else {
document.getElementById(bpref + i).style.visibility = "hidden";
document.getElementById(bpref + i).style.position = "absolute";
}
}
}


function swapClassName (element, newName, oldName) {
var r = new RegExp ('\\s+(' + oldName + '|' + newName + ')\\s+', 'i').exec (' ' + element.className + ' ');
if (r)
element.className = element.className.replace (r[1], newName);
else
element.className += ' ' + newName;
}


function setTabState (node, open) {
if (node.nodeType == 1 /*Node.ELEMENT_NODE*/)
if (open)
swapClassName (node, 'open', 'close');
else
swapClassName (node, 'close', 'open');
}

function changeTabs (evt) {
var n, t = evt.target || evt.srcElement;

if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
setTabState (t = t.parentNode, true);
for (n = t; n = n.previousSibling; setTabState (n, false));
for (n = t; n = n.nextSibling; setTabState (n, false));
}
}

3   名前: 匿名 : 2007/08/26(日) 03:19  ID:D/mQtTzV sub-Ax
ちゃんとクリックされたときにchangeTabs()関数は実行されてますよ。

(
「クリックできない…」で終わらず、
changeTabs()内にalert()を記述して動いているかどうかくらいは確認しましょうよ。
んで、どこがどう動いているのかを細かくチェックできればもっといいんですけど…。
)

ただ…、
あなたが参考にしたページ(http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi?mode=view&no=1200)
のときとは少々動作が異なってまして、
参考ページでは、
t.nodeName = "A"、t.parentNode.nodeName = "LI" となるので、きちんとif文が真となる。

だけど、今回の場合…
firefoxではきちんと t.nodeName = "A"、t.parentNode.nodeName = "LI" となるんですが
IEでは、t.nodeName = "LI"、t.parentNode.nodeName = "UL" となってました。
当然、if文の中には行かず、そのまま関数が終了しているわけです。

ということで関数の中を改善するか、onmousedownの場所を変えるか…
なりしましょう。


4   名前: 質問 : 2007/08/26(日) 03:19  ID:D/mQtTzV sub-Ax
ごめんなさい。
t.nodeName = "LI"、t.parentNode.nodeName = "UL"
となる理由は、<A>〜</A>で挟まれた文字("内容*")をクリックされたわけじゃないからです。

もし、タブを文字じゃなく画像にしたい場合は、
liの背景画像を指定するんじゃなくて、<A>〜</A>の間に<IMG>を書いたほうがいいんじゃないでしょうか?

5   名前: 匿名 : 2007/08/26(日) 03:19  ID:D/mQtTzV sub-Ax
名前が「質問」になったのは、他ごと考えながら書いてたら無意識に「質問」になってしまいました。
ごめんなさい。質問でもなんでもないです。

6   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ご返答ありがとうございます!
勉強し始めたばかりなので、基礎的なことが分からず申し訳ございません。
t.nodeName = "A"、t.parentNode.nodeName = "LI" となる点、かなりヒントになりました。

質問する場所が間違っていたみたいですが
javascriptではなく、CSSの方に問題があったみたいです。

#tabheader li a{
display: block;
}
の部分にリンクできるように高さを指定したら、liの背景画像でも動作しました。

ただ、IEでは、開いているタグの背景画像が.head1.open 、開いていない背景画像が、
なぜか全て.head4.closeの画像になってしまいます。
参考にしたレスに載っていた(http://www.ana.co.jp/asw/index.jsp)のように
全て違う画像にしたいと思っています。
Firefoxでは正常に表示されています。

こちらもCSSによる不具合かもしれないので、もう一度よく確認してみます。

本当に参考になり助かりました!
ありがとうございます。

7   名前: 匿名 : 2007/08/26(日) 03:19  ID:aWTXdH5n sub-Cz
と言うか、Firefox でもたまに問題出るでしょ。href="javascript:.." のせいで。率直に言うが、今どき href="javascript:.." なんて書いてあるサンプルは捨てて構いません

改造のヒントとか書こうしたけど、書き直した方が速かった。せっかく id を振ってんだから、フラグメント識別子を使えば良いじゃない。HTML 側に複雑な関数を埋め込む必要なんて全くない。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>TEST</title>
<style type="text/css">

/* メニュー項目全体 */
#menu li { display: inline; }

/* それぞれのメニュー項目 */
.menu-item1 { background: blue; }
.menu-item1.active  { background: red; }

.menu-item2 { background: blue; }
.menu-item2.active  { background: red; }

.menu-item3 { background: blue; }
.menu-item3.active  { background: red; }

.menu-item4 { background: blue; }
.menu-item4.active  { background: red; }

</style>

<ul id="menu">
  <li class="menu-item1"><a href="#content1">内容 1</a></li>
  <li class="menu-item2"><a href="#content2">内容 2</a></li>
  <li class="menu-item3"><a href="#content3">内容 3</a></li>
  <li class="menu-item4"><a href="#content4">内容 4</a></li>
</ul>

<div id="content1"><h2>内容 1</h2></div>
<div id="content2"><h2>内容 2</h2></div>
<div id="content3"><h2>内容 3</h2></div>
<div id="content4"><h2>内容 4</h2></div>


<script type="text/javascript">

/*@cc_on@*/
if (/*@if (@_jscript) @_jscript_version > 5.5 && @end@*/
    document.implementation &&
    document.implementation.hasFeature ('HTML', '1.0'))
(function () {

function TabbedView (evt) {
    arguments.callee.prototype.handleEvent (evt);
    return arguments.callee;
}

TabbedView.initializeById = function (id) {
    var node = document.getElementById (id);
    if (node) {
        node./*@if (@_jscript) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/ 'click', this, false);
        node = node.getElementsByTagName ('a')[0];
        if (node) {
/*@if (@_jscript)
            var evt = document.createEventObject ();
            node.fireEvent ('onclick', evt);
  @else@*/
            var evt = document.createEvent ('MouseEvents');
            evt.initEvent ('click', true, true);
            node.dispatchEvent (evt);
/*@end@*/
        }
    }
}

TabbedView.prototype = {
    uriExpression : /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,
    
    handleEvent : function (evt) {
/*@if (@_jscript)
        var t = evt.srcElement;
        evt.returnValue = false;
  @else@*/
        var t = evt.target;
        evt.preventDefault ();
/*@end@*/
        
        if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
            var div = document.getElementById (this.uriExpression.exec (t.href)[9]);
            if (div) div.style.display = 'block';
            this.setClassName (t.parentNode, true);
            this.deactivate (t.parentNode, 'previousSibling');
            this.deactivate (t.parentNode, 'nextSibling');
        }
    },
    
    deactivate : function (node, siblingName) {
        var div, m, n;
        for (m = node; m = m[siblingName]; this.setClassName (m, false)) {
            for (n = m.firstChild; n; n = n.nextSibling) {
                if (n.nodeName == 'A') {
                    div = document.getElementById (this.uriExpression.exec (n.href)[9]);
                    if (div) div.style.display = 'none';
                    break;
                }
            }
        }
    },
    
    setClassName : function (node, active) {
        if (node.nodeType == 1 /*Node.ELEMENT_NODE*/) {
            var className = ' ' + node.className + ' ';
            
            if (active) {
                if (className.indexOf ('active') == -1) {
                    node.className += ' active';
                }
            } else {
                node.className = className.replace (/\s*active\s*/i, '');
            }
        }
    }
};

// タブ化したいメニューの id を指定。複数指定可。
TabbedView.initializeById ('menu');

} )();
</script>

head 要素から呼び出したければ適当に load イベントにでも組み込んで下さい。テストはほとんどしてないので保証はしません。

8   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ソースありがとうございます!
href="javascript:.."使わない方がいいんですね。。

お教え頂いた方法でやってみたのですが、
うまく切り替えができませんでした。。

アクセスするとcontentが全て開かれた状態でタブをクリックすると
同ページ内のクリックしたcontentにスクロールして移動してしまいます。

せっかく教えて頂いたのに
色々と試してみましたが、
どうしてもうまくいきません。。
もう少し説明して頂けたら助かります。
宜しくお願い致します。





9   名前: 匿名 : 2007/08/26(日) 03:19  ID:aWTXdH5n sub-Cz
だから、自分が何をしたのかをきちんと書こうよ。>>7 をそのままコピペして試したのなら、

> アクセスするとcontentが全て開かれた状態で

にはならないと思うんだ。また、もしそういう状態になるならエラーが出ているはずなんだ。エラーの確認方法は >>1 に書いた。で、おそらく script 要素を head 要素内にそのまま貼り付けたんじゃないかと推測するのだけど,その場合は

>>7
> head 要素から呼び出したければ適当に load イベントにでも組み込んで下さい

と書いた。やり方が分からないなら説明するけど、どう書いているのかどうかも現時点では分からないし。


なお、>>7 微妙に訂正。setClassName() 内。動作に支障はないが軽いバグ。
if (className.indexOf ('active') == -1) {
↓
if (className.indexOf (' active ') == -1) {

10   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ご返信ありがとうございます。
すみません!scriptを外部から呼び出していました。
同じ方法でもう一度チャレンジし以下の方法で、正常に動作し、エラーはでませんでした。

只、CSSの問題なのかもしれないですが、
やはりIEでは、開いたタブが全てimage4.gifの画像になってしまいます。

又、スクリプトを外部から読み込ませることは可能でしょうか?
宜しくお願い致します。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>無題ドキュメント</title>
<link href="test.css" rel="stylesheet" type="text/css">

</head>

<body>

<ul id="menu">
<li class="menu-item1"><a href="#content1">内容 1</a></li>
<li class="menu-item2"><a href="#content2">内容 2</a></li>
<li class="menu-item3"><a href="#content3">内容 3</a></li>
<li class="menu-item4"><a href="#content4">内容 4</a></li>
</ul>


<div id="content1"><h2>内容 1</h2>
</div>
<div id="content2"><h2>内容 2</h2>
</div>
<div id="content3"><h2>内容 3</h2>
</div>
<div id="content4"><h2>内容 4</h2></div>

<script type="text/javascript">

/*@cc_on@*/
if (/*@if (@_jscript) @_jscript_version > 5.5 && @end@*/
document.implementation &&
document.implementation.hasFeature ('HTML', '1.0'))
(function () {

function TabbedView (evt) {
arguments.callee.prototype.handleEvent (evt);
return arguments.callee;
}

TabbedView.initializeById = function (id) {
var node = document.getElementById (id);
if (node) {
node./*@if (@_jscript) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/ 'click', this, false);
node = node.getElementsByTagName ('a')[0];
if (node) {
/*@if (@_jscript)
var evt = document.createEventObject ();
node.fireEvent ('onclick', evt);
@else@*/
var evt = document.createEvent ('MouseEvents');
evt.initEvent ('click', true, true);
node.dispatchEvent (evt);
/*@end@*/
}
}
}

TabbedView.prototype = {
uriExpression : /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,

handleEvent : function (evt) {
/*@if (@_jscript)
var t = evt.srcElement;
evt.returnValue = false;
@else@*/
var t = evt.target;
evt.preventDefault ();
/*@end@*/

if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
var div = document.getElementById (this.uriExpression.exec (t.href)[9]);
if (div) div.style.display = 'block';
this.setClassName (t.parentNode, true);
this.deactivate (t.parentNode, 'previousSibling');
this.deactivate (t.parentNode, 'nextSibling');
}
},

deactivate : function (node, siblingName) {
var div, m, n;
for (m = node; m = m[siblingName]; this.setClassName (m, false)) {
for (n = m.firstChild; n; n = n.nextSibling) {
if (n.nodeName == 'A') {
div = document.getElementById (this.uriExpression.exec (n.href)[9]);
if (div) div.style.display = 'none';
break;
}
}
}
},

setClassName : function (node, active) {
if (node.nodeType == 1 /*Node.ELEMENT_NODE*/) {
var className = ' ' + node.className + ' ';

if (active) {
if (className.indexOf (' active ') == -1) {
node.className += ' active';
}
} else {
node.className = className.replace (/\s*active\s*/i, '');
}
}
}
};

// タブ化したいメニューの id を指定。複数指定可。
TabbedView.initializeById ('menu');

} )();
</script>


</body>
</html>

===========================================================================================
CSS
===========================================================================================
#menu li {
float: left;
display: inline; }

#menu li a{
height: 30px;
margin-right: 3px;
display: block;

}

.menu-item1 {
background-image: url(image1.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 20px;
text-indent: -9999px;
}

.menu-item1.active {
background-image: url(image2.gif) no-repeat 0px 0px;
display: block;
width: 100px;
height: 30px;
text-indent: -9999px;
}

.menu-item2 {
background: url(image3.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.menu-item2.active {
background-image: url(image4.gif) no-repeat 0px 0px;
display: block;
width: 100px;
height: 30px;
text-indent: -9999px;
}


.menu-item3{
background: url(image5.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.menu-item3.active {
background-image: url(image6.gif) no-repeat 0px 0px;
display: block;
width: 100px;
height: 30px;
text-indent: -9999px;

}

.menu-item4{
background: url(image7.gif) no-repeat 0px 0px;
display: block;
width: 80px;
height: 30px;
text-indent: -9999px;
}

.menu-item4.active {
background-image: url(image8.gif) no-repeat 0px 0px;
display: block;
width: 100px;
height: 30px;
text-indent: -9999px;


}

11   名前: 匿名 : 2007/08/26(日) 03:19  ID:aWTXdH5n sub-Cz
たびたび注意で申し訳ないんだけど、>>7 と全く同じものを再掲するのは無駄なわけで(訂正は反映してくれたようですが)。必要な部分を必要なだけ抜粋するようにして下さい。

で、確かに IE6 だと
.menu-item1.active
.menu-item2.active
の後ろの部分しか見ないから、上書きされてしまいますね。誰だこんな方法書いたのは。俺だよ。ごめんなさい。
<li class="menu-item1"><a class="active">内容 1</a></li>

別手段として a 要素にクラスを与えるようにしました。これだとスタイル指定がややこしくなるんだが、まあ IE のせいなので頑張って下さい。MacIE5 は弾いた方が無難だと思います。スクリプト非動作時でも、内容自体は問題なく読めます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>TEST</title>
<style type="text/css">

/* メニュー項目全体 */
#menu {
  list-style: none;
}

#menu li {
  float: left;  /* based on CSS 2.1 */
}

#menu li a {
  border: 1px solid #999;
  display: block;
  width: 80px;
  height: 20px;
}

#menu li a.active {
  width: 100px;
  height: 30px;
}

div {
  clear: left;
}

/* それぞれのメニュー項目 */
.menu-item1 a        { background: #a00; }
.menu-item1 a.active { background: #f00; }

.menu-item2 a        { background: #aa0; }
.menu-item2 a.active { background: #ff0; }

.menu-item3 a        { background: #a0a; }
.menu-item3 a.active { background: #f0f; }

.menu-item4 a        { background: #aaa; }
.menu-item4 a.active { background: #eee; }

</style>
<script type="text/javascript">

if (/*@cc_on @if (@_jscript) @_jscript_version > 5.5 && @end@*/
    document.implementation &&
    document.implementation.hasFeature ('HTML', '1.0'))

/*@if (@_jscript) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/ 'load', function () {
/************************************************************************/

function TabbedView (evt) {
    arguments.callee.prototype.handleEvent (evt);
    return arguments.callee;
}

TabbedView.initializeById = function (id) {
    var node = document.getElementById (id);
    if (node) {
        node./*@if (@_jscript) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/ 'click', this, false);
        node = node.getElementsByTagName ('a')[0];
        if (node) {
/*@if (@_jscript)
            var evt = document.createEventObject ();
            node.fireEvent ('onclick', evt);
  @else@*/
            var evt = document.createEvent ('MouseEvents');
            evt.initEvent ('click', true, true);
            node.dispatchEvent (evt);
/*@end@*/
        }
    }
};

TabbedView.prototype = {
    uriExpression : /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,
    
    handleEvent : function (evt) {
/*@if (@_jscript)
        var t = evt.srcElement;
        evt.returnValue = false;
  @else@*/
        var t = evt.target;
        evt.preventDefault ();
/*@end@*/
        
        if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
            var div = document.getElementById (this.uriExpression.exec (t.href)[9]);
            if (div) div.style.display = 'block';
            this.setClassName (t, true);
            this.deactivate (t.parentNode, 'previousSibling');
            this.deactivate (t.parentNode, 'nextSibling');
        }
    },
    
    deactivate : function (node, siblingName) {
        var div, m, n;
        for (m = node; m = m[siblingName]; ) {
            for (n = m.firstChild; n; n = n.nextSibling) {
                if (n.nodeName == 'A') {
                    this.setClassName (n, false);
                    div = document.getElementById (this.uriExpression.exec (n.href)[9]);
                    if (div) div.style.display = 'none';
                    break;
                }
            }
        }
    },
    
    setClassName : function (node, active) {
        if (node.nodeType == 1 /*Node.ELEMENT_NODE*/) {
            var className = ' ' + node.className + ' ';
            if (active) {
                if (className.indexOf (' active ') == -1) {
                    node.className += ' active';
                }
            } else {
                node.className = className.replace (/\s*active\s*/i, '');
            }
        }
    }
};

TabbedView.initializeById ('menu');

/************************************************************************/
}, false);

</script>

<ul id="menu">
  <li class="menu-item1"><a href="#content1">内容 1</a></li>
  <li class="menu-item2"><a href="#content2">内容 2</a></li>
  <li class="menu-item3"><a href="#content3">内容 3</a></li>
  <li class="menu-item4"><a href="#content4">内容 4</a></li>
</ul>

<div id="content1"><h2>内容 1</h2></div>
<div id="content2"><h2>内容 2</h2></div>
<div id="content3"><h2>内容 3</h2></div>
<div id="content4"><h2>内容 4</h2></div>

12   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ご返信ありがとうございます。
完璧です!
イメージしてたものが出来上がりました!

色々な注意もして頂き大変勉強になりました。
心から感謝します!
本当にありがとうございました!

13   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
すみません。。また一つわからない事がでてきたのでご質問させてください。

タブの切り替えはきちんと動作したのですが、
はじめの初期設定で、content1が開かれるようになっているので、
別のタブを開いている時にリロードするとcontent1に戻ってしまいます。

タブにそれぞれフォームを設置しているのですが、
javascriptの選択によって、二つ目のセレクトメニューを変更したいと思っています。

二つ目を選択した際に一度リロードされてしまうので、又content1に戻ってしまい困っています。

方法がわからないのでご質問させて頂きました。
宜しくお願い致します。


14   名前: 匿名 : 2007/08/26(日) 03:19  ID:efB2AAwq sub-Cz
異なる質問は新規にスレッドを立ててくれと以前も言われてませんでしたっけ。


> タブにそれぞれフォームを設置しているのですが、
> javascriptの選択によって、二つ目のセレクトメニューを変更したいと思っています。

リロードしないようにセレクトメニューを改造して下さい。と言うか、たかだかセレクトメニューを変更するだけで、リロードが発生する状況というのがよく分かりません。

まあ、>>11 で preventDefault() しなければ、タブ切替後の URI にフラグメント識別子(#)が付きますので、リロード時にその情報からタブ状態を復元することは容易です(そう改造しやすいよう、フラグメント識別子を使うようにしていたわけで)。が、問題の本質はそこではないような気がします。

15   名前: ミサ : 2007/08/26(日) 03:19  ID:HXQHol1i sub-Ds
ご返信ありがとうございます。

>異なる質問は新規にスレッドを立ててくれと以前も言われてませんでしたっけ。
すみません。。こちらで質問させて頂き解決したと思ったのですが、
問題があったので、続きという感覚で書込みしてしまいました。。
今後気をつけたいと思います。
ご指摘ありがとうございました。


16   名前: 匿名 : 2007/08/26(日) 03:19  ID:jSN2cGgY sub-Cz
念のため。タブ状態を復元するには >>11 の以下の箇所を修正。
TabbedView.initializeById = function (id) {
    var node = document.getElementById (id);
    if (node) {
        node./*@if (@_jscript) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/ 'click', this, false);
        var nodes = node.getElementsByTagName ('a'), i = 0, I = nodes.length;
        if (location.hash) {
            for (; i < I; i++) if (nodes[i].href == location) break;
        }
        if (node = nodes[i]) {
/*@if (@_jscript)
            var evt = document.createEventObject ();
            node.fireEvent ('onclick', evt);
  @else@*/
            var evt = document.createEvent ('MouseEvents');
            evt.initEvent ('click', true, true);
            node.dispatchEvent (evt);
/*@end@*/
        }
    }
};

TabbedView.prototype = {
......
    
    handleEvent : function (evt) {
/*@if (@_jscript)
        var t = evt.srcElement;
        // evt.returnValue = false;  // この行を削除
  @else@*/
        var t = evt.target;
        // evt.preventDefault ();  // この行を削除
/*@end@*/
        
        if (t.nodeName == 'A' && t.parentNode.nodeName == 'LI') {
            var div = document.getElementById (this.uriExpression.exec (t.href)[9]);
            if (div) div.style.display = 'block';
            this.setClassName (t, true);
            this.deactivate (t.parentNode, 'previousSibling');
            this.deactivate (t.parentNode, 'nextSibling');
        }
    },
    
......
};

一覧へ戻る