34069


下記のコードは、文字列がマウスポインタに追従するものですが、これをトグルボタンを使ってマウスポインタと追従する文字列を切り離したり(off)、再び追従させたり(on)したいのですが、文を組み立てられません。スクリプトの一番下にある  
if (window.addEventListener){}  
else if (window.attachEvent){};  
に鍵があるのは何となく分かるのですが、どのように書き加えればいいでしょうか。

[code]

    <!DOCTYPE html>
    <html lang="ja">
    <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>文字列の追従(ON⇔OFF)</title>
    
    
    <style type="text/css">
    
    #myText {
    /* Optional - DO NOT SET FONT-SIZE HERE, SET IT IN THE SCRIPT */
    font-style: italic;
    font-weight: bold;
    font-family: 'comic sans ms', verdana, arial;
    color: #ff0000;
    
    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">
    <!--
    
    ;(function(){
    
    // Your message here (QUOTED STRING)
    var msg = "文字列の追従(ON⇔OFF)"; 
    var size = 24;
    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) return;
    
    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; // y-position
     xmouse = !isNaN(e.pageX)? e.pageX : e.clientX; // x-position
    },
    
    makecircle = function(){ // rotation/positioning
     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){ // makes the circle
      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(){ // makes the resistance
     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(){ // appends message divs, & sets initial values for positioning arrays
     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);
    };
    
    })();
    // -->
    </script>
    
    
    </head>
    <body bgcolor="#ccffff">
    
    </body>
    </html>
    
[/code]


CC BY-SA 3.0
2017-04-15T09:29:33.100
34036
2017-04-27T09:15:22.543
20431
question
javascript
トグルボタンを使って、マウスポインタと追従する文字列を制御するには


init
内でsetIntervalを呼び出してdragを繰り返し行うようになっているので、これに変数を付けてやりclearIntervalで止めてやればいいと思います。以下サンプルになります。

[code]

    <!DOCTYPE html>
    <html lang="ja">
    <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>文字列の追従(ON⇔OFF)</title>
    
    
    <style type="text/css">
    
        #myText {
            /* Optional - DO NOT SET FONT-SIZE HERE, SET IT IN THE SCRIPT */
            font-style: italic;
            font-weight: bold;
            font-family: 'comic sans ms', verdana, arial;
            color: #ff0000;
    
            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">
    <!--
    
        ;(function(){
    
        // Your message here (QUOTED STRING)
        var msg = "文字列の追従(ON⇔OFF)";
        var size = 24;  // font-size
        var circleY = 0.75;
        var circleX = 2;
        var letter_spacing = 5;
        var diameter = 10;
        var rotation = 0.4;
        var speed = 0.3;
        var timer;
    
    
        if (!window.addEventListener && !window.attachEvent || !document.createElement) return;
    
        msg = msg.split('');
        var n = msg.length - 1, // 文字列長
            a = Math.round(size * diameter * 0.208333), // 文字の入るdivのwidth、heightサイズ
            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; // y-position
                 xmouse = !isNaN(e.pageX)? e.pageX : e.clientX; // x-position
            },
    
            makecircle = function(){ // rotation/positioning
                 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){ // makes the circle
                      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(){ // makes the resistance
                 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(){ // appends message divs, & sets initial values for positioning arrays
                 if(!isNaN(window.pageYOffset)){
                      ymouse += window.pageYOffset; //スクロール量を加算
                      xmouse += window.pageXOffset;
                 } else init.nopy = true;
                 for (var d, i = n; i > -1; --i){
                     // 文字数に応じてdivを作成
                      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);
                 timer = setInterval(drag, 25);
            },
    
            ascroll = function(){
                 ymouse += window.pageYOffset;
                 xmouse += window.pageXOffset;
                 window.removeEventListener('scroll', ascroll, false);
            },
    
            toggle = function(){
                if(timer !== undefined){
                    console.log("get")
                    clearInterval(timer);
                    timer = undefined;
                } else {
                    timer = setInterval(drag, 25);
                }
            };
    
        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);
             document.addEventListener("click", toggle, false);
              if (/Apple/.test(navigator.vendor))
                   window.addEventListener('scroll', ascroll, false);
        }
        else if (window.attachEvent){
             window.attachEvent('onload', init);
             document.attachEvent('onmousemove', mouse);
        };
    
    })();
    // -->
    </script>
    
    
    </head>
    <body bgcolor="#ccffff">
    
    </body>
    </html>
    
[/code]


CC BY-SA 3.0
2017-04-17T08:57:15.707
34069
2017-04-17T08:57:15.707
22602
34036
answer


クリックが”num == 0”でなければ、

・addEventListener→removeEventListener  
･attachEvent→detachEvent

に変えると、うまく行きます。スクリプトの一番下にある  
if (window.addEventListener){中略  
}else if (window.attachEvent){中略  
};  
の下に、以下を付け加えればいいようです。

[code]

    num = 0;
    function onoff(){
     num ^= 1;
    if(num == 0){document.getElementById("myText").style.color="red";
        if (window.addEventListener){
             window.addEventListener('load', init, false);
             document.addEventListener('mouseover', mouse, false);
             document.addEventListener('mousemove', mouse, false);
             document.addEventListener("click", toggle, false);
              if (/Apple/.test(navigator.vendor))
                   window.addEventListener('scroll', ascroll, false);
        }
        else if (window.attachEvent){
             window.attachEvent('onload', init);
             document.attachEvent('onmousemove', mouse);
        }
    }
    else {document.getElementById("myText").style.color="blue";
        if (window.removeEventListener){
             window.removeEventListener('load', init, false);
             document.removeEventListener('mouseover', mouse, false);
             document.removeEventListener('mousemove', mouse, false);
             document.removeEventListener("click", toggle, false);
              if (/Apple/.test(navigator.vendor))
                   window.removeEventListener('scroll', ascroll, false);
        }
        else if (window.detachEvent){
             window.detachEvent('onload', init);
             document.detachEvent('onmousemove', mouse);
        }
    }
    }
    window.onclick=onoff;
    
[/code]


CC BY-SA 3.0
2017-04-27T08:35:43.223
34318
2017-04-27T09:15:22.543
2017-04-27T09:15:22.543
20431
20431
34036
answer