クリック時に画像を置き換えたい



0   名前: あおい : 2007/07/13(金) 11:11  ID:4b9x4zLd sub-2d
【何をしたいのか】
→ボタンをクッリクした際にスタイルシートで非表示にしている部分を表示・非表示に切り替えて、ボタンも非表示の場合は「開く」に表示の場合は「閉じる」の画像に置き換えたい。

【現在の状況】
→ 表示・非表示に切り替えてはできたのですが、
画像を置き換える指定を挿入すると対応しなくなる。
画像を置き換える指定を挿入しなければ正常に対応できている。


【サンプルの提示】

〔JavaScript部分〕
function setMessege(msg,img){
msgobj=document.getElementById(msg);
stat=msgobj.style.display;
imgobj=document.getElementById(img);

if(stat=="none") //非表示の場合
msgobj.style.display=""; //表示に切り替え
imgobj.src="img/close.gif"; //ボタンを「閉じる」ボタンに切り替え

else  //表示の場合
msgobj.style.display="none"; //非表示に切り替え
imgobj.src="img/open.gif"; //ボタンを「開く」ボタンに切り替え
}

〔html部分〕

<p>
 <a href="#" onclick="setMessege('msg','img1')">
  <img id="img1" src="img/open.gif" />
 </a>
</p>

<div id="msg" style="display:none">
 <p>メッセージ</p>
</div>


以前少しJavaScriptをやっていたのですが2年位ブランクがある為
すっかり仕様を忘れてしまいました。
上記設定でおかしな部分をご指摘頂ければありがたいです。


【何をしてみたのか】
表示非表示のみ対応⇒正常に動作
画像切り替えのみ対応⇒対応しない
上記両方対応⇒どちらも対応しなくなる

【検索用語】
JavaScript 画像切り替え、クリック時画像切り替え

【備考】

1   名前: カヅサツ ◆ThCi95HEzw : 2007/07/13(金) 11:11  [URL]  ID:O5hEMlpW sub-r2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	"http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja" dir="ltr">
<head>
<title></title>
<style type="text/css">
#msgList dt{
	margin: 1em 0em;
}
#msgList dd{
	margin: 0px;
}
#msgList img{
	width: 75px;
	height: 32px;
}
</style>
<script type="text/javascript">
function setMessege(msg,img){
	var msg = document.getElementById(msg);
	if(msg.style.display != "none"){
		msg.style.display = "none";
		img.src = "./img/open.gif";
	}
	else{
		msg.style.display = "inline";
		img.src = "./img/close.gif";
	}
}
</script>
</head>
<body>
<dl id="msgList">
	<dt><img src="./img/open.gif" alt="" onclick="setMessege('msg1',this);"></dt>
	<dd id="msg1">メッセージ1</dd>
	<dt><img src="./img/open.gif" alt="" onclick="setMessege('msg2',this);"></dt>
	<dd id="msg2">メッセージ2</dd>
</dl>
<script type="text/javascript">
// JavaScriptでスタイルシートを操作し、メッセージを非表示にする
// (スタイルシート「だけ」で非表示にすると、スタイルシートは解釈するが JavaScript は無視する
// 環境でメッセージにアクセスできなくなる)
var Msg = document.getElementById("msgList").getElementsByTagName("dd");
for (var i = 0; i < Msg.length ; i++) {
	Msg[i].style.display = "none";
}
</script>
</body>
</html>

2   名前: あおい : 2007/07/13(金) 11:11  ID:4b9x4zLd sub-2d
カヅサツへ
レスポンスありがとうございます☆
無事対応できました!!

