Ответы пользователя по тегу JavaScript
  • Сделать валидацию формы это задача для джуна или мидла?

    @alexalexes
    Человек, который пришел с улицы в программирование и взялся разрабатывать форму, должен первым делом понимать, как проверять пользовательские данные хотя бы на корректную длину (минимальную и максимальную), если вводится произвольный текст; на вхождение в список допустимых значений, если что-то выбирается из выпадающего списка или радиокнопок. Учитывать опциональность вводимого поля (обязательное для заполнения или нет). Проверять тип данных - число или строка. Если еще знает, как проверить на формальную корректность поле адреса электронной почты - вообще, супер.
    Ответ написан
    Комментировать
  • Как работать напрямую с базами данных из клиента?

    @alexalexes
    Возможно, если сама СУБД будет давать необходимый API для веб клиентов (который не будет работать из коробки, нужны определенные действия по настройке со стороны администратора СУБД).
    Яркий пример - Oracle REST Data Services.
    Но не каждый производитель СУБД заморачивается над разработкой подобных сервисов. Главное, чтобы самые популярные среды разработки серверных приложений имели необходимое расширение или драйвер, чтобы подключаться к СУБД на стороне сервера. Остальное - головная боль прикладных разработчиков.
    Ответ написан
    Комментировать
  • Как сделать табы с выводом из бд?

    @alexalexes
    Выводить также как из любого другого источника данных.
    1. Подготовьте источник данных.
    - Разверните службу СУБД в операционной системе сервера.
    - Выберите менеджер, чем вам будет удобно просматривать объекты СУБД.
    - Установите менеджер СУБД.
    - При помощи менеджера СУБД заведите пользователя базы данных, схему базы данных, структуру таблиц и связей, вставьте необходимые данные.
    2. Изучите способы подключения к источнику данных и взаимодействия из PHP (как делать коннект к СУБД, как подготавливать запросы и параметры к ним, как фетчить результат выборки запроса).
    3. Подключитесь к базе, выполните запрос, встройте выборку результата в ваш шаблон HTML (табы).
    Ответ написан
    3 комментария
  • Как сделать так, чтобы элемент можно было тащить влево-вправо?

    @alexalexes
    1. На десктопе рулят события мыши: mousedown - эквивалент touchstart, mousemove - эквивалент touchmove, mouseup - эквивалент touchend.
    2. Вместо множества точек касаний (пальцы) у вас одна точка - курсор мыши, поэтому свойства changedTouches в объекте события не будет.
    3. Тестировать, что окружение браузера имеет сенсорный экран, можно проверкой наличием доступного свойства любого события touch в window:
    if("touchstart" in window)
    {
      // работаем с сенсорными обработчиками
    }
    else
    {
      // работаем с мышиными обработчиками
    }

    4. Событие завершения управления элементом (touchend, mouseup) лучше вешать не на сам элемент item, а на его контейнер, который будет занимать всю ширину экрана (идеально, если это будет body). Логика обработки может застрять на обработчике move, если во время движения точка воздействия на объект убежит за пределы объекта.
    В определенных случаях могут выручить события mouseover/mouseout.
    Ответ написан
    Комментировать
  • С помощью чего сделан эффект как на сайте https://www.fromscout.com/?

    @alexalexes
    Анимация по ключевым кадрам.
    animation: main-logo-texture 10s linear infinite;
    Ключевые кадры:
    @keyframes main-logo-texture {
        0% {
            transform: translate(0)
        }
    
        to {
            transform: translate(-99px)
        }
    }
    Ответ написан
    3 комментария
  • Как кликнуть по элементу у которого один Class но элементов таких 10?

    @alexalexes
    Если не хотите forEach-ем, то переберите по старинке через for.
    let Nlist = document.querySelectorAll(".chain_cnt_head");
    for(let i = 0; i < Nlist.length; i++)
    {
       Nlist[i].click();
    }
    Ответ написан
    1 комментарий
  • Как правильно заменить текст в html?

    @alexalexes
    Функция ViewGifImage не нативная, а скорее всего ее реализация прописана в какой-то подключаемой библиотеке JS.
    Нужно погуглить спецификацию этой библиотеки, и посмотреть в доках, за что отвечает параметры в функции ViewGifImage.
    Если я предположу (я не знаю, что за библиотека и не видел ее документации!), что первый параметр отвечает за указатель на html узел, куда вывалить бинарный ресурс изображения, то нужно как-то обозначить теги, чтобы указатели на эти теги выцепить из DOM через JS. Например, я хочу им задать уникальные идентификаторы:
    <img id="image-1234" src="/какой-то путь/qa_2023-02-01-212831-1.gif">
    <img id="image-5678" src="/какой-то путь/qa_2023-02-01-212831-2.gif">

    Тогда из DOM я буду доставать указатели на эти элементы через функцию getElementById.
    <script type="text/javascript">
    let image_1234 = document.getElementById("image-1234"); // тут получаем ссылку на элемент с id="image-1234"
    // далее, используем ее вместо this
    ViewGifImage(image_1234, 'sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-1.gif','sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-1.pix','322','242','ReflectionResultPlot','Frequency in MHz','0','Reflection Factor |r|','0','1','xffffff x000000 x000000 xff0000 x0000ff x00df00 xff00ff xff7f00','2','158','1','Reflection 0 Degrees','158','1','Reflection 90 Degrees','','','','','','','','','');
    
    let image_5678 = document.getElementById("image-5678"); // тут получаем ссылку на элемент с id="image-5678"
    // далее, используем ее вместо this
    ViewGifImage(image_5678, 'sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-2.gif','sitedb/log/QA/General/SfpBCTuningCheck/gfx/qa_2023-02-01-212831-2.pix','322','242','TransmissionResultPlot','Frequency in MHz','0','Transmission |t| in db','0','1','xffffff x000000 x000000 xff0000 x0000ff x00df00 xff00ff xff7f00','2','158','1','Transmission 0 Degrees','158','1','Transmission 90 Degrees','','','','','','','','','')
    </script>
    Ответ написан
  • Странное поведение document.write()?

    @alexalexes
    Для записи многострочного текста в качестве параметра или переменной в JS нужно использовать обратные кавычки.
    // Как у вас:
    let a = 'Много
    строчный
    текст';
    // как корректно
    let a = `Много
    строчный
    текст`;
    // как выкрутиться, если у вас не ES6
    var a = "Много\
    строчный\
    текст";
    Ответ написан
  • Браузер блокирует скачиваение с сайта нескольких файлов подряд. Как предупредить пользователей?

    @alexalexes
    Если следовать логике загрузки файлов из github (получить весь репозиторий) или любого файлового облака (получить весь каталог с файлами), то когда речь заходит о скачивании набора файлов, то этот набор лучше упаковать в архив и отдать клиенту отдельным файлом. Тогда вы не столкнетесь с ограничениями браузера.
    Ответ написан
    2 комментария
  • Как сделать так, чтобы мигание можно было воспроизводить несколько раз?

    @alexalexes
    1. Сначала занулите свойство анимации. Потом вызовите setTimeout с нулевым временем, чтобы JS применил изменения анимации в DOM и внутри setTimeout добавьте свойство анимации. Тогда анимация перезапустится.
    nickinput.style.animation = "none";
      setTimeout(function() {
        if (validmail === false) {
            mailinput.style.animation = "blinker 0.6s linear 3";
        }
        }, 0);

    2. Задайте какой-нибудь color в ключевом кадре:
    @keyframes blinker {
      50% {
        background-color: #b11515;
        color: #aaa;
      }
    }
    Ответ написан
    3 комментария
  • CSS как сверстать вертикальное расположение? либо JS как правильно находить элемент в DOOM?

    @alexalexes
    Можно указывать нужный элемент с помощью псевдоселекторов:
    let life = lifesBlock.querySelector("span:first-child");

    или
    let life = lifesBlock.querySelector("span:last-child");
    Ответ написан
    Комментировать
  • Как сделать фото с камеры HTML js?

    @alexalexes
    Комментировать
  • Как записать данные с LocalStorage в таблицу?

    @alexalexes
    for(let i = 0;i < rows;i++){ // вы собираетесь сначала создать строку, а по кол-ву строк идут игроки, значит нужно брать число rows, а не cols
            let tr = document.createElement('tr');
      
          for(let j = 0;j < cols;j++){ // а тут cols, но тут еще нужна другая переменная для счетчика, i уже используется для индекса rows
            let td = document.createElement('td'); 
            if(j == 1) // мы ведь хотим добавить контент на вторую колонку (по индексу 1)?
            {
             td.innerHTML = localStorage.getItem(i + ""); // добавляем значение, "" - нужен, чтобы получить ключ по j в виде строки
            }
            tr.appendChild(td);
          }

    ЗЫ: Мне не нравится, что у вас некий массив очков вывален по индексам (которые 0-3) прямо в хранилище по ячейкам ключ-значение. Хорошо бы, чтобы этот массив лежал в одной ячейке хранилища под своим именем. Для этого этот массив нужно преобразовать в JSON и положить в отдельную именованную ячейку. И пользоваться значением этой ячейки нужно будет с кодированием и декорированием JSON строки.
    Ответ написан
    1 комментарий
  • Как ограничить длину массива?

    @alexalexes
    Можно старым добрым процедурным методом ограничить.
    function present () {
      if(visitinMagazine.length < 25)
        visitinMagazine.push(true);
      else
      {
       // что-то сделать при переполнении
      }
    }
    function absent() {
      if(visitinMagazine.length < 25)
        visitinMagazine.push(false);
       else
      {
       // что-то сделать при переполнении
      }
    }

    Или вам нужно чтобы сам тип данных "массив с ограничением" это делал?
    Ответ написан
    Комментировать
  • Как узнать есть ли на кнопке клас?

    @alexalexes
    1. Вставить класс.
    2. Передернуть поток выполнения JS, чтобы класс добавился в DOM, то есть вызвать вашу функцию внутри обертки setTimeout c нулевым временем ожидания.
    Ответ написан
    Комментировать
  • Возможно ли в electron-приложении защитить данные?

    @alexalexes
    Надежен до момента, пока пользователь не имеет возможность скопировать образ раздела жесткого диска с ОС и восстановить его где-нибудь на другом железе/виртуальной машине.
    От какого пользователя защищаетесь?
    От обычного пользователя, у которого нет прав на администрирование/восстановление ОС (или он это не умеет). Или от продвинутого, который за каждой мелочью правит конфиги и реестры, умеет переустанавливать ОС и делать восстановление из образа?
    Если нужно привязать софт к конкретному пользователю и к конкретному железу, то стараются собрать об окружении ОС, в которой выполняется софт, как можно больше сведений: версия ОС, какое имя текущего пользователя системы, идентификаторы процессора, материнской платы - этот набор данных представляет собой фингерпринт, который отправляется при каждом запуске софта на сервер разработчика софта и прикрепляется за учетной записью клиента софта в виде полных сведений, либо в виде хэша по значимым характеристикам (хэш получают только на стороне сервера). Если значимые параметры отличаются от того, что прислал клиентский софт, то значит есть факт изменения конфигурации оборудования и можно принять решение о блокировке софта/учетной записи (оно же лишение лицензии).
    Ответ написан
  • Куда передаются и как извлечь данные через FETCH()?

    @alexalexes
    Объясните простыми словами новичку в javascript, куда передаются данные через fetch

    Данные передаются из браузера (он же клиент) передаются на сервер.
    Постоянно вижу разные примеры кода и везде прописывают файл назначения разным

    Это не файл, это url - адрес на сервере, от которого любым способом запустится какой-то скрипт, который сможет сформировать ответ для браузера (то есть для клиента).
    Если в url указан путь к файлу на сервере, то сервер может отдать статичный файл - но для сервера не принципиально, что отдавать по какому url, можно настроить любые правила взаимодействия.
    А ловят данные вообще через какой-то "php://input"

    Сервер ловит обращение по url (он же запрос), выясняет по настройкам, что нужно сделать: запустить серверный скрипт, отдать статичный файл или ответить каким-нибудь статусом (например, 404). Если по url запрос попадает на запуск скрипта, то в этом скрипте вы можете обработать параметры запроса. Параметры запроса как правило вылавливают в $_GET или $_POST, либо парсят часть url, либо в дополнение смотрят вложения $_FILES.
    Либо в вашем варианте смотрят сырцы запроса через php://input, если что-то нестандартное нужно обработать.
    Тогда зачем вообще эти файлы, которые указывают в Fetch? Причем одни с абсолютным адресом, другие с относительным, где-то указывают расширение (html, json и т.д.), где-то вообще без него.

    Сервер может отдать разные данные клиенту. Где-то их можно забрать из файла статично, где-то сгенерировать ответ серверным скриптом динамично. А можно на статичные пути генерить динамичные данные, по виду url это мало чего говорит.
    Нужно создавать файл какой-то на сервере в который якобы будет передаваться эта информация из JS через POST запрос?

    Да, на сервере должен быть скрипт, который сформирует ответ, если для клиента нужно сформировать нечто динамическое, зависящее от параметров запроса.
    Я создаю, у меня не выходит ничего, значение, при чтении этого файла или php://input (file_get_contents("php://input")) после передачи POST пустое.

    Указываете на клиенте метод POST - на сервере ловите параметры методом POST он будет в $_POST.
    Отправляете параметры GET или вшиваете их в url - ловите параметры на сервере в $_GET.
    Вкладываете файл на клиенте - получаете атрибуты файлов на сервере в $_FILES.
    Все просто.
    На клиенте:
    fetch('/foranswer.php', { //указываете скрипт на сервере, который сформирует ответ для клиента
                                                method: 'POST',
                                                headers: {
                                                    'Content-Type': 'text/plain'
                                                },
                                                body: player.signature
                                            });

    На сервере:
    Скрипт foranswer.php
    <?php
    var_dump($_POST); // Посмотрите, а что вообще пришло в пост параметрах.
    // Например, вам нужен параметр param1, забираем его значение из поста
    $param1 = isset($_POST['param1']) ? $_POST['param1'] : null;
    // Если param1 задан - что-то делаем
    if(!is_null($param1))
    {
      // Например, при наличии параметра param1 нужно прочитать некий ресурс на сервере
      $out = file_get_contents("/file.txt");
      // и отдать его содержимое клиенту
      echo $out;
    }
    else
    {
      // Нет обязательного параметра, отдаем ответ клиенту, что что-то не так.
      echo "Нужен обязательный параметр param1";
    }
    ?>
    Ответ написан
    1 комментарий
  • Почему indexOf возвращает первый элемент массива?

    @alexalexes
    finalRes у вас типа целого числа в данной ситуации. У него не будет метода indexOf. Нужен финт ушами, чтобы принудительно преобразовать его в строку:
    let finalRes = item.number + "";
    PS: Ставите ; в строках JS, игнорирование их может сыграть злую шутку.
    Ответ написан
    5 комментариев
  • Реализоват функцию, которая принимает первым параметром объект, вторым - массив из цепочки свойств, по которому нужно пройти, чтобы получить значение?

    @alexalexes
    Зачем создавать отдельную переменную result и присваивать ей obj

    Разработчик этой функции перестраховался, присвоив объект obj локальной переменной функции result, потому что знает, что из контекста функции можно изменять obj во внешнем контексте, если изменять свойства объекта внутри функции, и далее по тексту запланирована некая рекурсия. Однако, переприсваивание самого obj не повлияет на внешний контекст, в этом случае можно не создавать отдельную переменную result (если ничего не делать со свойствами объекта).
    сразу в блоке условия let result = result[chain[i]]

    Ну, мысленно или явно оттрасируйте этот момент:
    // не объявили result, считай он такой
    // result  = undefined
    for (let i = 0; i < chain.length; i++) {
        if (result) { // undefined интерпретируется как false
         let result = result[chain[i]] // сюда вообще не попадаем
        } else {
          result = undefined // сюда попадаем при каждом i, причем result идет во внешний контекст
        }
      }
    Ответ написан
    Комментировать
  • Как правильно вызвать функцию и отрисовать её содержимое в условии цикла без привязки к итерациям?

    @alexalexes
    Вы назвали переменную childBlock, а выбираете в нее все узлы - все выпадающие списки всех child.
    let childBlock = parentBlock.querySelectorAll('.select');

    Тогда уж делайте вложенный перебор. В этом случае будет понятно, на каком уровне foreach какие проверки вставлять.
    let childBlocks = parentBlock.querySelectorAll('.child');
    childBlocks.forEach(child) =>
    {
    // контекст одного элемента child
      let childSelects = child.querySelectorAll('.select');
      childSelects.forEach((select) =>
      {
       // контекст одного элемента select
      ...
       // конец контекста одного элемента select
      });
    // конец контекста одного элемента child
    });

    Точнее, вообще не так.
    Зачем вы выбираете селекты из всего parentBlock, когда нужен контекст текущей карточки.
    Селекты по текущей карточкe, в которой кликнули get, можно получить так:
    let childSelects = e.target.querySelectorAll('.select');
     childSelects.forEach((select) =>
      {
       // контекст одного элемента select
      ...
       // конец контекста одного элемента select
      });
    Ответ написан
    Комментировать