18526


下記のソースコードは、『APPEAR/KILL』ボタンで、"KILL(切る)"を押すことで、  
それぞれのセレクトボックスの、選択状態、色（選択状態によって変えています）、及びそれらに連動させているメッセージの設定（蛇の描画に使います）を初期の状態になるように試みたものです。  
選択状態と色は初期の状態に出来ました。

しかし、『メッセージボタン』だけは、function moglo(){}のif式内に  
`document.getElementById('iemsg' + i).innerHTML=null;`  
などを入れても、メッセージの設定が初期の状態に戻らないのです。  
何らかの記述を加えなければならないようですが、組み立てがうまくいきません。  
ご教示をお願いします。

それと『カラーボタン』は、ボタンそのものに色が付けられますが、『メーセージ  
ボタン』と『サイズボタン』は、"value"に違う値があるためにボタンに色が付け  
られません。どうすればいいでしょうか。

[code]

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=shift_jis"> 
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <meta http-equiv="Content-Style-Type" content="text/css">
    
    <TITLE>メッセージ・サイズ・カラーのボタンと初期の状態- JavaScript</TITLE> 
    
    <STYLE type="text/css"> 
    <!--
    body{
    color:gold;
    background-color:black;
    }
    .butt{
        BACKGROUND:maroon; COLOR:gold;
    }
    
    #myText {
    color: white;
    font-style: italic;
    font-weight: bold;
    font-family: 'comic sans ms', verdana, arial;
    VISIBILITY:HIDDEN;
    position: absolute;top: 0;left: 0;z-index: 3000;cursor: default;}
    #myText div {position: relative;}
    #myText div div {position: absolute;top: 0;left: 0;text-align: center;}
    //
    //-->
    </STYLE>
    
    <SCRIPT type="text/javascript">
    <!--
    var size = 30;
    function siz(opt){
    document.getElementById('myText').style.fontSize=opt.options[opt.selectedIndex].value;
    }
    
    function message(opt)
    {
        var currentLength = msg.length;
        var t = opt.options[opt.selectedIndex].value;
    
        // 状態の変更
        msg = t.split('');
        n = msg.length - 1;
    
        // 文字要素の変更
        for (var i = Math.max(currentLength, msg.length) - 1; i > -1; --i)
        {
            var d = i < currentLength ? document.getElementById('iemsg' + i) : null;
            if (d)
            {
                if (i < t.length)
                {
                    // 既存要素の内容変更
                    d.innerHTML = msg[i];
                }
                else
                {
                    // 不要になった要素の削除
                    d.parentElement.removeChild(d);
                }
            }
            else
            {
                // 不足要素の追加
                d = document.createElement('div');
                d.id = 'iemsg' + i;
                d.style.height = d.style.width = a + 'px';
                d.appendChild(document.createTextNode(msg[i]));
                oi.appendChild(d); y[i] = x[i] = Y[i] = X[i] = 0;
            }
        }
    }
    
    
    var msg = "２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇☆★☆★。。。。";
    var circleY = 0.75; 
    var circleX = 2;
    var letter_spacing = 5;
    var diameter = 10;
    var rotation = 0.4;
    var speed = 0.3;
    
    if (!window.addEventListener
        && !window.attachEvent
        || !document.createElement)
        throw 'error';
    
    msg = msg.split('');
    var n = msg.length - 1, a = Math.round(size * diameter * 0.208333), currStep = 20,
    ymouse = a * circleY + 20, xmouse = a * circleX + 20, y = [], x = [], Y = [], X = [],
    o = document.createElement('div'), oi = document.createElement('div'),
    b = document.compatMode && document.compatMode != "BackCompat"? document.documentElement : document.body,
    
    mouse = function(e){
     e = e || window.event;
     ymouse = !isNaN(e.pageY)? e.pageY : e.clientY; 
     xmouse = !isNaN(e.pageX)? e.pageX : e.clientX; 
    },
    
    makecircle = function(){
     if(init.nopy){
      o.style.top = (b || document.body).scrollTop + 'px';
      o.style.left = (b || document.body).scrollLeft + 'px';
     };
     currStep -= rotation;
     for (var d, i = n; i > -1; --i){
      d = document.getElementById('iemsg' + i).style;
      d.top = Math.round(y[i] + a * Math.sin((currStep + i) / letter_spacing) * circleY - 15) + 'px';
      d.left = Math.round(x[i] + a * Math.cos((currStep + i) / letter_spacing) * circleX) + 'px';
     };
    },
    
    drag = function(){
     y[0] = Y[0] += (ymouse - Y[0]) * speed;
     x[0] = X[0] += (xmouse - 20 - X[0]) * speed;
     for (var i = n; i > 0; --i){
      y[i] = Y[i] += (y[i-1] - Y[i]) * speed;
      x[i] = X[i] += (x[i-1] - X[i]) * speed;
     };
     makecircle();
    },
    
    init = function(){
     if(!isNaN(window.pageYOffset)){
      ymouse += window.pageYOffset;
      xmouse += window.pageXOffset;
     } else init.nopy = true;
     for (var d, i = n; i > -1; --i){
      d = document.createElement('div'); d.id = 'iemsg' + i;
      d.style.height = d.style.width = a + 'px';
      d.appendChild(document.createTextNode(msg[i]));
      oi.appendChild(d); y[i] = x[i] = Y[i] = X[i] = 0;
     };
     o.appendChild(oi); document.body.appendChild(o);
     setInterval(drag, 25);
    },
    
    ascroll = function(){
     ymouse += window.pageYOffset;
     xmouse += window.pageXOffset;
     window.removeEventListener('scroll', ascroll, false);
    };
    
    o.id = 'myText'; o.style.fontSize = size + 'px';
    
    if (window.addEventListener){
     window.addEventListener('load', init, false);
     document.addEventListener('mouseover', mouse, false);
     document.addEventListener('mousemove', mouse, false);
      if (/Apple/.test(navigator.vendor))
       window.addEventListener('scroll', ascroll, false);
    }
    else if (window.attachEvent){
     window.attachEvent('onload', init);
     document.attachEvent('onmousemove', mouse);
    };
    
    num = 1;
    function mogglo(){
     num ^= 1; 
     if(num == 1){ 
    document.getElementById('myText').style.fontSize=30;
    document.getElementById('myText').style.color="white";
    document.getElementById('myText').style.visibility="hidden"; 
    document.getElementById('size').selectedIndex=1;
    document.getElementById('size').disabled=true;
    document.getElementById('mess').disabled=true;
    document.getElementById('mess').selectedIndex=0;
    document.getElementById('sCol').style.background="";
    document.getElementById('sCol').disabled=true;
    
    }
    else { 
    document.getElementById('myText').style.visibility="visible";
    document.getElementById('size').disabled=false;
    document.getElementById('mess').disabled=false;
    document.getElementById('sCol').disabled=false;
    }
    document.getElementById("togglo").value = num ?"  APPEAR  ":"KILL(切る)";
    }
    // -->
    </SCRIPT>
    
    <script type="text/javascript">
    <!--
    function hebi(opt){
    　d=document.getElementById('myText').style.color=opt.options[opt.selectedIndex].value;
      document.getElementById("sCol").style.background=opt.options[opt.selectedIndex].value;
    }
    //-->
    </script>
    </HEAD> 
    
    <BODY>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <br><br>
    <div style="text-align:center">
    <input class="butt" type="button" id="togglo" value="APPEAR" onclick="mogglo()">
    </div>
    <br>
    
    <div style="text-align:CENTER;">
    <select id="mess" onchange="message(this)" disabled>
    <option style="background-color:lightskyblue;font-weight:bold" value="１蛇１蛇１蛇１蛇１蛇１蛇１蛇１蛇１蛇１蛇１蛇１蛇☆★☆★。。。。">メッセージ１</option>
    <option style="background-color:yellow;font-weight:bold" value="２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇２蛇☆★☆★。。。。" selected>メッセージ２</option>
    <option style="background-color:yellow;font-weight:bold" value="３蛇３蛇３蛇３蛇３蛇３蛇３蛇３蛇３蛇３蛇３蛇３蛇☆★☆★。。。。">メッセージ３</option>
    
    </select>
    &nbsp;
    <select id="size" onchange="siz(this)" disabled>
    <option style="background-color:pink;font-weight:bold" value="40">サイズ(大)</option>
    <option style="background-color:lightskyblue;font-weight:bold" value="30" selected>サイズ(中)</option>
    <option style="background-color:yellow;font-weight:bold" value="20">サイズ(小)</option>
    </select>
    &nbsp;
    <select id="sCol" onchange="hebi(this)" disabled>
    <option style="background-color:white;font-weight:bold" value="white" selected>色(ヘビ)</option>
    <option style="background-color:lightskyblue;font-weight:bold" value="lightskyblue">色(ヘビ)</option>
    <option style="background-color:yellow;font-weight:bold" value="yellow">色(ヘビ)</option>
    <option style="background-color:lime;font-weight:bold" value="lime">色(ヘビ)</option>
    <option style="background-color:deeppink;font-weight:bold" value="deeppink">色(ヘビ)</option>
    <option style="background-color:mediumblue;font-weight:bold" value="mediumblue">色(ヘビ)</option>
    <option style="background-color:#8b0000;font-weight:bold" value="#8b0000">色(ヘビ)</option>
    </select>
    
    </div>
    </BODY>
    </HTML>
    
