Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   В произвольный момент cбрасывается style... (https://javascript.ru/forum/events/71444-v-proizvolnyjj-moment-cbrasyvaetsya-style.html)

Maklay 19.11.2017 17:35

В произвольный момент cбрасывается style...
 
Товарищи на основе задачи из местного учебника, решил дополнительно покатать мяч по полю, вот собственно код:
<!DOCTYPE HTML>
<html>
    <head>
        <style>
            #field {
                width: 200px;
                border: 10px groove black;
                background-color: #00FF00;
                position: relative;
            }

            #ball {
                position: absolute;
            }
        </style>
    </head>
    <body>
        <div id="field">
            <img src="https://js.cx/clipart/ball.svg" id="ball"> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
        </div>
        <script>
            'use strict';
            let field = document.getElementById('field');
            let ball = document.querySelector('img');
            let medX = field.clientWidth / 2;
            let medY = field.clientHeight / 2;
            let xStart = medX - ball.offsetWidth / 2;
            let yStart = medY - ball.offsetHeight / 2;
            ball.style.Left = '0px';
            ball.style.Top = '0px';
            let timerId = setTimeout(function doGoal() {
                if (parseInt(ball.style.Left) < xStart) {
                    ball.style.Left = (parseInt(ball.style.Left) + 1) + 'px';
                } else {
                    clearTimeout(timerId);
                    return;
                }
                if (parseInt(ball.style.Top) < yStart) {
                    ball.style.Top = (parseInt(ball.style.Top) + 1) + 'px';
                } else {
                    clearTimeout(timerId);
                    return;
                }
                timerId = setTimeout(doGoal, 100);

            }, 100);
        </script>
    </body>
</html>

Предполагал, что мяч будет смещаться по X,Y пока по одной из координат не достигнет середины поля. В реальности в какой-то момент
ball.style.Left

становится undefined, и соответственно все рушится.

Прошу совета, понимаю что ошибка должна быть элементарная, но уже сломал всю голову...

рони 19.11.2017 18:09

Maklay,
Цитата:

Сообщение от Maklay
ball.style.Left

Цитата:

Сообщение от Maklay
ball.style.Top


Maklay 19.11.2017 19:08

2 рони:
*исправлено со временем* Премного благодарен(хотя с первого раза не дошло).

Но тем не менее, при изначальной кривой реализации, когда вместо изменения стиля элемента, я просто менял по ошибке созданную характеристику объекта style (Left, Top) результат на выходе выглядит все равно странным:

При запуске по шагам с брейкпоинтом в строке 34, ball.style.Left какое-то количество шагов увеличивается на 1px как и задумано (ну с учетом изначальной ошибки), но затем, в произвольный момент(иногда даже без смены шага), становится undefinite, что соответственно завершает исполнение.

рони 19.11.2017 19:37

Maklay,
добавил вывод в консоль, где undefinite ?
<!DOCTYPE HTML>
<html>
    <head>
        <style>
            #field {
                width: 200px;
                border: 10px groove black;
                background-color: #00FF00;
                position: relative;

            }

            #ball {
                position: absolute;
            }
        </style>
    </head>
    <body>
        <div id="field">
            <img src="https://js.cx/clipart/ball.svg" id="ball"> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
        </div>
        <script>
            'use strict';
            let field = document.getElementById('field');
            let ball = document.querySelector('img');
            let medX = field.clientWidth / 2;
            let medY = field.clientHeight / 2;
            let xStart = medX - ball.offsetWidth / 2;
            let yStart = medY - ball.offsetHeight / 2;
            ball.style.left = '0px';
            ball.style.top = '0px';
            let timerId = setTimeout(function doGoal() { console.log(ball.style.left)
                if (parseInt(ball.style.left) < xStart) {
                    ball.style.left = (parseInt(ball.style.left) + 1) + 'px';
                } else {
                    clearTimeout(timerId);
                    return;
                }
                if (parseInt(ball.style.top) < yStart) {
                    ball.style.top = (parseInt(ball.style.top) + 1) + 'px';
                } else {
                    clearTimeout(timerId);
                    return;
                }
                timerId = setTimeout(doGoal, 100);

            }, 100);
        </script>
    </body>
</html>

Maklay 19.11.2017 20:06

Рони,
Основная проблема решена, мяч с учетом исправлений движется как задумано(за что еще раз выражаю благодарность). Вопрос остался, лишь при попытке произвести разбор своей ошибки.

Как работает код с неверным обращением (Left):
1)из за обращения к ball.style.Left вместо ball.style.left, вместо изменения стиля ball, в объект ball.style была дописана новая характеристика Left, просто как доп свойство.
2)При прогоне по шагам с брейкпоинтом в 34 строке, данная характеристика меняется какое-то время, но потом просто исчезает из данного объекта, и как следствие ball.style.Left=undefinite.

Непонятно почему код не работает так:
1)из за обращения к ball.style.Left вместо ball.style.left, вместо изменения стиля ball, в объект ball.style была дописана новая характеристика Left, просто как доп свойство.
2)При завершении таймера мяч на месте но в ball.style остаются два добавленных свойства Left и Top со значениями которые они приобрели.

рони 19.11.2017 20:13

Maklay,
может кто-то другой прокомментирует ...


Часовой пояс GMT +3, время: 04:11.