44281


下記のコードは、午前０時に日付が自動的に変わる"(カレンダー機能つき)デジタル時計"で、  
その文字列がマウスポインターに付いて回ります。  
ここで、問題があります。  
それは、自動更新する箇所の"drag = function(){}"の中に表示文字を入れると  
その和暦の文字列の移動速度が重くなるため、コードを工夫したつもりですが、  
機能しなくなりました。問題箇所は"digi関数"内ですが、うまく組み立てられる形は、  
教えていただけないでしょうか。

[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>文字マウスストーカー</title>
    
    
    <style type="text/css">
    
    #myText {
    font-style: italic;
    font-weight: bold;
    font-family: 'comic sans ms', verdana, arial;
    color: gold;
    
    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 msg =  "";
    
    
    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)
        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; // 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';
     };
    },
    
    var tMsg = ' ';
    var lastTLocale = '';
    
    function digi(){
    
      var t = tMsg;
    
    var time = new Date();
    var Hour = time.getHours();
    
     if(Hour < 12){
          if(lastTLocale!= 'info1'){
    
              var date = new Date(),
    
                  m = new Array("１月", "２月", "３月", "４月", "５月", "６月", "７月", "８月", "９月", "10月", "11月", "12月"),
                  w = new Array("㊐", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏"),
                 Wareki = date.getFullYear(),
                 month = m[date.getMonth()],
                 day = date.getDate(),
                 week = w[date.getDay()],
         Hour = date.getHours(),
         Min = date.getMinutes(),
         Sec = date.getSeconds();
    
            if(Hour <= 9) { 
                           Hour = "0" + Hour; 
    }        
    　　　　if(Min <= 9) { 
                           Min = "0" + Min; 
    }
            if(Sec <= 9) { 
                           Sec =  "0" +  Sec; 
    }
    
             var Eto = new Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"),
                 EtoNum = (Wareki + 8) % 12;
    
               t =  Eto[EtoNum] + "◆" + " " + month + day + "日" + " " + week + " " + "★" + "★" + " " + date.toLocaleDateString("ja-JP-u-ca-japanese", { era: "long", year: "numeric" }).replace(/\u200e/g, "").replace(" ", "").replace(/(^|[^\d])1(?=$|[^\d])/, '$1元') + " " +  "◆" +  Hour + ":" + Min + ":" + Sec;
              lastTLocale = 'info1';
    
    }
    
    else{
    
          if(lastTLocale != 'info2'){
    
              var date = new Date(),
                  m = new Array("１月", "２月", "３月", "４月", "５月", "６月", "７月", "８月", "９月", "10月", "11月", "12月"),
                  w = new Array("㊐", "㊊", "㊋", "㊌", "㊍", "㊎", "㊏"),
                 Wareki = date.getFullYear(),
                 month = m[date.getMonth()],
                 day = date.getDate(),
                 week = w[date.getDay()],
         Hour = date.getHours(),
         Min = date.getMinutes(),
         Sec = date.getSeconds();
    
             var Eto = new Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"),
                 EtoNum = (Wareki + 8) % 12;
    
               t =  Eto[EtoNum] + "◆" + " " + month + day + "日" + " " + week + " " + "★" + "★" + " " + date.toLocaleDateString("ja-JP-u-ca-japanese", { era: "long", year: "numeric" }).replace(/\u200e/g, "").replace(" ", "").replace(/(^|[^\d])1(?=$|[^\d])/, '$1元') + " " +  "◆" +  Hour + ":" + Min + ":" + Sec;
              lastTLocale = 'info2';
    }
    
        var currentLength = msg.length;
    
      if (t != tMsg) {
        tMsg=t;
    
        // 状態の変更
        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;
            }
        }
    };
    
    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();digi();
    },
    
    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);
    }
    
    // -->
    </script>
    
    </head>
    
    <body bgcolor="black">
    
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2018-05-26T09:35:56.307
44276
2018-05-27T13:29:19.120
2018-05-27T08:14:04.990
7936
28531
question
javascript
変更により動作しなくなったJavaScriptのデバッグ・修正方法が知りたい


  * 102行目に全角スペースが含まれていたり、いくつかの構文エラーがあります。
  * イベントリスナ登録処理が呼び出さされるように、グローバルスコープに切り出す必要があります
  * `setInterval()` やイベントリスナから呼びだされる `init()`, `drag()` を適切なスコープに含める必要があります

ひとまず、最低限動作するように修正してみたものが下記です。  
<https://gist.github.com/temmings/0f1a6a9eed6e60921f74b115f3c41563/8421e68fede9b09d5a59268ac770a665768521f2>

どのような修正を加えたかは下記URLを参照ください。  
<https://gist.github.com/temmings/0f1a6a9eed6e60921f74b115f3c41563/revisions?diff=split>

構文エラーが多いため、ブラウザのコンソールのメッセージを確認されることをお勧めします。  
例えば Google Chrome であれば、`F12` or `Ctrl + Shift + I`
でデバッグコンソールを起動でき、下記のようなエラーメッセージが確認できます。

> a.html:74 Uncaught SyntaxError: Unexpected token var

JavaScript を JSLint などの Lint ツールでチェックするのもいいと思います。  
\- <https://www.jslint.com/>


CC BY-SA 4.0
2018-05-27T02:44:54.970
44281
2018-05-27T13:29:19.120
2018-05-27T13:29:19.120
7936
7936
44276
answer