Ответы пользователя по тегу JavaScript
  • Как изменить размер (scale) объекта используя перетаскивания в js canvas?

    @alexalexes
    Очевидно же, что не нужно использовать преобразование функции, если аргументы содержат недопустимые значения. Делайте контроль допустимых значений перед применением функции. Если аргумент один - то у вас два состояния работы функции: обычное, и вырожденное. Если два аргумента, то четыре состояния: 1) обычное по X, обычное по Y; 2) обычное по X, вырожденное по Y; 3) вырожденное по X, обычное по Y; 4) вырожденное по X, вырожденное по Y.
    Ответ написан
    Комментировать
  • Как переписать код на более современный JS?

    @alexalexes
    Эта пуленепробиваемая конструкция будет работать и через 100 лет. Ничего не меняйте.
    Ответ написан
    Комментировать
  • Как на один элемент повесить два события, клик и двойной клик?

    @alexalexes
    this.content.querySelectorAll('.cell').forEach((cell) => {
      let timer = null; // дескриптор отложенного обработчика одного клика
      cell.addEventListener('click',  (e) => {
         if(timer)
           clearTimeout(timer); // при каждом клике сбрасываем отложенный обработчик обработки одного клика
         if(e.detail == 1) // на первом клике устанавливаем отложенный обработчик
           timer = setTimeout(handleClickCell, 250); // Выполнение функции по одинарному клику после ожидания второго клика 250мс
         if(e.detail == 2) // на втором - выполнение обработчика двойного клика
         {
            // благодаря счетчику detail в ивенте можем посчитать длину очереди непрерывных кликов, и в нужный момент выполнить функцию на втором клике
            console.log('111');
         }
        } );
    });
    Ответ написан
    1 комментарий
  • Как реализовать drug n drop тестирование?

    @alexalexes
    адаптивности при таком раскладе не возможно добиться

    Сделайте 2, 3 варианта картинок под разные разрешения. В JSON-e сообщите серверу, какой вариант тестили.
    p.s.: я думал сделать сеткой, т.е. типа как пазл картинка состоящая из одинаковых квадратиков (тогда это будет проще)

    Будет ниже энтропия, потенциальному роботу будет проще комбинировать варианты, чтобы выбрать случайно правильный.
    Еще, вы не сможете сделать так, чтобы квадраты точно устанавливались на свои места, будет неточность 1...10px.
    Можете взять формулу Пифагора и смягчить живому пользователю невозможность установить квадраты точно - у всех квадратов нестыковка по радиусу должна быть не больше определенного порога R0. Критерий проверки будет корень(dx^2 + dy^2) < R0. Где, dx - разность по X координат ориг. и установ. квадрата, dy - тоже разность по Y.
    R0 в пределах точности сенсора, скорее всего будет в 5...10px. Меньше поставите значение - пользователям будет сложнее проходить тест, больше поставите - уменьшите энтропию для роботов.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы музыка включалась сама тогда, когда изображение с ID "seconds" достигало поворота в 0 градусов?

    @alexalexes
    При попытке вызвать play(), вы получаете сообщение об ошибке в консоли:
    failed because the user didn't interact with the document first

    Это значит, вы не можете пользователю включить звук, если он никак не взаимодействовал с панелью управления тега audio.
    Это концепция предусмотрена разработчиками браузера, чтобы разработчики сайтов не использовали звуковые эффекты на своих сайтах вопреки ожиданию пользователей.
    Ответ написан
    Комментировать
  • Как отправить на почту JS данные Modx?

    @alexalexes
    По хорошему, вы в форму на стороне JS должны положить ID карточки товара в скрытое поле.
    На сервере, в сниппете AjaxForm нужно добавить хук, который по ID карточки товара получит все необходимые атрибуты этой карточки запросом из базы, считает необходимый файл превьюшки товара с каталога сервера и дополнит тело письма этими дополнительными атрибутами, или бинарником файла картинки/корректной внешней ссылкой на картинку.
    Это будет самый корректный вариант реализации.
    Ответ написан
    Комментировать
  • Как передать переменную из Js в python(Flask)?

    @alexalexes
    1. На JS любым способом сделать ajax запрос на сервер, передав нужный набор параметров для обработки.
    2. Обработать запрос на серверe, передать клиенту результат.
    3. На JS обработать результат в callback функции ajax.
    Примерная заготовка, как это будет на стороне JS:
    function getValue()
    {
      let xhr = new XMLHttpRequest();
      xhr.open("POST", "" /*<- тут должен быть адрес скрипта на сервере, где будет обработка запроса */, true);
      // создаем виртуальную форму, чтобы нагрузить запрос параметрами
      let t_form = new FormData();
      // нагружаем параметром форму
      t_form.append("input-id", document.getElementById('input-id').value);
      // ... еще какой-то параметр
      // t_form.append("какой-то параметр", "какое-то значение");
       // callback функция ответа
       xhr.onreadystatechange = function(e)
      {
         // состояние, когда ответ сформирован
         if(xhr.readyState === 4 && xhr.status === 200)
         {
             // что-то делаем с ответом, например выводим сообщение
              alert(xhr.responseText);
          }
       };
       // отправляем запрос на сервер, нагружаем его формой с параметрами
       xhr.send(t_form);
    }
    Ответ написан
    1 комментарий
  • Как посчитать разницу по координате х за клик мыши?

    @alexalexes
    // инициализация значений по умолчанию (тело конструктора, если использовать ООП. В классе будете использовать this контекст класса вместо window)
        window.is_mouse_catch = false; // зажата ли мышь?
        window.mouse_path = 0.0; // путь мыши
        // предыдущие координаты мыши
        window.cl_X = null;
        window.cl_Y = null;
        // конец инициализации
        // обработчик нажатия кнопки
        document.addEventListener('mousedown', function(e)
        {
          // фиксируем параметры мыши в переменных, за пределами локальной области видимости обработчика
          window.is_mouse_catch = true;
          window.mouse_path = 0.0;
          window.cl_X = e.clientX;
          window.cl_Y = e.clientY;
        });
        // обработчик отпускания кнопки
        document.addEventListener('mouseup', function(e)
        {
          // фиксируем отпускание кнопки мыши в переменной, за пределами локальной области видимости обработчика
          window.is_mouse_catch = false;
        });
        // обработчик движения мыши
        document.addEventListener('mousemove', function(e)
        {
          // если кнопку не нажимали, то прерываем обработчик
          if(window.is_mouse_catch === false)
            return;
          // определяем текущие координаты
          let currentX = +e.clientX;
          let currentY = +e.clientY;
          // считаем дельту пути
          let delta = ((currentX - window.cl_X) ** 2 + (currentY - window.cl_Y) ** 2) ** 0.5;
          // приращиваем дельту пути к общему результату
          window.mouse_path += delta;
          // переопределяем предыдущие координаты
          window.cl_X = currentX;
          window.cl_Y = currentY;
          // пишем в лог
          console.log('currentX: ' + currentX + '; currentY: ' + currentY + ' delta: ' + delta + '; total_path: ' + window.mouse_path);
        });
    Ответ написан
  • Зачем нужен блок инструкций без управляющей инструкции?

    @alexalexes
    var currentExtraStackFrame = null; // это нужно, чтобы не словить предупреждение в консоль undefined variable/property при обращении к свойству currentExtraStackFrame
    // этим методом вы задаете какое-то значение для свойства currentExtraStackFrame, если его нужно привести в какое-то не null значение (или вернуть в null - значение по умолчанию).
    function setExtraStackFrame(stack)
    {
      // if() тут может была лексема if, можно просто ее закомментить и не убирать скобки, чтобы git не анализировать их исправление, и так будет работать
      {
        currentExtraStackFrame = stack;
      }
    }
    Ответ написан
    2 комментария
  • Насколько опасно использование конструктора Function?

    @alexalexes
    такой способ представляет угрозу для безопасности

    Потому, что если злоумышленник будет иметь возможность статично внедрять HTML-фрагменты в тело документа, не имея доступа к интерпретатору JS пользователя, то с помощью атрибута data-format-value он эту возможность получит напрямую, так как может вставлять любой код JS в этот атрибут, получая доступ к локальному хранилищу, кукам. Если по кукам он не угонит сессию пользователя, то хотя бы сможет составить его фингерпринт.
    Ответ написан
    7 комментариев
  • Как импортировать данные из .docx файла в JavaScript логику?

    @alexalexes
    Из ворда же можно сохранить как HTML.
    Пересохраните в веб-формат, а уже внутри пишите наколеночный скрипт для парсинга в массив.
    Ответ написан
    Комментировать
  • Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    @alexalexes
    Нужно. Хотя бы вставить решение простой капчи вида:
    2 + 8 = ?

    Если боты позарятся на ваше творение, и будут обходить решалку, то поставить уже капчу с изображением на своем модуле. Если и ее будут ломать, то воспользоваться сторонними капча API.
    Ответ написан
    1 комментарий
  • Как передать значение переменной из JS в PHP без перезагрузки страницы?

    @alexalexes
    В php скриптах не обязательно всегда отдавать клиенту html-текст, тем более в виде статики (за пределами тегов <? ?>).
    А если вы еще используете ajax, обращаясь к тем же скриптам, что формируют полную html страницу, то можно отдавать ответ гораздо гибче (отдавать только чистые данные, без html в случае AJAX, и в остальных случаях - html оснастку, чтобы браузер нарисовал начальное состояние страницы):
    <?php
        if(isset($_POST['checkout']))
        {
          // получили параметр, который используется в AJAX - отдаем только данные (числа, строки, или json объекты)
           echo 'posted:'.$_POST['checkout'];
        }
       else
       {
         // не получили специфичных для ajax параметров - отдаем клиенту обычный HTML
          echo '<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <div><?php echo $test ?></div>    
        <script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
        <script type="text/javascript" src="script.js"></script>
    
    </body>
    </html>';
       }
    ?>

    На этом строят API своей системы.
    Ответ написан
    Комментировать
  • Как реализовать форму?

    @alexalexes
    Эффективней всего использовать фреймворки для пользовательских интерфейсов. Например, Vue JS.
    За счет реактивности вы можете подвязаться как к элементам ввода в DOM, так и к состоянию объектов в window, и отрисовывать по собственной семантике шаблонов vue не только целые формы, но и изменять состояние отдельных тегов, по изменению состояния других объектов формы или внутренней логике JS.
    Ответ написан
    Комментировать
  • Как с помощью jQuery повторить событие oninput и вызов функции при нажатии на button?

    @alexalexes
    $('.plus').click(function(e) {
     checkNumber(
    // про this - сюда вставьте указатель на ноду HTML - конкретный экземпляр инпут с классом намбер, который будете проверять. Будьте внимательны, если на странице несколько input.number, возможно, выбранный вами способ будет захватывать первый попавшийся input.number. Добейтесь того, чтобы захватывался только тот намбер, соседом которого является плюс или минус (можно через родительский контейнер вычислить это).
    
    // про event. Возможно, возможно, внутри реализации checkNumber, допустим есть отмена действия по умолчанию, или остановка всплытия события, посмотрите, будет ли отличия от события oninput на намбере. Можно попробовать передать указатель события клика от плюса/минуса (обратите внимание на аргумент e в function(e) )
    
    // про '1' - если заглянуть в хрустальный шар - реализацию функции checkNumber, то можно предположить, что это значение по умолчанию или минимальное значение поля input.number )
    });
    Ответ написан
    Комментировать
  • Как приручить событие "keydown" в браузере?

    @alexalexes
    Чтобы вовремя удалить обработчики, нужно их методы деанонимизировать - присвоить имена или иметь где-то указатели на оригинал обработчика, чтобы внутри обработчика он смог снять сам себя с события.
    let setSpeedToUpHandler = function(e)
    {
      if(e.key === " "){
          document.removeEventListener("keydown", setSpeedToUpHandler); // удаляем текущий обработчик с этого типа события 
         setMovementSpeedToSpeedUp(); // увеличиваем скорость персонажа
      };
    };
    let setMovementSpeedToNormalHandler = function(e)
    {
      if(e.key === " "){
         document.removeEventListener("keyup", setMovementSpeedToNormalHandler); // удаляем текущий обработчик с этого типа события 
         setMovementSpeedToNormal(); // устанавливаем скорость на нормальное значение
      };
    };
    document.addEventListener("keydown", setSpeedToUpHandler);
    document.addEventListener("keyup", setMovementSpeedToNormalHandler);
    Ответ написан
    Комментировать
  • Как вставить скрипт, чтоб он не открывался на всю страницу?

    @alexalexes
    Либо обращайтесь к разработчикам виджета - help@unitiki.com
    Либо смотрите, какие ccs-селекторы воздействуют на модальное окно виджета и пытайтесь перебить их свойства своими css-стилями.
    Ответ написан
    Комментировать
  • Не видит значение input, как исправить?

    @alexalexes
    Вам нужно получить значение текстового поля так:
    var intxt = document.querySelector('input').value;
    Как раз это и будет строка, у которой можно посмотреть length.
    Ответ написан
    Комментировать
  • Выбор меню. Оставить фокус при загразки другой html?

    @alexalexes
    Вариант 1, решение на коленке, которое нужно здесь и сейчас.
    Написать костыль на JS в виде функции, которая возьмет подстроку из текущего url и произведет поиск нужной ссылки в меню с таким же href атрибутом, и поставит найденному html элементу класс активного элемента (или контейнеру ссылки - li элементу). Не забудьте прогуляться до первого уровня меню и тоже расставить классы активного элемента, если у вас меню многоуровневое.

    Вариант 2, как должно быть.
    У вас во входном скрипте index.php должен быть реализован примитивный роутинг url.
    Благодаря роутеру для каждой страницы вы точно можете получить путь из компонентов адреса.
    Например, site.com/page1/subpage2.
    От роутера вы легко можете получить путь к странице, хотя бы в таком виде:
    $page_path = ['page1', 'subpage2'];
    Также меню должно формироваться динамически, из какой-то сохраненной структуры, пусть структура будет статичной.

    $site_menu =
    [
       'page1' =>
       [
          'title' => 'Страница 1', 
          'child' => 
          [
             'subpage2' => ['title' => 'Субстраница 2', 'child' => []]
          ]
      ],
      'page2' =>
       [
          'title' => 'Страница 2', 
          'child' => []
      ],
    ];

    Примерная функция для формирования меню:
    // рекурсивная функция для получения сверстанного меню из структуры
    function get_main_menu(
       $curr_menu, //часть меню текущего уровня
       $level, // номер текущего уровня
       $menu_path, // путь к текущему уровню меню
       &$page_path // путь к текущей странице 
    )
    {  
      $out = '';
      if(count($curr_menu) > 0)
      {
        $out .= '<ul class="main-menu main-menu_level-'.$level.'">';
        foreach($curr_menu as $key_item => $menu_item)
        {
            $out .= '<li class="main-menu__item '
                     .($page_path[$level] == $key_item ? 'main-menu__curent' : '') // определяем текущий пункт меню
                   .'"><a href="'.$menu_path.'/'.$key_item.'">'.$menu_item['title'].'</a>';
            get_main_menu($curr_menu['child'], $level + 1, $menu_path.'/'.$key_item, $page_path); // рекурсивный вызов функции для прорисовки следующего уровня
            $out .= '</li>';
        }
        $out .= '</ul>';
      }
      return $out;
    }
     // получаем html-фрагмент меню по структуре
     $out_site_menu = get_main_menu($site_menu, 0, '', $page_path);
    Ответ написан
    1 комментарий
  • Как передать данные js в php?

    @alexalexes
    1) Разобраться с клиент-серверной архитектурой вашей поделки. Научиться не путать код, который выполняется на клиенте, и код, который выполняется на сервере.
    2) Передать сведения от клиентской части вашего приложения на серверную по любой технологии: ajax, websocket или банальный редирект с get/post параметрами.
    Ответ написан
    Комментировать