[/code]


CC BY-SA 3.0
2015-11-07T12:02:32.817
18517
2015-11-15T03:32:07.447
2015-11-08T00:45:25.130
3054
9359
question
javascript html
セレクトボックスの初期化に伴い、それに連動する設定も戻す方法


問題点が2つありましたので順番に。

  1. "プルダウン式ボタン"と呼ばれているセレクトボックスについてですが、Chromeにて動作確認を行ったところ特に問題なく初期状態（それぞれ先頭）に戻りました。  
ボタンを押しても戻らない現象については、どうやらポインタを周回しているテキストの優先順位が上位になっており、ポインタをずらしてから出ないとボタンやセレクトボックスのクリックイベントが発生しない状態でした。

  2. セレクトボックスの背景色は、以下のように selectタグの属性につけます。  
`<select style="background-color:色名または色コード">`

問題が発生したときは複数同時に解決しようとせず、1つずつ解決できるように、問題点を切り分けてコードを書けるようにした方が良いかと思います。今回の件で言えば、ボタンのイベントを阻害している周回するテキストならびにJavaScriptを一時的にを取り除くこと、次に背景色の設定をすることです。

参考になれば幸いです。


CC BY-SA 3.0
2015-11-07T15:52:19.930
18524
2015-11-07T15:52:19.930
5778
18517
answer


