44372


下記のコードは、１分ごとに"和暦"と"西暦"に切り替わる『(カレンダー機能付き)デジタル時計』で、  
マウスポインターの動きに合わせて付いて行くものですが、問題があるのです。  
更新させると、西暦に比べて和暦の移動速度が極端に遅くなる(重くなる)のです。  
ブラウザは、IE11です。  
この重さの問題を解決したいのですが、コードをどのように書き換えればいいのでしょうか。  
以前にも同じ質問をしたのですが、別コードのためにコードの組み立てができません。  
分かる方は、教えていただけないでしょうか。よろしくお願いします。

[code]

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <title>文字マウスストーカー</title>
    
    <style type="text/css">
    body {background-color: black;}
    
    #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">
    <!--
    /* Circling text trail- Tim Tilton
     Website: http://www.tempermedia.com/
     Visit: http://www.dynamicdrive.com/ for Original Source and tons of scripts
     Modified Here for more flexibility and modern browser support
     Modifications as first seen in http://www.dynamicdrive.com/forums/
     username:jscheuer1 - This notice must remain for legal use
     */
    
    ;(function(){
    
        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) 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
    
            var date = new Date();
            var mt = date.getMinutes();
    
            if( mt%2==0 ){
    
                var date = new Date(),
                    m = new Array("１月", "２月", "３月", "４月", "５月", "６月", "７月", "８月", "９月", "10月", "11月", "12月"),
                    w = new Array("?", "?", "?", "?", "?", "?", "?"),
    
                    month = m[date.getMonth()],
                    day = date.getDate(),
                    week = w[date.getDay()],
    
                    Hour = date.getHours(),
                    Min = date.getMinutes(),
                    Sec = date.getSeconds();
    
                if(Min <= 9) { 
                    Min = "0" + Min; 
                }
                if(Sec <= 9) { 
                    Sec =  "0" +  Sec; 
                }
    
                var option = { year: '2-digit' };
    
                t = date.toLocaleDateString("ja-JP-u-ca-japanese", option).replace(/\u200e/g, "").replace(" ", "") +
                    " " + month + day + "日" + " " + week + " " + Hour + ":" + Min + ":" + Sec;
    
            }else{
    
                var date = new Date(),
                    w = new Array("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"),
                    m = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),
    
                    day = date.getDate(),
                    week = w[date.getDay()],
                    year = date.getYear() + 1900,
    
                    Hour = date.getHours(),
                    Min = date.getMinutes(),
                    Sec = date.getSeconds();
    
                if(Min <= 9) { 
                    Min = "0" + Min; 
                }
                if(Sec <= 9) { 
                    Sec =  "0" +  Sec; 
                }
    
                if((day == 1)||(day == 21)||(day == 31)){
                    day=day+ "st";
                }
                else if((day == 2)||(day == 22)){
                    day=day+ "nd";
                }
                else if((day == 3)||(day == 23)){
                    day=day+ "rd";
                }
                else{
                    day=day+ "th";
                }
    
                t = " " + week + " " + day + " " + m[date.getMonth()] + " " + year + "◆" + " " +  Hour + ":" + Min + ":" + Sec;
    
            }
    
            var currentLength = msg.length;
    
            // 状態の変更
            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;
                }
            };
    
            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></body>
    </html>
    
[/code]


CC BY-SA 4.0
2018-05-28T10:44:34.263
44330
2018-05-30T01:09:41.207
2018-05-30T01:09:41.207
3060
28531
question
javascript css
Date#toLocaleDateStringで和暦を扱う場合、西暦を扱う場合と比較してパフォーマンスが落ちてしまう問題を解決したい


以前の質問と全く同じ問題で、和暦に切り替える条件もまったく変わっていませんので、[以前の回答](https://ja.stackoverflow.com/questions/43328/tolocaledatestring%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AE%E5%92%8C%E6%9A%A6%E3%81%AE%E7%A7%BB%E5%8B%95%E9%80%9F%E5%BA%A6%E3%81%8C%E9%87%8D%E3%81%84%E5%8E%9F%E5%9B%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E3%81%AA%E3%81%A9/43337#43337)と同じように解決できます。

  * 状態を表現する変数を作る  
最後に表示した日付がどのロカールだったかを、グローバル変数などに保持します。前回のコードの `lastYearLocale`

  * 最後に表示したデータを保持する変数を作る  
`toLocaleDateString()`の結果を使い回すために、最後に表示した日付をグローバル変数などに保持します。前回のコードの
`lastYearString`

  * 状態が変わったことを検知して、それぞれの変数を更新する  
前回のコードの `updateYear()` の最初のブロック


CC BY-SA 4.0
2018-05-29T14:54:07.317
44372
2018-05-29T14:54:07.317
3475
44330
answer