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

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Тебе нужно повесить событие изменения (change) на select, затем отправить AJAX к серверному скрипту который вернёт JSON список дочерних категорий для только что выбранной категории.

    Пример для JQuery:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
      </head>
      <body>
    
        <!-- Select родительских категорий -->
        <select name="categoryfilter">
          <option disabled="disabled" selected value="">Выберите категорию</option>
          <option value="1">Категория 1</option>
          <option value="2">Категория 2</option>
        </select>
    
        <!-- Select дочерних категорий -->
        <select name="subcategories"></select>
    
        <!-- Подключение JQuery для примера -->
        <script
            src="https://code.jquery.com/jquery-3.6.0.min.js"
            integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
            crossorigin="anonymous"></script>
    
        <!-- Логика клиентской части -->
        <script type="text/javascript">
          // Вешаем событие изменения на селект категорий
          $('select[name="categoryfilter"]').on('change', function(){
            let val = $(this).val(); // value только что выбранной категории
            $('select[name="categoryfilter"]').html(''); // Очищаем фильтр дочерних категорий
    
            //Запрашиваем данные
            $.ajax({
              url: '/path/to/file', // Путь к файлу PHP от корня сайта
              type: 'POST', // Отправляем данные методом POST
              dataType: 'json', // Ждём что сервер вернёт JSON
              data: {
                category: val, // Отправляем переменную 'category' со значением 'val'
              },
            })
            .done(function(data) {
              // Когда сервер вернул JSON
              // Перебираем данные циклом
              $.each(data, function(index, item) {
                // Добавляем внутрь select'а дочерних категорий новые опции
                $('select[name="subcategories"]').append('\
                  <option value="' + item.id + '">' + item.name + '</option>\
                ');
              });
            })
            .fail(function() {
              // Любая ошибка
              console.log("error");
            })
            .always(function() {
              // Когда запрос завершился успешно или с ошибкой
              console.log("complete");
            });
          });
        </script>
      </body>
    </html>


    Неполная серверная часть на PHP:
    <?php
    
    	//Тут должна быть логика загрузки нужных дочерних
    	//категорий согласно пришедшему значению 'category' ($_POST['category'])
    
    	$subCategories = [
    		[
    			'id' => 1,
    			'name' => 'Дочерняя категория 1',
    		],
    		[
    			'id' => 2,
    			'name' => 'Дочерняя категория 2',
    		],
    		[
    			'id' => 3,
    			'name' => 'Дочерняя категория 3',
    		],
    	];
    
    	//json_encode превращяет массив PHP в JSON, который ждёт AJAX
    	exit(json_encode($subCategories));
    ?>
    Ответ написан
    Комментировать
  • Почему не работает onblur на textarea?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Вот решение твоей задачи.
    Дело в том что ты пытаешься повесить событие "onblur" на ещё не существующий элемент.

    <div onclick="transformToTextarea(this);" style="width: 50px; height: 50px; background-color: blue;"></div>

    function transformToTextarea(el) {
      el.outerHTML = '<textarea onblur="transformToDiv(this);">' + el.innerHTML + '</textarea>';
    }
    function transformToDiv(el){
      el.outerHTML = '<div onclick="transformToTextarea(this);">' + el.value + '</div>';
    }

    В данном случае заранее объявлено две функции, а в событии через атрибуты самого элемента указывается их вызов.
    Ответ написан
    5 комментариев
  • Как при скролле создать класс и переместить в него некоторые элементы?

    rc-dm
    @rc-dm
    Full-Stack Web Developer
    Решение

    Исходный HTML
    <h2>Greetings</h2>
    <div class="container">
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
    </div>

    Вставляем элемент "h2" внутрь элемента с классом "container"
    ("prepend" - в начало / "append" - в конец)
    $('.container').append($('h2'));

    Результат
    <div class="container">
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
      <h2>Greetings</h2>
    </div>


    Ты можешь не только использовать это на существующем элементе, но и создать новый налету
    $('.container').prepend('<h1>Hello World!</h1>');

    <h2>Greetings</h2>
    <div class="container">
      <h1>Hello World!</h1>
      <div class="inner">Hello</div>
      <div class="inner">Goodbye</div>
    </div>


    Если я правильно понял, ты хочешь сделать "липкую" панель навигации и у неё есть дополнительные блоки, которые также должны сохранять относительную позицию при прокрутке страницы.

    В вёрстке нет класса "header__menu"
    Можешь прислать скриншот как это выглядит?
    Возможно тебе просто нужно создать родительский блок для всех них и уже к нему применять стиль fixed
    Ответ написан