Задать вопрос
Ответы пользователя по тегу JavaScript
  • Отправка изображения canvas на сервер PHP?

    @alexalexes
    btn_send.addEventListener('click',async() => {
        let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
        let formData = new FormData(); // Создаем объект формы для наполнения данными, словно мы работаем с тегом form в html.
        formData.append('canvas_field', blob, 'canvas.png'); // это эквивалент тому, что в нашей html форме создаем поле input type="file" name="canvas_field" value="canvas.png" и прикрепляем туда содержимое blob (метод append сам расшаривает blob, дополнительных преобразований не требуется). Естественно, на DOM-дереве это никак не отразится, это модель формы в памяти JS.
        let response = await fetch('web_tp_word.php', {
        method: 'POST',
        body: formData // для fetch не нужно дополнительных параметров, чтобы объяснить как работать с formData. Идеально, чтобы завернуть файл в форму и отправить на сервер.
        });
    });

    На стороне сервера:
    var_dump($_FILES['canvas_field']); // Сервер при вызове скрипта сложит данные файла во временный файл, а как их получить - в $_FILES. Далее можно обрабатывать всеми теми способами, предназначенные для работы с $_FILES. И после уже неважно, как их сгенерировали на клиенте.
    Ответ написан
    1 комментарий
  • Помощь с пониманием устройства debounce?

    @alexalexes
    ...args
    arguments
    Это специальные объекты JavaScript. Их заполняет сама среда интерпретарора JS, когда становится активным контекст вызываемой функции. Очень помогает обрабатывать аргументы функции, когда их количество неизвестно заранее, или нужно специально сделать такую функцию, которая обрабатывает произвольное число аргументов.
    какая из реализаций лучше?
    Если стоит задача написать полифил для поддержки старых версий браузера, то следует использовать объекты JS, которые поддерживаются как можно в ранней версии стандарта языка (смотрите таблицу совместимости браузеров с тем или иным стандартным объектом).
    Если такой задачи нет, то берем стильные, модные, молодежные языковые конструкции.
    Ответ написан
    Комментировать
  • Почему событие onchage не срабатывает для select?

    @alexalexes
    Есть события: click, change, input и т.д.
    Привязка обработчика соответствующего события с использованием атрибута тэга осуществляется с приставкой on:
    <select id="selectTheme" onchange="alert('Theme changed')">
    </select>

    Но в тоже время, привязка обработчика события с использованием addEventListener не требует указания on, берется само название события и с названием атрибута не нужно путать:
    sel.addEventListener('change', (event) => {
        	alert('Theme changed');
        })
    Ответ написан
    3 комментария
  • Как собрать в один массив несколько переменных из input с одинаковыми ID?

    @alexalexes
    Если наступить на горло веб стандарту, игнорируя условие уникальности, то к id нужно относиться как обычному атрибуту тега. Следовательно, для захвата всех элементов с одинаковым id в коллекцию нужно использовать селектор вида:
    input[id="id_imgs"]
    Ответ написан
    1 комментарий
  • Как настроить автоматический вход в личный кабинет на сайт?

    @alexalexes
    В качестве ключа для автоматического входа нужно использовать идентификатор открытой сессии.
    Ни в коем случае не хранить пароль.
    Нежелательно светить логин и id, по которому авторизовывались.
    Идеально, держать подальше идентификатор сессии от JS скрипта, сделать куку только http only и позволить проверять ее только серверу.
    Ответ написан
    2 комментария
  • Стилизация select?

    @alexalexes
    Вместо строчки 42:
    $('select').val(chooseItem).attr('selected', 'selected');

    Используйте:
    $('select option[selected]').removeAttr('selected'); // удаление ранее установленного selected атрибута у одного из option
      $('select option[value="' + chooseItem + '"]').attr('selected', 'selected'); // находим option с нужным value и устанавливаем атрибут selected
    Ответ написан
    Комментировать
  • Как реализовать прокрутку текста с помощью табов?

    @alexalexes
    1. Определяете список заголовков.
    2. Определяете offsetTop у каждого заголовка.
    3. Определяете scrollTop у прокручиваемого блока.
    5. Определяете по offsetTop-ам i-ый и i+1 заголовок, где находится значение scrollTop.
    6. Для стрелки вверх делаете scrollTo до i-ого заголовка.
    7. Для стрелки вниз делаете scrollTo до i+1 заголовка.
    8. Если i-ого или i+1 заголовка нет, то гасите кнопку.
    9. На событии скроллинга нужно анализировать пункты 1-8, чтобы кнопки вовремя гасились.
    Ответ написан
    Комментировать
  • Можно ли задавать кривые Безье для функций js?

    @alexalexes
    https://easings.net/ru#
    Открываете любой график.
    Внизу приведена формула математической функции.
    Ее используете для создания своего JS аналога.
    Ответ написан
    Комментировать
  • Как обрабатывать Undefinded в JSON (Ajax jquery)?

    @alexalexes
    Если у вас железобетонно всегда присутствует объект data.noticeInfo, но временами отсутствует свойство document, то можно проверять наличие так:
    if('document' in data.noticeInfo)
    {
    }

    или так, если нужно различать свойства обусловленные прототипом и доприсвоенные свойства:
    if(data.noticeInfo.hasOwnProperty('document'))
    {
    }

    Если свойство лежит глубоко, а проверять существование цепочки свойств/объектов до него лень, не схлопотав предупреждения отладчика, или запись получается слишком громоздка, то нужен аналог функции isset из PHP для JS.
    if(typeof data.noticeInfo.document != "undefined" && data.noticeInfo.document !== null)
    {
    }
    Ответ написан
    Комментировать
  • Как сортировать с приоритетом массив?

    @alexalexes
    Первым действием перетранслируйте этот массив во вспомогательную структуру:
    {
        100: // groupId
        {
           1:  [1, 3], // source: [id, id, .....]
           2: [2]
        },
       ......
    }

    Тогда вам будет проще снимать метрики для сортировки: считать какие source есть у группы (сколько, каких нет), и какие id входят в source.
    Ответ написан
  • Ошибка Uncaught TypeError: Cannot read property '2' of null?

    @alexalexes
    У вас несоответствие бизнес-логики формирования цены товара на стороне сервера (то что получаете в response.prices), и как вы ее пытаетесь обработать функцией getSapogCost() на стороне клиента. Либо у вас не обрабатываются какие-то исключительные случаи, например, когда товар отсутствует в продаже, а сервер в качестве response.prices не возвращает тот объект, который может обработать данная функция.
    Ответ написан
    Комментировать
  • Почему onClick рабоает перед submit?

    @alexalexes
    <script type="text/javascript">
    $( "form" ).submit(function( event ) {
    event.preventDefault();
    var formData = new FormData(); 
    formData.append("f1",  document.querySelector("input[name='f1']").value);
    formData.append("f2",  document.querySelector("input[name='f2']").value);
    formData.append("f3",  document.querySelector("textarea[name='f3']").value);
    var request = new XMLHttpRequest();
    request.open('POST', 'http://mydape.ru');
    request.onload = function()
    {
      window.location.href="https://google.com"; // перенаправляем на гугль.
    };
    request.send(formData);
    });
    </script>
    Ответ написан
    Комментировать
  • Как добавить текст к value при отправке?

    @alexalexes
    Добавляете еще одно скрытое поле с id="field_name_hidden", видимому полю присваиваете id="field_name_showed". Добавляете форме свой обработчик события onsubmit.
    <form .... onsubmit="my_submit(e)">
    ...
    <label>Имя</label>
    <input id="field_name_showed" type="text"  value=""> <!-- Поле, которое видит пользователь -->
    <input id="field_name_hidden" type="hidden"  value=""> <!-- Скрытое поле для отправки -->

    function my_submit(e)
    {
      e.preventDefault(); // останавливаете выполнение сабмита
      document.getElementById("field_name_hidden").value = document.getElementById("field_name_showed").value + " (добавленный текст)"; // добавляете в скрытое поле формы имя и что хотели еще.
     e.target.submit(); // перезапускаете сабмит формы
    }

    На стороне сервера перехватываете значение поля field_name_hidden.
    Ответ написан
    Комментировать
  • Как зупустить таймер по окончанию?

    @alexalexes
    Создайте функцию получения времени следующего понедельника
    function init_counter_time()
    {
    var d = new Date();
    d.setDate(d.getDate() - (d.getDay() + 6 ) % 7 + 7);
    d.setHours(0);
    d.setMinutes(d.getTimezoneOffset()); // компенсируем смещение временной зоны у пользователя.
    d.setSeconds(0);
    d.setMilliseconds(0);
    return d.getTime(); // обратите внимание, что время извлекается по таймзоне +0000!!!
    }

    И используйте при инициализации:
    // var countDownDate = new Date('10 October 2020 21:00').getTime();
    var countDownDate = init_counter_time();

    и при обнулении счетчика:
    if (distance < 0) {
           // clearInterval(x);
          countDownDate = init_counter_time();
        }
    Ответ написан
    1 комментарий
  • Почему не работает условие ИЛИ?

    @alexalexes
    То что вы пытаетесь написать:
    if (question === 1||3)
    Значит: "условие ИЛИ какое-то число, эквивалентно true". То есть 3 - это эквивалент true. Ноль будет эквивалентом false. Посмотрите, чему будут эквиваленту отрицательные числа, мне лень смотреть документацию или пробовать консоль.

    В вашем случае, решение будет выглядеть так:
    if (question === 1|| question === 3)
    Если охота использовать перечисление в надежде сократить условие, то это может выглядеть так:
    if ([1,3].indexOf(question) > -1)
    Ответ написан
    Комментировать
  • Как сосчитать повторяющиеся буквы?

    @alexalexes
    Вариант с минимальными изменениями
    function RST(str){
    let arr = str.split('');
    let num = 1;
    let result = '';
    for(let i = 1; i < arr.length; i++){
      if(arr[i] == arr[i-1]){
        num++;
      } else {
        result += arr[i-1] + num; // тут была ошибка
        num = 1;
      }
    }
    // Нужно допечатать последнее накопление num
    if(arr.length > 0)
     result += arr[arr.length-1] + num;
    return result;
    }
    Ответ написан
    Комментировать
  • Какой самый быстрый способ итерации массива в JS?

    @alexalexes
    Если заостряться в оптимизации скорости циклов, то я js/php придерживаюсь двух правил:
    1) Если количество элементов в массиве на протяжении всего цикла не предполагает изменения, то количество элементов лучше посчитать заранее. Так мы избежим обращения к length при каждой итерации, если интерпретатор совсем туп.
    2) Если к i-му элементу идет много обращений в течении одного хода цикла, то этот элемент лучше вытащить отдельным указателем на него.
    Все остальное - экономия на спичках.
    var item_count = array.length; // считаем заранее кол-во
    for(var i = 0; i < item_count; i++)
    {
      var item = array[i]; // вытаскиваем ссылку на элемент для простоты доступа
      ...
    }
    Ответ написан
    Комментировать
  • Как сделать валидацию формы на стороне клиента в реальном времени?

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

    @alexalexes
    Возьмите элементы с помощью getElementsByClassName и переберите их в цикле, вставив нужные сведения.
    var elems = document.getElementsByClassName('your_class');
    var elem_count = elems.length;
    for(var i = 0; i < elem_count; i++)
    {
       elems[i].innerHTML = 'Какие-то данные';
    }
    Ответ написан
    Комментировать
  • Как перехватить защищенный JS?

    @alexalexes
    Вам поможет среда PhantomJS.
    https://github.com/diggin/php-PhantomjsRunner
    В ней подожгете событие на нужной кнопке, подождете чуть-чуть и выцепите ссылку.
    Ответ написан