3   名前: 志道 : 2007/07/13(金) 11:11  ID:l28qteGe sub-Q5
呼び捨てかい(汗

4   名前: あおい : 2007/07/13(金) 11:11  ID:4b9x4zLd sub-2d
すいませんっ!!敬称を入れるのをすっかり忘れてしまってました(>_<)
カヅサツさん、折角教えて頂いたのに呼び捨てしてしまって申し訳ございませんでした。
志道さん、ご指摘頂いてありがとうございますっ!!

5   名前: あおい : 2007/07/13(金) 11:11  ID:4b9x4zLd sub-2d
上記の投稿した者ですが、
追加確認させて頂きたいのですが、
現在ブラウザcheckを行っているのですが、
WinのOperaだけJavaScriptを実行するとボタンを押してJavaScriptの処理を行った直後
ページを再読み込みし、処理が無効になってしまいます。

WinのIE,Firefox,Netscape,MacのIE,Firefox,safariでは正常に動作します。

何かJavaScriptの設定がおかしいのでしょうか?

設定は以下の通りです。

-----------------------------------------------------------------------
function setMessege(messege,img){
msgobj=document.getElementById(messege);
imgobj=document.getElementById(img);
stat=msgobj.style.display;

//非表示の場合
if(stat=="none"){
msgobj.style.display=""; //表示
imgobj.src="img/btn_close.gif"; //閉じるボタン表示
imgobj.alt="閉じる";
imgobj.title="閉じる";
}

//表示の場合
if(stat!="none"){
msgobj.style.display="none"; //非表示
imgobj.src="img/btn_open.gif"; //開くボタン
imgobj.alt="開く";
imgobj.title="開く";
}

}
---------------------------------------------------------------------------

質問の内容がJavaScriptから若干ずれてしまっているかもしれませんが
ご意見頂けたら幸いです。

6   名前: 匿名 : 2007/07/13(金) 11:11  ID:.ubUL4bV sub-Cz
「Always Reload HTTPS In History」なんてオチとか。ブラウザ依存の問題なら、もう少し環境・設定・実験手順等を詳しく書いた方が良いと思う。



あと、>>1 は >>0 のマズい点も細かく修正してくれたんだから、参考にすべきだと思うんだ。

・関数内で変数を使用するときは var 宣言しる。
・念のため確認しておくけど、style.display=''; という書式はどこから出てきたの?(普通に考えれば display: ; と設定したのと同じことで、CSS エラーだよね? この書式は本当に正しいの?)。

7   名前: カヅサツ ◆ThCi95HEzw : 2007/07/13(金) 11:11  [URL]  ID:O5hEMlpW sub-r2
IE, Opera, Firefox の最新版で動作確認済み
ボタンはスクリプトを無視する環境では、そもそも表示させない方が良いかと思った。
ずいぶんとシンプルになりましたわよ奥様。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	"http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja" dir="ltr">
<head>
<title></title>
<style type="text/css">
div.msgBox{
	background-color: #FCC;
}
</style>
</head>
<body>
<div class="msgBox">
	<p>メッセージ</p>
	<p>メッセージ</p>
	<p>メッセージ</p>
</div>
<div class="msgBox">
	<p>メッセージ</p>
	<p>メッセージ</p>
	<p>メッセージ</p>
</div>
<script type="text/javascript">
// ページ内のすべてのdiv要素
var ob_div = document.getElementsByTagName("div");

// ページ内のすべてのdiv要素1つ1つに処理
for (var i = 0; i < ob_div.length ; i++) {
	// div要素の class属性値に "msgBox" があるもののみ処理
	// 以下、この div要素を「メッセージボックス」と呼称する
	if(ob_div[i].className.match(/msgBox/i)){
		// img要素を作る
		var ob_img = document.createElement('img');
		
		// img要素に属性をつける
		ob_img.src = "./img/open.gif";
		ob_img.alt = "開く";
		ob_img.title = "開く";
		
		//img要素にイベント属性を付ける
		ob_img.onclick = function(){
			// メッセージボックスは親要素(p)の直後の要素
			var msgBox = this.parentNode.nextSibling;
			// ここは見ればわかると思う
			if(this.alt == "開く"){
				msgBox.style.display = "block";
				this.src = "./img/close.gif";
				this.alt = "閉じる";
				this.title = "閉じる";
			}
			else{
				msgBox.style.display = "none";
				this.src = "./img/open.gif";
				this.alt = "開く";
				this.title = "開く";
			}
		}
		// p要素を作る
		var ob_p = document.createElement('p');

		// p要素の中に、先ほどの img要素を入れる
		ob_p.appendChild(ob_img);
		
		// メッセージボックスの直前に、先ほどの p要素を入れる
		ob_div[i].parentNode.insertBefore(ob_p,ob_div[i]);
		
		// メッセージボックスを非表示に
		ob_div[i].style.display = "none";
		
		// 念のために null
		ob_img = null;
		ob_p = null;
	}
}
</script>
</body>
</html>

一覧へ戻る