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

    @alexalexes
    Посмотрите функцию showCart. При каких условиях она рисует пустую корзину, такое состояние поставьте в cart.
    function delGoods()
    {
        cart = {}; // ... я поставил пустой объект, к примеру.
        saveCart();
        showCart();
    }
    Ответ написан
    Комментировать
  • Как в js div тянуть другому div?

    @alexalexes
    Копать в математику 7 класса или в алгебру 1 курса универа, раздел "линейные функции".
    Дано:
    1. координата курсора мыши в момент захвата блока: (x1, y1);
    2. координата курсора мыши после протягивания: (x2, y2);
    3. координата центра красного блока: (x3, y3);
    4. координата центра синего блока: (x4, y4);
    Проблема 1 - как определить, можно двигать блок или нет?
    Ответ 1.
    Замечаем, что точки (x1, y1) и (x2, y2) - образуют линию L1 - это прямая траектория движения мыши.
    А точки (x3, y3) и (x4, y4) - образуют линию L2 - это прямая траектория, по которой должен двигаться один из квадратов.
    L1 имеет коэф. линейной функции k1, который вычисляется как k1 = ((y2 - y1) - b1) / (x2 - x1);
    L2 имеет коэф. линейной функции k2, который вычисляется как k2 = ((y4 - y3) - b2) / (x4 - x3);
    Но на самом деле, нас интересуют не эти коэф-ты, а дифференциалы, поэтому b1, b2 - постоянные коэф. можно откинуть:
    d1 = (y2 - y1) / (x2 - x1);
    d2 = (y4 - y3) / (x4 - x3).
    Когда можно двигать блок?
    Когда d1 ~ d2 c некоторой погрешностью r, то есть:
    |d1 - d2| <= r1
    Коэф. ошибки r1 будет больше, чем меньше (y2 - y1), (y4 - y3), (x2 - x1), (x4 - x3).
    Коэф.-ты d1, d2 имеют невычисляемые случаи, когда x2 = x1, или когда x4 = x3, но строгости равенства трудно добиться, поэтому проверяем на коэф. ошибки малой величины r2.
    (x2 - x1) <= r2 или (x4 - x3) <= r2.
    Сначала проверяется возможность вычисляемости d1 и d2.
    если они вычисляемые и критерий |d1 - d2| <= r1 выполняется, то блок двигать можно.
    Если один из диф-лов не вычисляем, а другой - вычисляем, то блок двигать нельзя.
    Если оба диф-лов невычисляемы, то если у (y2 - y1) и (y4 - y3) знак результата одинаков, то блок двигать можно.
    Это только конец первого этапа, дальше вам пригодятся d1, d2 коэф.-ты, а также нужно вычислить интервал соприкосновения блоков, но эта уже другая история.
    Ответ написан
    Комментировать
  • Как отследить появление элемента на экране и получить его id?

    @alexalexes
    Самым ленивым способом эту функцию можно переписать так:
    var block_show = []; // начальный массив, можно не инициировать null-ами
     
    function scrollTracking(){
      var wt = $(window).scrollTop();
      var wh = $(window).height();
      var elems = $();  // тут пишем селектор для выбора коллекции элементов, позиции которых нужно отследить
      var elem_count = elems.length;
     // перебираем элементы, и выводим что появилось на экране, что нет.  
      var et = null, eh = null;
    for (var i = 0; i < elem_count; i++)
      {
     et = elems[i].offset().top;  // тут уже получаем параметр от i-ого элемента
       eh = elems[i].outerHeight(); // тут уже получаем параметр от i-ого элемента
     
      if (wt + wh >= et && wt + wh - eh * 2 <= et + (wh - eh)){
        if (block_show[i] === undefined || block_show[i] === null || block_show[i] === false) { // анализ block_show тоже от i-ого элемента
          console.log('Блок ' + i + ' в области видимости');
        }
        block_show[i] = true;  // установка block_show тоже от i-ого элемента
      } else {
        if (block_show[i] === undefined || block_show[i] === null || block_show[i] === true) { // анализ block_show тоже от i-ого элемента
          console.log('Блок ' + i + ' скрыт');
        }
        block_show[i] = false; // установка block_show тоже от i-ого элемента
      }
      } // конец цикла обхода отслеживаемых элементов
    }

    Обратите внимание, что в if-ах проявилось сравнение с undefined, это позволяет не создавать первоначальный массив, наполненный null-ами, но можно наполнить по числу отслеживаемых элементов. И все сравнение идут по === это позволяет учитывать типы переменных при сравнении, оно более строгое.
    Ответ написан
  • В чем может быть ошибка Select2?

    @alexalexes
    К переменной data применяют метод работы с массивом slice(), но в этот момент data не является массивом (он же object в понимании JS).
    Такие ошибки возникают, когда перед обработкой массива забывают прописать исключительные состояния, когда объект data может быть сформирован не в виде пустого массива, а, например, может содержать в себе сведения об ошибке, переданные из слоя абстракции, который в обычной ситуации генерирует data как массив.
    Ответ написан
    Комментировать
  • Почему js переменная выводится как объект?

    @alexalexes
    Переменная itemImg у вас как объект DOMElement.
    Его нельзя просто так вставить в строковое представление HTML.
    Чтобы получить itemImg как HTML строку, нужно проделать такой кульбит с использованием контейнера:
    var wrap = document.createElement('div'); //побочный контейнер для извлечения innerHTML
    wrap.appendChild(itemImg.cloneNode(true)); // клонируем внутрь контейнера интересуемый элемент
    var itemImgAsHTML = wrap.innerHTML; // извлекаем содержимое контейнера как HTML строку, то что вам и нужно.

    Потом это примените тут:
    var itemResult = "<div class='order-item'><div class='order-item__data-left'><div class='order-item__data-left__img'>"+itemImgAsHTML+"</div><div class='order-item__data-left__item-data'>${itemName}${itemVendorCode}</div></div><div class='order-item__data-right'><div class='order-item__data-right__delete-item'><button class='delete-item'>Удалить</button></div><div class='order-item__data-right__item-price'><h3>Цена: ${itemPrice}р</h3></div></div>";// Записываю нужную мне конструкцию для вставки в корзину

    PS: Можно предельно сократить преобразование:
    var itemResult = "<div class='order-item'><div class='order-item__data-left'><div class='order-item__data-left__img'>"+document.createElement('div').appendChild(itemImg.cloneNode(true)).innerHTML+"</div><div class='order-item__data-left__item-data'>${itemName}${itemVendorCode}</div></div><div class='order-item__data-right'><div class='order-item__data-right__delete-item'><button class='delete-item'>Удалить</button></div><div class='order-item__data-right__item-price'><h3>Цена: ${itemPrice}р</h3></div></div>";// Записываю нужную мне конструкцию для вставки в корзину
    Ответ написан
  • Как найти значение которое генерируется в js?

    @alexalexes
    Если значение переменной v44 будет иметь предсказуемую позицию на странице (или в куках, или в глобальном объекте JS - window) после выполнения всех операций ее подготовки и загрузки, то вполне возможно получить нужный результат, если воспользоваться средой Selenium. Она позволяет создать окружение для получения страницы аналогично полноценному браузеру и позволяет манипулировать компонентами окружения в том числе для извлечения данных.
    Ответ написан
  • Нужно ли указывать заголовок Content-Type: form/multipart прии отправке формы?

    @alexalexes
    https://ru.wikipedia.org/wiki/Multipart/form-data
    Есть работа с отправкой файлов?
    - Есть. нужен заголовок.
    - Нет, тогда не нужен заголовок.
    Ответ написан
    Комментировать
  • Можно ли получить индекс элемента масива, если значение этого элемента повторяющееся?

    @alexalexes
    Ну так работайте с тем объектом, который кликнули.
    https://developer.mozilla.org/ru/docs/Web/API/Even...
    Ответ написан
    Комментировать
  • Как запретить перенос строки в textarea?

    @alexalexes
    Добавьте на textarea два обработчика события keydown, как на запрет перевода строки, так и на отправку контента.
    $(document).keydown(function (e) {
            if (e.which == 13) {
                document.getElementById("commentAdd").click();
                document.getElementById("messageArea").value = "";
                        }
        });
    
    $('textarea').on('keydown', function( el ) {
            if( el.keyCode === 13 ) {
                el.preventDefault();
                whenEnterPressed();
            }
        });
    Ответ написан
    1 комментарий
  • Как сделать чтобы iframe подстраивался под адаптивный html внутри него?

    @alexalexes
    iframe - самый древний у дубовый тег по части адаптивности.
    Им можно управлять, задавая конкретные значения ширины и высоты, запрашивая состояние скроллбаров.
    var iframe = document.getElementById('fileUploadIframe');
     iframe.width = iframe.contentWindow.document.body.scrollWidh + "px";
     iframe.height = iframe.contentWindow.document.body.scrollHeight + "px";

    Когда корректировать эти параметры? Нужно смотреть случаи, когда контент Iframe меняется и вешать выполнение этих строк на соответствующие обработчики событий.
    Ответ написан
    Комментировать
  • Как обойти граф?

    @alexalexes
    Найдите путь по алгоритму Дейкстры между двумя интересуемыми вершинами.
    Все вершины и дуги, которые не входят в этот путь - зачистить.
    Ответ написан
    Комментировать
  • Как скрыть элементы между элементами с определённым классом?

    @alexalexes
    На чистом JS будет так.
    ....
       <tr class="Item-service" onclick="hide_trs(this)"></tr>
    ....

    function hide_trs(target)
      {
            var parent = target.parentNode;
            var tr_nodes = Array.prototype.slice.call(parent.getElementsByTagName('TR'));
            var tr_count = tr_nodes.length;
            var target_index = tr_nodes.indexOf(target);
            for(var i = target_index + 1; i < tr_count; i++)
            {
              var cur_tr = tr_nodes[i];
              if(cur_tr.className !== 'Item-service')
                cur_tr.style.display = 'none';
              else
                break;
            }
      }

    PS: Есть ограничения:
    1) В строках нельзя использовать вложенные таблицы ( tr_nodes - получит все строки вложенных таблиц в том числе);
    2) Кликабельному tr нельзя добавить еще класс (идентификация следующего кликабельного tr производится строго по содержимому свойства класса cur_tr.className !== 'Item-service')
    Ответ написан
    Комментировать
  • Как сменить select средствами jquery?

    @alexalexes
    Для такой тривиальной операции jquery не нужен:
    document.querySelector('select[name="product[status]"]>option[value="0"]').selected = true;
    Ответ написан
    Комментировать
  • Где найти смену ссылки в jS?

    @alexalexes
    Скрипт обфусцирован. Логику его работы можно понять только по поведению dom-элементов.
    5de931052ee5a459163007.png
    a-контейнер одного элемента img лежит точно над другим a-контейнером другого img-элемента.
    И попеременно меняется style у a-контейнеров. В переходном процессе используется изменение свойства прозрачности и отображения, за счет чего достигается плавная смена одного изображения на другое.
    Ответ написан
    Комментировать
  • Как работает цикл while в моем примере?

    @alexalexes
    Сделайте подробную трассировку решения.
    Код объяснит себя сам как он работает.
    let j = 1;
      while (i > 0) {
        i--;
        out15.textContent += 'шаг цикла=' + j + '; ' + 'i='+ i + '; (10-i)='+(10-i)+'<br/>';
       j++;
      }
    Ответ написан
    Комментировать
  • Как удалить добавленный класс?

    @alexalexes
    Скорее всего код удаления класса будет выглядеть так:
    $('.close-popup').on('click', function(event){
        $('.clicked').removeClass('clicked');
        event.stopPropagation();
      });

    PS: Обратите внимание на наличие дескриптора event во входном параметре обработчика события.
    PPS: Справка по теме всплытие и погружение в JS.
    Ответ написан
    Комментировать
  • Как закодировать URL utf8 в cp1251?

    @alexalexes
    Если проанализировать сервис https://service.webboss.pro/urlencode-urldecode , то в нем используется файл https://webboss.pro/js/plugin/urlencode.js , в котором есть функция convert_to_cp1251(str).
    Возможно, этого вам будет достаточно.
    Ответ написан
    3 комментария
  • Не могу понять работу метода .map?

    @alexalexes
    **
    Пройдемся по массиву и вернем новый массив с такими элементами:
    Если шагнули на нулевой элемент (index == 0), то вернем слово как элемент в новый массив как есть (.... ? word : ....)
    Если шагнули на ненулевой элемент, то Меняем регистр у первой буквы (... : word[0].toUpperCase() + word.slice(1)...) и вернем результат как элемент в новый массив.
    Ответ написан
    Комментировать
  • Winwheel.js Как высчитать на каком сегменте остановится колесо?

    @alexalexes
    Читайте комментарий.
    // This formula always makes the wheel stop somewhere inside prize 3 at least
    // 1 degree away from the start and end edges of the segment.

    Сектор "Приз 3" находится за 90-ым градусом по часовой стрелке.
    Чтобы попадать туда, минимально число должно генериться чуть более 90, например, 91.
    Рандом генерирует веществ. числа в интервале 0...1.
    Нам нужно не выбежать из сектора за верхнюю границу.
    Секторов 8, на один сектор приходится 45 градусов.
    91 + 45 = 136 градусов, убежали в следующий сектор.
    Берем 44, оказываемся на границе секторов.
    Берем 43 - то, что надо, нашли верхний предел генерации параметра (134 градуса).
    PS:
    91 - это минимальный параметр;
    43 - макс. внутрисекторное смещение.
    Ответ написан
    2 комментария