• Как перемещать шахматные фигуры с помощью JS?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    На вскидку, я бы сделал как-то так:
    1. Пропишите id для каждой клетки. Так будет проще работать с DOM деревом
    2. Напишите общий class "Фигура". В нем будет свойство указывающее на то, где сейчас находится фигура, и простой метод "Переместить". Этот метод, просто учищает текужую ячейку таблицы и вставляет фигуру в указанную.
    3. Напишите class для каждого типа фигуры. Он наследуется от базового.
    4. В классе конкретной фигуры опишите метод который будет проверять может ли текущая данная фигура, на основе правил игры и текущей позиции, переместится на указанную клетку.
    5. В классе конкретной фигуры опишите метод "Переместить", который будет выполнять проверку (см. предыдущий пунк) после чего вызывать родительский метод "Переместить".



    Почитать:
    1. https://learn.javascript.ru/dom-nodes
    2. https://learn.javascript.ru/basic-dom-node-properties
    3. https://learn.javascript.ru/dom-navigation
    4. https://learn.javascript.ru/searching-elements-dom
    5. https://learn.javascript.ru/classes
    Ответ написан
    Комментировать
  • Как обновить значение переменной?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Каждый тик таймера вы устанавливаете определённое значение переменной.
    В вашем случае нужно где-то сохранять данные об оставшемся количестве.
    Предлагаю вам завести класс, который хранит количество всего и поместить их в словарь.
    Будет что-то наподобие
    private Dictionary<string, Item> Inventory = new () {
        ["Дробовик"] = new () { Damage = 36, Clip = 30, Stock = 60 },
        ["Автомат"] = new () { Damage = 30, Clip = 30, Stock = 60 },
        ["Базука"] = new () { Damage = 51, Clip = 1, Stock = 2 }
    };
    public Item SelectedItem {get; set;}
    private void timer1_Tick(object sender, EventArgs e) {
      SelectedItem = Inventory[combobox.Text];
    }

    А потом там где вы выводите текст:
    label1.Text = SelectedItem?.Clip.ToString() ?? "";
    Ответ написан
    Комментировать
  • Почему не работает форматирование в VSC?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    VSC не умеет сама определять ваш code-style. Или через настройки, или через расширение ESLInt надо делать.

    UPD. В конце концов можно поставить пакеты standardx и snazzy, и уже через терминал производить автоматическое форматирование кода.
    standardx --fix --verbose | snazzy
    Команду можно добавить в package.json
    {
      "scripts": {
        "lint": "standardx --fix --verbose | snazzy",
      }
    }

    И вызывать через
    npm run lint
    Ответ написан
    3 комментария
  • Почему после изменения какого-то значения в объекте, vue не перезагружает компонент?

    значит данные не реактивны. Скорее всего Вы меняете значения в массиве. Не видя кода сложно предположить, но может выдержка из документации Вам поможет.
    Ответ написан
    2 комментария
  • Как переделать код под ООП?

    @TheCrossCarrier
    1. Вынести в переменные (а лучше в константы const) все элементы HTML. Например, как сделано с PanelMenuLinks
    2. Использовать вместо, например querySelectorAll("#block_panel_menu")[0] getElementById("block_panel_menu")
      А там, где надо нескольким элементам из массива присвоить значения, использовать циклы forEach

    3. Вразброс обращаетесь к элементам, разделите на блоки, делайте отступы логические (пустые строки) между блоками кода, чтоб было понятнее.
      С табуляцией у Вас что-то...


    Отредактировал Ваш код:

    const
      header = document.querySelector('header'),
      logotip = document.getElementById('logotip'),
      registion = document.getElementById('registion'),
      vhod = document.getElementById('vhod'),
      block_panel_menu = document.querySelectorAll('#block_panel_menu')
    
    function block_panel_menu_Height(height) {
      block_panel_menu.forEach(element => element.style.height = height + 'px')
    }
    
    // vhod.innerHTML = '<img style="width: 20px; height: 20px;" src="SiteImage/logo_vhod.svg">'
    let logo_vhod = document.createElement('img')
    logo_vhod.style.width = '20px'
    logo_vhod.style.height = '20px'
    logo_vhod.src = './SiteImage/logo_vhod.svg'
    
    window.onscroll = () => {
    
      if (pageYOffset > 100) {
        header.style.height = '50px'
    
        logotip.style.opacity = '0'
        logotip.style.marginTop = '-20px'
    
        registion.style.display = 'none'
    
        vhod.appendChild(logo_vhod)
        vhod.style.background = 'none'
        vhod.style.width = '30px'
    
        PanelMenuLinks.style.background = 'none'
        PanelMenuLinks.style.zIndex = '-1'
        PanelMenuLinks.style.marginTop = '-45px'
        PanelMenuLinks.style.fontSize = '13px'
        PanelMenuLinks.style.color = '#fff'
        PanelMenuLinks.style.borderTop = '0px'
    
        block_panel_menu_Height(49)
        block_panel_menu_children.style.top = '10px'
      }
      else {
        header.style.height = '70px'
    
        logotip.style.marginTop = '0px'
        logotip.style.opacity = '1'
    
        registion.style.display = 'block'
    
        vhod.innerText = 'Регистрация'
        vhod.style.background = '#626262'
        vhod.style.width = '100px'
    
        block_panel_menu_Height(70)
        block_panel_menu_children.style.top = '20px'
    
        PanelMenuLinks.style.marginTop = '0px'
        PanelMenuLinks.style.background = '#E7E7E7'
        PanelMenuLinks.style.borderTop = '10px solid #fff'
        PanelMenuLinks.style.fontSize = '18px'
        PanelMenuLinks.style.color = '#000'
      }
    }


    Мои рекомендации (кроме тех, что я описал выше):
    • Правильно использовать функции получения доступа к элементам HTML
    • ID обычно даётся единственному элементу в документе, в остальных случаях используется класс
    • Использовать innerText там где можно обойтись и без innerHTML
    • Создавать элементы средствами JS, а не встраиванием HTML кода через innerHTML
    • Пишите функции (пусть даже маленькие), если есть повторения в коде: так код будет и красивее и читабельнее и удобнее в использовании
    • Давать классам и id русские имена типа vhod -- не самая лучшая идея. Используйте переводчик, чтобы перевести интересующие Вас названия на английский.
    • Выберите способ именования переменных: либо block_panel_menu, либо blockPanelMenu. У Вас же встречаются оба варианта. В JavaScript принято использовать вариант, называемый Camel Case, то есть, второй вариант: blockPanelMenu.

    Ну а так по мелочи: можно использовать одинарные кавычки ' вместо двойных ";
    изучите стрелочные функции типа () => {} . Часто можно использовать именно их -- они и короче писать и не захламляют код лишними словами;
    Слушатели событий можно записать короткой записью, например: window.addEventListener('scroll', функция) можно написать window.onscroll = функция (в большинстве случаев просто добавляется 'on' в начало названия события); Желательно писать в начале скрипта строчку 'use strict' -- строгий режим -- гугл расскажет о нём лучше меня

    Задавайте вопросы, что не понятно, на всё отвечу!
    Ответ написан
    2 комментария
  • Помощь в создании диаграммы на D3. Как сделать?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    она есть на сайте D3... нужен полный код этой, либо похожей диаграммы...


    Она и правда там есть. Равно как и кнопка "скачать исходники":
    6008378d043b8035188422.png
    Ответ написан
    Комментировать
  • Как убрать ошибку 500?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Чтобы не бросался Exception при кодах ответа > 399
    https://docs.guzzlephp.org/en/stable/request-optio...
    Ответ написан
    3 комментария
  • Зачем хранить результат запроса в Store?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    Не очень понял. Запрос делается, когда требуется)

    Представим случай:
    У вас в одном компоненте есть список продуктов, который вы загружаете запросом к беку, А в другом компоненте есть надпись "найдено 1234 продуктов". Они на одной странице, но находятся далеко друг от друга, поэтому это разные компоненты

    Как вам сделать так, чтобы исходя из ответа сервера данные отображались в двух компонентах?

    React без редакса: найти/сделать какой-то родительский компонент, который будет "над" вашими двумя. В нём делать запрос, результат запроса прокидывать в нужные компоненты через пропсы. Есть очевидный минус: бывает, что между родительским компонентом и нужным компонентом есть ещё компонентов 5-6. Придётся прокидывать пропсы через каждый. Это захламляет проект. А если вам вдруг ещё в какой-то третий компонент нужно будет эти же данные прокинуть -- придётся переделывать

    React + redux (или любой другой стейт менеджер, не обязательно redux):
    В любом компоненте вызываете action, который делает запрос и сохраняет результат в store. Если какому-то компоненту нужны эти данные -- он делает connect к стору, берёт оттуда нужные данные и всё.

    То есть общая рекомендация: данные нужно хранить в сторе, когда они могут использоваться разными компонентами
    Ответ написан
    Комментировать
  • Как выровнять по центру элементы?

    Kwinston
    @Kwinston
    Fullstack Web3 Developer
    Пропишите к тегу a/li внутри меню свойство line-height: (высота меню)px; либо же примените к ul свойство align-items: center
    Ответ написан
    Комментировать
  • Как взять последний td у каждого tr?

    petermzg
    @petermzg
    Самый лучший программист
    td:last-child
    Ответ написан
    Комментировать
  • Как сделать свой REST API?

    @tempick
    Как вариант - использовать Yii2 - с помощью него легко делать REST API
    Ответ написан
    1 комментарий
  • Как сделать свой REST API?

    @Ibishka
    <?php
    // Headers
    header('Access-Control-Allow-Origin: http://localhost:3000');
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
    header('Access-Control-Allow-Headers: *');
    header('Content-Type: application/json');
    // Connect to db
    $connect = mysqli_connect('localhost', 'root', 'root', 'f-mania');
    // If connect error
    if (!$connect) {
      echo mysqli_connect_error();
      die();
    }
    // Split url into array
    $params = explode('/', $_GET['url']);
    
    if ($_SERVER['REQUEST_METHOD'] == 'GET') {
      if ($params[0] == 'account') {
       // ...
      }
    } elseif ($_SERVER['REQUEST_METHOD'] == 'POST') {
      if ($params[0] == 'account') {
        if ($params[1] == 'login') {
       // ...
        } elseif ($params[1] == 'recover') {
       // ...
        } elseif ($params[1] == 'reset') {
       // ...
        } elseif ($params[1] == 'register') {
       // ...
        }
      }
    } elseif ($_SERVER['REQUEST_METHOD'] == 'PUT') {
       // ...
    } elseif ($_SERVER['REQUEST_METHOD'] == 'DELETE') {
       // ...
    }

    .htaccess
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-F
    RewriteRule ^(.+)$ index.php?url=$1 [L,QSA]
    Ответ написан
    Комментировать
  • Как сделать свой REST API?

    Проще всего начать с автогенерации кода по спецификации OpenAPI (swagger).
    Редактор спецификации онлайн: https://editor.swagger.io/
    Ответ написан
    Комментировать
  • Как сделать свой REST API?

    @Kirill-Gorelov
    С ума с IT
    www.slimframework.com готовое решение.
    Ставиться за 5 минут.
    Ответ написан
    2 комментария
  • Как сделать свой REST API?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    GET /api/games/
    POST /api/games/12345
    PUT /api/games/12345/
    DELETE /api/games/12345/

    папки и файлы
    var/www/html/config.php - конфиг базы и прочее
    var/www/html/api/games/index.php - ваше api
    <?php
    $method = $_SERVER['REQUEST_METHOD'];
    $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));
    
    switch ($method) {
      case 'PUT':
        do_something_with_put($request);  
        break;
      case 'POST':
        do_something_with_post($request);  
        break;
      case 'GET':
        do_something_with_get($request);  
        break;
      default:
        handle_error($request);  
        break;
    }
    Ответ написан
    2 комментария
  • Как сделать свой REST API?

    VlasenkoFedor
    @VlasenkoFedor
    Программист: php, js, go
    index.php
    <?php
    # Author - Fedor Vlasenko, vlasenkofedor@gmail.com
    define('METHOD', $_SERVER['REQUEST_METHOD']);
    define('URI', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
    
    function router($url, ...$args)
    {
        (empty($args[1]) || false !== strpos(METHOD, $args[0]))
        && (URI === $url || preg_match('#^' . $url . '$#iu', URI, $match))
        && die(call_user_func_array(end($args), $match ?? []));
    }
    
    router('/api/games', 'GET', function () {
        echo 'список игрушек';
    });
    
    router('/api/game/(\d+)', 'GET', function (...$args) {
        echo 'информация о игрушке: ', $args[1];
    });
    
    router('/api/games', 'POST', function () {
        echo 'добавить новую игрушку';
    });
    
    router('/api/games/(\d+)', 'PUT', function (...$args) {
        echo 'обновить существующую игрушку: ', $args[1];
    });
    
    router('/api/games/(\d+)', 'DELETE', function (...$args) {
        echo ' удалить игрушку: ', $args[1];
    });
    
    header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    echo '404';

    далее в консоли запускаем встроенный php сервер
    php -S localhost:8000 index.php
    тестируем и наслаждаемся :-)
    Ответ написан
    2 комментария
  • Как выполнять запрос ajax каждые N секунд?

    Tim-A-2020
    @Tim-A-2020
    еще вариант использования setInterval
    async function getJson() {
        var res = await fetch('url');
        myArray = await res.json();
        console.log(myArray);
    }
    
    setInterval(() => {
        getJson();
    }, 5000);
    Ответ написан
    Комментировать