WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:ラジオボタンの内容が消えない

0:[投稿] moto [2002/10/16 15:25 ][環境:WIN+IE WIN系+Java]

はじめまして。motoといいます。
ラジオボタンを2種類つくり、選択した結果をTEXTAREAに表示させています。
クリアボタンで、reset処理させているのですが、クリアボタン押下後にラジオボタンを一つ選択すると、二種類目のラジオボタンを選択していないにも関わらず、TEXTAREAに表示されてしまいます。
ソースは下記のように記述しています。
クリアボタンを押す前の状態が、残っているような気がします。。
どなたかわかる方いらっしゃいましたら、教えてください。よろしくお願いいたします。

<HTML>

<br>
<p>
<script type="text/javascript">
 
msgva="";
msgvb="";
msgvc="";
msgvd="";
msgv1="";
msgv2="";
msgv="";
wkmsg="";

   function check(radio) {
    form = radio.form;
    msgvb = radio.value ;
    form.msg1.value =msgva + msgvb + msgvc + msgvd;
    f1=false, f2=false;
}

    function checkb(parts){
    msgvc = "\n" + parts.value ;
    form.msg1.value = msgva + msgvb + msgvc + msgvd;
    f3=false, f4=false,f5=false;
}
    
</script>
</p>
<form name="TestForm" ENCTYPE="text/plain" >
<p>

<br>
<br>
<INPUT TYPE="radio" NAME="hyouka" value="abcde" onClick="check(this)">abcde<br>
<INPUT TYPE="radio" NAME="hyouka" value="fghij" onClick="check(this)">fghij<br>
<br>
<hr width=400 align=left>
<br>
<INPUT TYPE="radio" NAME="hyouka2" value="あいうえお" onClick="checkb(this)">あいうえお <br>
<INPUT TYPE="radio" NAME="hyouka2" value="かきくけこ" onClick="checkb(this)">かきくけこ<br>
<INPUT TYPE="radio" NAME="hyouka2" value="さしすせそ" onClick="checkb(this)">さしすせそ<br>
<br>
<br>
<TEXTAREA "text" NAME="msg1" ROWS="5" COLS="40">
</TEXTAREA>
<br>
<br>
<INPUT TYPE="reset" VALUE="取り消し" onclick="clear()">
</p>
</form>
</html>


1:[回答] _ [2002/10/16 15:56 ]

msgva="";
msgvb="";
msgvc="";
msgvd="";
msgv1="";
msgv2="";
msgv="";
wkmsg="";

これが最初の一回しか実行されてないからです。


2:[回答] Malic [2002/10/16 16:14 ]

変数の値はクリアしていないから残りますね・・・。

resetボタンでは、ラジオボタンやテキストフィールド、セレクトボックス、隠し項目などを、初期状態に戻すだけであって、スクリプト内の変数はクリアしません。

原因は・・ resetボタンのonClickイベントの clear 関数が実装されてないだけかな・・・


3:[質問] moto [2002/10/17 09:35 ]

_様、Malic様、回答ありがとうございます。
resetボタンのonClickイベントの clear 関数は下記のように実装してみたのですが、うまく回っていないみたいです。
どこかおかしいところがあるでしょうか?
たびたびすみませんが、教えてください。
function clear() {    
var i;
 for(i=0;i<document.TestForm.hyouka.length;i++){
     document.TestForm.hyouka[i].checked = false;
    }

    for(i=0;i<document.TestForm.hyouka2.length;i++){
     document.TestForm.hyouka2[i].checked = false;
    }
    msgva="";
    msgvb="";
    msgvc="";
    msgvd="";
    msgv1="";
    msgv2="";
    msgv="";
    wkmsg="";
}


4:[回答] Malic [2002/10/17 13:47 ]

clear という名前が予約語なのかな・・・
関数名変えたら動きました。

ちなみにリセットボタンでラジオボタンのチェックはクリアされるので、ループ部分は不要です。

checkb 関数の次あたりにでも加えてください。

   function radioclear(){
msgva="";
msgvb="";
msgvc="";
msgvd="";
msgv1="";
msgv2="";
msgv="";
wkmsg="";

}
・・・・

<INPUT TYPE="reset" VALUE="取り消し" onClick="radioclear();">


5:[関連] Malic [2002/10/17 15:32 ]

clear 関数は予約語でした。

document.writeln(); 文で記述(表示)した内容をクリアする関数です。


6:[回答] ween [2002/10/17 18:51 ]

>>5
予約語、というか。
イベントハンドラ属性の中のコードって、スコープがちょっと特殊なんですよ。
おおざっぱに言うと:

with (document) {
with (form要素) {
with (input要素) {
// <input onclick="..."> ならこのスコープで実行してるのと同じ
}}}

こんな感じです。だから onclick="clear()" とすると
スコープチェーン上で先に見つかる document.clear() を呼んでしまうんです。
onclick="window.clear()" としてやれば、
function clear() {} で定義した関数を呼ぶことができます。

# Mozilla等ではルート要素までの各祖先要素が
# そのままスコープチェーンに入ってきます。


7:[完了] moto [2002/10/18 09:26 ]

Malicさん、weenさん、ありがとうございました。
clearの名称を変えても、window.clear()にしても
どちらでも、ちゃんと動きました!
感謝です。


8:[完了] Malic [2002/10/18 17:56 ]

>イベントハンドラ属性の中のコードって、スコープがちょっと特殊なんですよ。

特殊ですね、スコープについては初めて知りました。
ありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World