Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Помогите новичку, пожалуйста! - 2 (https://javascript.ru/forum/dom-window/84805-pomogite-novichku-pozhalujjsta-2-a.html)

Андрей Буржуй 30.12.2022 10:40

Помогите новичку, пожалуйста! - 2
 
Здравствуйте, уважаемые форумчане. Начал потихоньку осваивать JS. Выполняю задачу: Вывести любой квадрат и кнопку "скрыть квадрат". Когда мы нажимаем на скрыть, квадрат исчезает и текст кнопки меняется на "показать квадрат" и так можно кликать сколько угодно раз.

Дошёл своими скудными познаниями до такого решения. Первые два клика - всё отлично. Далее - ступор. Как можно решить данную закавыку?

<html run>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<canvas id="canvas" ></canvas>

<button type="submit" id="button03">Скрыть квадрат!</button>

</head>
<body>
<script>
let ctx = canvas.getContext('2d')
ctx.fillStyle = "red"
ctx.fillRect(100, 30, 1000, 1000)


document.getElementById("button03").onclick = () => {
document.getElementById("canvas").style.visibility = 'hidden'
document.getElementById("button03").innerText = 'Показать квадрат!'
document.getElementById("button03").onclick = () => {
document.getElementById("canvas").style.visibility = 'visible'
document.getElementById("button03").innerText = 'Скрыть квадрат!'
}
}
</script>

</body>
</html>

Андрей Буржуй 30.12.2022 12:00

Спасибо, вопрос закрыт!
 
Додумался сам. Такое решение нашёл:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<canvas id="canvas" ></canvas>

<button type="submit" id="button03">Скрыть квадрат!</button>

</head>
<body>
<script>
let ctx = canvas.getContext('2d') // Назначаем тип рисования
ctx.fillStyle = "red" // Назначаем цвет рисования
ctx.fillRect(100, 30, 1000, 1000) // Рисуем квадрат

hid = () => {
document.getElementById("button03").onclick = () => {
document.getElementById("canvas").style.visibility = 'hidden'
document.getElementById("button03").innerText = 'Показать квадрат!'
console.log('hid')
document.getElementById("button03").onclick = () => {
document.getElementById("canvas").style.visibility = 'visible'
document.getElementById("button03").innerText = 'Скрыть квадрат!'
console.log('vis')
hid()
}
}
}
hid()
</script>

</body>
</html>

рони 30.12.2022 14:27

Андрей Буржуй,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

рони 30.12.2022 17:06

Андрей Буржуй,
клик в клике не назначают, клики умножаются, это замедляет обработку кода с каждым кликом.
как вариант ...
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style type="text/css">
        #canvas {
            border: 1px solid red;
            margin: 30px  auto;
            display: block;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="500" height="300"></canvas>
    <button id="button03"></button>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let button = document.getElementById("button03");
            let obj = {
                x: 100,
                y: 30,
                width: 200,
                height: 200
            };
            let findings = Object.values(obj);
            let txt = ['Скрыть квадрат!', 'Показать квадрат!'];
            let erase = 0;
            let ctx = canvas.getContext('2d');
            ctx.fillStyle = "red";
            const draw = () => {
                let method = erase ? 'clearRect' : 'fillRect';
                let text = txt[erase];
                ctx[method](...findings);
                button.textContent = text;
                erase ^= 1;
            }
            button.addEventListener('click', draw)
            draw()
        })
    </script>
</body>
</html>


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