「メッセージ内容を初期の状態に戻す」について回答させていただきます。

「プルダウンメニューの選択状態をページロード時の状態に戻す」という意図でよろしかったでしょうか？  
以下のように、プルダウンメニュー全体をフォーム要素で囲み、resetボタンを置くことで、プルダウンメニューを初期状態に戻すことができます。

[code]

    <form>
     <select>
      <option>option 1</option>
      <option selected>Default</option>
      <option>option 2</option>
     </select>
     <input type="reset">
    </form>
[/code]

JSからは、form要素のDOMをgetElementByIdなどで取得し、その中のreset()を呼び出すことで、これと同じ挙動を再現できるはずです。JSからのみこの操作をする場合は、HTML内にリセットボタンを置くことは必須ではありません。

よって、プルダウンメニューをform要素で囲み、コード中のメニューをリセットしたい任意の場所でreset()を呼び出すことで、ご質問の内容は解決できるかと思います。


CC BY-SA 3.0
2015-11-07T15:54:52.550
18525
2015-11-07T15:54:52.550
7229
18517
answer


### メッセージ内容を初期の状態に戻す

関数 "mogglo" 内で、

[code]

    document.getElementById('mess').selectedIndex=0;
    
[/code]

として選択状態を初期化する所までは出来ていますね。  
選択状態が変化した際に「メッセージ内容」を設定し直す "message" 関数もあるようです。  
でしたら、”mogglo” 内で ”message” を呼べばよいです。

