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

    @MikUrrey
    Ответ конкретно на вопрос:
    $pol = mb_convert_encoding($_GET['value'], 'UTF-8', 'windows-1251');
      $pol1 = mb_convert_encoding($_GET['oldvalue'], 'UTF-8', 'windows-1251');

    или
    $pol = iconv('UTF-8', 'windows-1251', $_GET['value']);
      $pol1 = iconv('UTF-8', 'windows-1251', $_GET['oldvalue']);


    Вы, надеюсь, понимаете, где ваш код уязвим, почему его нельзя использовать в реальном проекте и то, что набор функций mysql_* уже давно никто не использует?
    Ответ написан
  • Как я могу обратно прокрутить анимацию keyframes?

    @MikUrrey
    Вообще на счет добавления-удаления классов направление мысли верное, но вроде как писать обратную анимацию больше не нужно - появилось правило
    animation-direction: reverse
    Ответ написан
  • Как закрыть бургер после скролла?

    @MikUrrey
    Потому что querySelector возвращает один элемент, а querySelectorAll возвращает коллекцию (итерируемый объект типа массива).
    const burger__btn = document.querySelectorAll('.menu__item-link');
    //...............
    for(let i = 0, l = burger__btn.length; i < l; i++)
     burger__btn[i].addEventListener('click',  () => {
        menu.classList.remove('active');
        burger.classList.remove('active-burger');
        body.classList.remove('locked');
     })
    }
    Ответ написан
  • JS fetch(): как отличить ошибку CORS от других?

    @MikUrrey Автор вопроса
    Как выяснилось, из соображений безопасности браузеры не делятся с веб-разработчиками причинами блокировок запросов, но с низкой точностью и по косвенным признакам причину ошибки все же можно определить:
    const url = 'some url';
    try {
          const response = await fetch(url);
          //.....
    } catch {
          if (url.startsWith('http:')) {
            console.log(`It's may be a mixed content error`);
          } else {
            try {
              await fetch(url, {'mode':'no-cors'}); //если ресурс доступен, то ошибки не будет
              console.log(`It's may be a CORS error`);
            } catch {
              console.log('Other error');
            }
          }
    }

    Применяя это решение где-либо, имейте в виду, что этот способ не дает 100% точный ответ, является ли ошибка CORS или нет.
    Ответ написан
    2 комментария
  • Как сказать ajax чтобы он брал input или что угодно с блока на который я кликнул?

    @MikUrrey
    $(this) внутри function() {} - это jQuery экземпляр кнопки, по которой вы кликнули в данный момент.
    find() - может селектором забирать элементы внутри заданного экземпляра jQuery.
    Как-то так, значит:
    $('button').on('click', function() {
            var id = $(this).find('input').val();
    ...
    Ответ написан
    1 комментарий
  • В чём здесь ошибка?

    @MikUrrey
    У вас key - объект. Вы его сначала как объект юзаете if (key.status..., а потом в строку вставляете `- ${key}...
    Может быть, ${key.key} ?
    Ответ написан
  • Как отсортировать по цене через Javascript?

    @MikUrrey
    Не представляю, где вы этот код взяли, но часть элементов там вообще от балды.

    Во-первых, costButton, на который вяжется обработчик клика в конце, никак не определен.
    Очевидно, это кнопка сортировки, поэтому заменяем на document.querySelector('#cost-button')

    Во-вторых, const elementsContainer = document.querySelector('.elements__lis');.
    Похоже, list, а не lis - опечатка :)

    В-третьих, costArrow - это, похоже, должна быть картинка, показывающая направление сортировки.
    Её нет, значит, убираем costArrow, убираем аргумент arrow у sortCard и у нее же убираем строку toggleArrow(arrow); (можно так же и саму function toggleArrow выкинуть).

    Вуаля, все работает.

    const allElements = document.querySelectorAll('.elements__item');
    const allPrice = '.elements__item-title_cost';
    
    const elementsContainer = document.querySelector('.elements__list');
    
    //функция по сортировке
    function sortCard(elements, type) {
        let sortingObj = {};
        elements.forEach((element, index) => {
            const elementValue = parseInt(element.querySelector(type).textContent.replace('руб.', '').replace(/\s+/g, ''));
            sortingObj[elementValue] = {'element': element, 'index': index};
        });
            
            const keys = Object.keys(sortingObj);
        
            function numberSort(a, b) {
                a = parseInt(a);
                b = parseInt(b);
                if (a < b) return -1;
                if (a > b) return 1;
              }
            keys.sort(numberSort);
    
            keys.map(function(key, index){
                elementsContainer.insertAdjacentElement('beforeend', sortingObj[key]['element']);
              });
            
    }
    
    
    
    document.querySelector('#cost-button').addEventListener("click", function() {
        sortCard(allElements, allPrice);
    
    })
    Ответ написан
    2 комментария
  • Как сделать кастомный checkbox перед input[type="text"] через JS?

    @MikUrrey
    Если правильно понял вопрос, то
    .form-check-other {
        position: relative;
     }
     .form-check-other .form-check-label{
       position: absolute!important;
       left: 0;
     }

    https://jsfiddle.net/b2vdsk76/
    Ответ написан
  • Проблема в cors политике или нет?

    @MikUrrey
    > Тут проблема в cors политике?
    Посмотрите в Chrome Dev Tools / Network, там будет однозначный ответ.
    > И можно это как-нибудь обойти
    Если это CORS, то только созданием "зеркала" на своем собственном сервере.
    Ответ написан
    3 комментария
  • Как передать массив дат в javascript?

    @MikUrrey
    У вас происходит путаница со структурой из-за того, что вы пытаетесь создавать JSON "вручную".
    Смотрите, тут все просто: вам нужно создать подобный по структуре массив в РНР, а потом сконвертировать его в JSON штатными средствами.
    <?php
    $datejs    = [];
    //...
    $datejs[] = [$YY, $MM, $DD];
    //...
    echo json_encode($datejs);

    json_encode даст на выходе по сути валидный JS код, который можно потом присвоить переменной
    echo '<script type="text\javascript">';
    echo 'var disabled = ';
    echo json_encode($datejs);
    echo ';' . "\n"
    echo '</script>';

    или передать в ответ на AJAX-запрос.
    Ответ написан
  • Как правильно записать функцию (jQuery) чтобы когда мы обновляем страницу значение cheked, подтягивало нужные данные?

    @MikUrrey
    Для начала нужно, чтобы ваш код ждал отрисовки страницы:
    jQuery(function($) { //так в jQuery создается обработчик события DOMReady
        //И уже после того, как страница полностью готова, выполняем код:
        //Получаем value текущей активной радиокнопки. В этом помогает псевдокласс :checked
        let radioValue = $('input[name="radio"]:checked').val();
        //делаем с ним что хотим
        //....
        //остальной код
        $('input[name="radio"]').click(function(){
            var target = $('#block-' + $(this).val());
        
            $('.block-text').not(target).hide(0);
            target.fadeIn();
        });
    });
    Ответ написан
    Комментировать
  • Как исправить исчезновение выпадающего меню при наведение?

    @MikUrrey
    Приветствую!
    Убрать
    .nav-head:hover ~ .nav-submenu {
      display: block
    }

    и вместо него прописать
    .nav-item:hover .nav-submenu {
      display: block
    }

    https://jsfiddle.net/puwkmv20/

    С таким селектором .nav-head:hover ~ .nav-submenu, когда вы уводите курсор на .nav-submenu, .nav-item больше не :hover, и поэтому .nav-submenu больше не display: block (скрывается).

    С .nav-item:hover .nav-submenu, уводя курсор на .nav-submenu, мы всё еще держим :hover на .nav-item, потому что .nav-submenu его потомок.
    Ответ написан
    Комментировать
  • Как сделать форматирование текста в js?

    @MikUrrey
    replace заменит только первое совпадение. Попробуйте заменить его на replaceAll, думаю, получится то, что вам нужно.
    Ответ написан
    1 комментарий
  • Почему не получается задать значение значение по умолчанию не существующему свойству объекта?

    @MikUrrey
    Похоже, это из-за того, что вы не передаете defaultV третьим аргументом здесь:
    return this.getValue(objectValues[valueArray[0]], valueArray.slice(1).join('.'));
    Ответ написан
    Комментировать
  • Товар, умножаем цену на кол-во товара и выводим цену, как сделать?

    @MikUrrey
    Вы сделали так:
    $('.minus').click(function() { ...
    Это вешает клик на все кнопки сразу, и внутри функции будет неудобно разбирать, к какому товару относится кнопка.
    Лучше сделайте селектор для товаров, и перебирайте их циклом, каждому вешая функцию. Вот для примера:
    <div data-product="1920"> ...
    <!-- лучше так вместо id="1920" -->

    $('div[data-product]').each(function() { //собираем все контейнеры товаров и прогоняем по ним цикл
      let $productNode = $(this); //фиксируем jQ-объект товара
      let productId = $productNode.data('product'); //получаем ID товара
      $productNode.find('.plus').on('click', function() {
        //здесь мы уже знаем ID товара (productId) и можем манипулировать
        //элементами внутри контейнера товара с помощью $productNode.find('селектор')
      });
      $productNode.find('.minus').on('click', function() {
        
      });
    });


    Так же в разметке есть ошибка:
    <b id="sum">
    
    <input type="hidden" id="price">
    
    <input type="hidden" id="priceakcia">

    повторяются многократно, id должен быть уникальным в рамках страницы.
    Лучше дайте им, например, атрибут data-role="...", а потом обращайтесь к ним в скрипте через него:
    let price = $productNode.find('input[data-role="price"]').val();
    let priceakcia = $productNode.find('input[data-role="priceakcia"]').val();
    //так вычисляется отпускная цена: если есть акционная, то она становится отпускной
    let sellingPrice = priceakcia? priceakcia: price;
    Ответ написан
  • Инсталляции сайта на Javascript?

    @MikUrrey
    Там JS не нужен по большому счету. Минимум CSS, старый добрый HTML, и PHP, который составляет 95% функциональности подобной подсистемы.
    Конфигурация отправляется из полей POST-запросами и сохраняется обычно в файлы, реже в БД. Почему реже? Потому, что системы настройки обычно настраивают так же и сам доступ к БД.
    Так же из РНР обычно и генерируются input-поля с уже заполненными value.
    Чтобы с непривычки не мучаться с импортами-экспортами-инклюдами конфигурационных файлов, рекомендую использовать JSON - это дёшево и сердито:
    $config = json_decode(file_get_contents(__DIR__ . '/.config'), true); //читаем конфиги
    //...
    file_put_contents(json_encode($config), __DIR__ . '/.config'); //пишем конфиги

    В данном примере .config - с точкой вначале, чтобы конфиги нельзя было открыть и прочитать из браузера - ведь это конфиденциальные данные. `__DIR__` - это магическая константа, путь к папке скрипта, в котором она использована.
    Сохранять конфиги можно как угодно иначе, главное, чтобы они были недоступны из web.
    Так же вам нужно предусмотреть элементарную безопасность: фильтрацию данных, полученных от пользователя.
    Резюмируя, чтобы написать минимальный конфигуратор на РНР, нужно проштудировать информацию о:
    json_encode / json_decode
    file_get_contents / file_put_contents
    htmlspecialchars / strip_tags / preg_match / filter_input

    HTML и CSS, как я понимаю, вы уже и так успешно пользуетесь.
    Ответ написан
    2 комментария
  • Как нативно поменять элемент js по нажатию кнопки?

    @MikUrrey
    Используйте лучше
    Element.innerText = 'volume_off'
    и
    Element.classList.toggle('icon-on')
    Element.classList.toggle('icon-off')
    Ответ написан
    Комментировать
  • Как подключить несколько одинаковых скриптов для управления разными селекторами?

    @MikUrrey
    Передайте селектор как аргумент в самовызывающуюся функцию:
    (function (w, selector) {
        w.addEventListener('DOMContentLoaded', () => {
          function start() {
            w.somename(selector);
          }
          start();
        })
      })(window, "container_N");

    Если у вас не фреймы, вам точно не нужно подключать файл несколько раз.
    Ответ написан
  • Как удалить классы в дочерних элементов у всех?

    @MikUrrey
    const elements = document.querySelectorAll('родительский блок *'); //получаем ВСЕХ потомков
    Array.prototype.forEach.call(elements, element => { //перебираем полученный список
      element.classList.remove( 'доп.класс', 'другой доп.класс', 'еще доп.класс' ); //удаляем ненужные классы
    } ); //element.classList.remove поддерживает любое количество аргументов
    Ответ написан
  • Как сделать array вывод js split?

    @MikUrrey
    //...начиная со строки с $.each:
    
    $.each( files_path, function( key, val ){ 
      html += "https://" + val.replace(/^\/home\/user\/www\//, "") +'<br>'; 
    } )
    //... остальное убираем и далее:
    $('.ajax-respond').html( html );

    то есть, чтобы обработка прошла по всем элементам, все преобразования помещаем в цикл.
    На счет регулярки: если "/home/user/www/" всегда ожидается только в начале, то она справедлива. Если эта подстрока может быть в середине строки, тогда замените ее на такую:
    /.*\/home\/user\/www\//
    Ответ написан
    1 комментарий