[code]

    document.getElementById('mess').selectedIndex=0;
    // 追加
    message(document.getElementById('mess'));
    
[/code]

### 「メーセージボタン」と「サイズボタン」に色を付ける

これはどのタイミングで、どんな色を付けたいのでしょうか。  
「カラーボタン」で色が選択された時、これらのボタンも一緒の色にしたいのですか？  
でしたら、色は「カラーボタン」の value を使うのですから、「メーセージボタン」と「サイズボタン」に value が無い事は問題にならないと思います。

### 余談

字下げはきちんとした方がよいです。  
「自分では分かっている」と思っても、分っていないものなのです。  
一文字の変数名、意味の分からない変数名、大量のグローバル変数も止めましょう。  
下らない事と思うかもしれませんが、こういった事が積み重なり、自分のコードが読めなくなってしまいます。


CC BY-SA 3.0
2015-11-07T16:11:59.603
18526
2015-11-07T16:11:59.603
3054
18517
answer


みなさんの回答を参考にして、次のようにまとめることができました。

１：javascriptの"moglo"の中

[code]

    num = 1;
    function mogglo(){
      num ^= 1; 
      if(num == 1){ 
        document.getElementById('myText').style.visibility="hidden"; 
        document.getElementById('size').disabled=true;
        document.getElementById('mess').disabled=true;
        document.getElementById('sCol').disabled=true;
        document.getElementById("messa").reset();
        message(document.getElementById('mess'));
        siz(document.getElementById('size'));
        hebi(document.getElementById('sCol'));
      }
      else { 
        document.getElementById('myText').style.visibility="visible";
        document.getElementById('size').disabled=false;
        document.getElementById('mess').disabled=false;
        document.getElementById('sCol').disabled=false;
      }
      document.getElementById("togglo").value = num ?"  APPEAR  ":"KILL(切る)";
    }
    
[/code]

２：htmlの中では、form要素を設定して`id('messa')`を付け、select全体を囲む。


CC BY-SA 3.0
2015-11-08T16:05:37.883
18550
2015-11-10T01:47:52.060
2015-11-10T01:47:52.060
2521
9359
18517
answer


selectの『メーセージ ボタン』と『サイズボタン』がクリックされると、optionの色も変える方法にうまくいきました。  
ソースコードの『サイズボタン』を例にすると、selectタグにclass(名＝butt1)を付け`、<style
type="text/css">`の中に、selectedがあるoptionタグの色と同じにするために".butt1{background:lightskyblue;color:black;}"を置き、javascriptの"siz(opt){}"の中に、条件式でselectのoptionがクリックされた場合のボタンの色を出すために  
var size = 30;  
function siz(opt){  
document.getElementById('myText').style.fontSize=opt.options[opt.selectedIndex].value;  
if(opt.value=="40"){  
document.getElementById('size').style.background="pink";  
}  
if(opt.value=="30"){  
document.getElementById('size').style.background="lightskyblue";  
}  
if(opt.value=="20"){  
document.getElementById('size').style.background="yellow";  
}  
}  
とします。

ただ、bgsoundで、このように"ifの条件式"で組み立てても、一番下の"ifの条件式"で出力される色のみが反映されてうまきいきません(＊“onclick"で組み立てると、うまくいきますが)。  
どなたか”onchange”ででも、optionがクリックされた場合に、selectボタンの色が変わる方法が分かる方は、ご教示ください。


CC BY-SA 3.0
2015-11-15T03:32:07.447
18832
2015-11-15T03:32:07.447
9359
18517
answer