• Uncaught TypeError: Cannot set properties of null (setting 'innerHTML') как избавится от этой ошибки?

    @Paul14
    Ошибка "Uncaught TypeError: Cannot set properties of null (setting 'innerHTML')" возникает, когда вы пытаетесь установить свойство innerHTML для элемента, который не существует в DOM-дереве. В вашем случае, вероятно, элемент, который вы пытаетесь найти с помощью метода querySelector, не существует на странице.

    Проверьте, правильно ли вы написали классы элементов в HTML-коде и в файле lng.js. Убедитесь, что все элементы, на которые вы ссылаетесь в цикле for, существуют на странице.

    Также, убедитесь, что вы вызываете функцию changeLanguage() после того, как все элементы загрузятся на странице. Вы можете использовать событие window.onload для этого:

    window.onload = function() {
      changeLanguage();
    };
    Ответ написан
    Комментировать
  • Нужно сгенерировать массив объектов и дать каждому уникальный id, как?

    @Paul14
    Конструктор не знает о номере экземпляра объекта, так как уникальные идентификаторы обычно генерируются и присваиваются во время создания объекта. Однако вы можете использовать класс для создания объектов с уникальными идентификаторами. Вот пример кода, который генерирует массив объектов, каждый из которых содержит уникальный идентификатор:

    class MyObject {
      constructor(id, otherProperty) {
        this.id = id;
        this.otherProperty = otherProperty;
      }
    }
    
    function generateObjectsArray() {
      const objectsArray = [];
    
      for (let i = 1; i <= 25; i++) {
        const objectId = i; // Уникальный идентификатор объекта
        const otherProperty = "Другое свойство " + i; // Другое свойство объекта
    
        const newObj = new MyObject(objectId, otherProperty);
        objectsArray.push(newObj);
      }
    
      return objectsArray;
    }
    
    const myArray = generateObjectsArray();
    console.log(myArray);


    Здесь класс MyObject определяет объекты с двумя свойствами: id и otherProperty. В функции generateObjectsArray() мы создаем массив из 25 объектов, где каждый объект имеет уникальный идентификатор от 1 до 25. Вы можете заменить otherProperty на любое другое свойство или добавить сколько угодно свойств по своему усмотрению.

    Переменная myArray будет содержать сгенерированный массив объектов с уникальными идентификаторами.

    ---------------------------

    Если же вам все таки нужен пример функции для решения этой нетривиальной задачи, то:

    const objectsArray = Array.from({ length: 25 })
      .map((_, index) => index + 1)
      .map(id => {
        const sum = [...Array(Math.floor(Math.random() * 10) + 1)].reduce((acc, _) => acc + Math.floor(Math.random() * 100) + 1, id);
        let emoji = '';
        if (sum % 2 === 0) {
          const emojis = ['', '', '', '', ''];
          emoji = emojis[Math.floor(Math.random() * emojis.length)];
        } else {
          const emojis = ['', '', '', '', ''];
          emoji = emojis[Math.floor(Math.random() * emojis.length)];
        }
        
        return { id, sum, emoji };
      });
    
    console.log(objectsArray);

    1. Сначала мы снова используем метод Array.from() для создания массива из 25 элементов, но без передачи функции обратного вызова.
    2. Затем мы используем метод map() для преобразования индекса элемента в уникальный идентификатор id.
    3. Далее мы снова используем метод map(), чтобы каждый объект массива получил дополнительные свойства sum и emoji.
    4. Чтобы вычислить значение sum, мы создаем новый массив с случайной длиной от 1 до 10 элементов с помощью Array(Math.floor(Math.random() * 10) + 1), затем с помощью метода reduce() суммируем случайные числа от 1 до 100.
    5. Затем выбирается случайное эмодзи из массива эмодзи в зависимости от четности значения sum.
    6. Наконец, мы возвращаем объект с id, sum и emoji в каждой итерации.
    7. Полученный массив объектов objectsArray будет содержать 25 объектов, каждый из которых будет иметь уникальный идентификатор id, случайно сгенерированную сумму sum, а также случайно выбранное эмодзи emoji.


    PS: если emoji не нужно, то можно удалить часть кода.
    Ответ написан
    1 комментарий
  • Что выбрать в данном случае: select или input?

    @Paul14
    Добрый вечер. На javascript, очевидно, ведь тут динамический поиск по городу. Механизм всплывающей подсказки с выбором совпадений по значению из массива городов. Зачем только два поля поиска непонятно...или эта подсказка должна быть при клике на "москва".
    Ответ написан
  • Как реализовать кнопку Reset Form в компоненте React?

    @Paul14
    Для реализации функции очистки формы по нажатию кнопки, вам необходимо выполнить следующие шаги:

    1. Внутри компонента Form добавьте состояние, которое будет хранить исходные значения формы. Для этого вы можете использовать useState хук и инициализировать его пустым объектом.
    const [initialFormData, setInitialFormData] = useState<{ [id: string | number]: any }>({});


    2. Внутри компонента Form создайте функцию для обработки события нажатия кнопки Reset (handleRefresh), в которой будет выполняться следующее:
    - Установите исходные значения формы в состоянии formData, используя setFormData(initialFormData).
    - Очистите значения во всех дочерних компонентах Input путем вызова метода unregister на каждом из них.

    const handleRefresh = () => {
      setFormData(initialFormData);
      props.elements.forEach((item) => {
        item.unregister({ id: item.name, value: "" });
      });
    };


    3. Добавьте кнопку Reset в компонент Form с обработчиком handleRefresh.

    <Button onClick={handleRefresh}>Reset</Button>

    Теперь, при нажатии на кнопку Reset, значения формы должны быть сброшены до исходных значений, а все дочерние компоненты типа Input должны быть очищены.
    Ответ написан
    Комментировать
  • Как получить токен из заголовков ответа в js?

    @Paul14
    Здравствуйте! Вы столкнулись с некоторыми проблемами, связанными с запросами между разными доменами.

    В первом случае, когда вы не отключили CORS на стороне клиента, браузер блокирует получение ответа из-за политики безопасности Same-Origin Policy.

    Во втором случае, когда вы отключили CORS на стороне клиента с помощью 'no-cors' режима, запрос можно отправить успешно, но вы не сможете получить доступ к ответу из-за ограничений этого режима.

    При использовании 'no-cors' режима, доступны только определенные типы ответов, например, получение заголовков ответа (headers) и статуса (status), но вы не сможете получить доступ к содержимому ответа.

    В вашем случае, вы сможете получить только заголовки ответа с помощью res.headers, но содержимое ответа (токен) будет недоступно.

    Чтобы решить эту проблему, вам необходимо разрешить CORS запросы на стороне сервера для этого маршрута (url/Token), чтобы получить доступ к ответу в соответствии с политикой безопасности браузера.
    Ответ написан
  • Как отправить несколько данных и несколько фото одновременно?

    @Paul14
    Вот пример кода функции jQuery AJAX для отправки множества фотографий через FormData в обработчик PHP:

    function uploadPhotos() {
        var formData = new FormData();
        var photos = $('#fileInput')[0].files; // получение массива выбранных файлов
        for (var i = 0; i < photos.length; i++) {
            formData.append('photos[]', photos[i]); // добавление фотографий в FormData
        }
    
        $.ajax({
            url: 'upload.php',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            success: function(response) {
                console.log(response);
                // Действия после успешной загрузки
            },
            error: function(xhr, status, error) {
                console.log(xhr.responseText);
                // Действия в случае ошибки
            }
        });
    }


    В приведенном коде предполагается, что у вас есть для выбора нескольких фотографий.

    А вот пример кода PHP функции, принимающей массив фотографий и сохраняющей их на сервере:

    <?php
    if(isset($_FILES['photos'])) {
        $photos = $_FILES['photos'];
        $uploadedFiles = [];
        foreach($photos['tmp_name'] as $key => $tmp_name) {
            $file_name = $photos['name'][$key];
            $file_tmp = $photos['tmp_name'][$key];
            $file_type = $photos['type'][$key];
            $file_size = $photos['size'][$key];
            
            $new_file_name = md5(time() . $file_name) . '.' . pathinfo($file_name, PATHINFO_EXTENSION);
            $destination = 'uploads/' . $new_file_name;
            
            if(move_uploaded_file($file_tmp, $destination)) {
                $uploadedFiles[] = $destination;
            }
        }
        
        if(!empty($uploadedFiles)) {
            // Действия после успешной загрузки
            echo "Фотографии успешно загружены";
        } else {
            // Действия в случае ошибки
            echo "Ошибка загрузки фотографий";
        }
    }
    ?>


    В примере предполагается, что фотографии будут сохраняться в папку "uploads". Каждая фотография будет переименована в формате md5(время + имя файла).формат. Если загрузка прошла успешно, функция выведет "Фотографии успешно загружены", иначе "Ошибка загрузки фотографий".
    Ответ написан
    5 комментариев
  • Почему не работает таймер когда наступает новый час?

    @Paul14
    window.onload = () => {
    let [minute, sec, h] = ['<?=$m?>', '<?=$s?>', '<?=$h?>'];
    
    setInterval(() => {
    document.getElementById("t").innerHTML = ${h}:${minute}:${sec};
    sec++;
    
    if (sec < 10) sec = '0' + sec;
    
    if (sec == '60') {
      minute++;
      
      if (minute < 10) minute = '0' + minute;
      
      if (minute == '60') {
        h++;
        minute = '00';
        sec = '00';
      }        
      sec = '00';
    }
    }, 1000);
    }
    Ответ написан
    Комментировать
  • Как заменить контент при нажатии на кнопку?

    @Paul14
    Реализация табов. Сначала определяем индекс (порядковый номер) кнопки среди всех кнопок.
    Затем производим операции для всех кнопок (удалим класс) , а далее проведем операции с той кнопкой, на какую нажали ( метод eq(index) ). С отображаемым контентом тоже самое. Я сделал через show/hide, можно через удаление/ добавление класса.

    $('#buttons-grid a').click(function () {  
       var index = $('#buttons-grid a').index($(this));
       $('#buttons-grid a').removeClass('active').eq(index).addClass('active');
       $('#contactAndMapBlock__wrapper .contactAndMapBlock__right').hide().eq(index).show();
    });
    Ответ написан
    Комментировать
  • Как отобразить контент над кнопками и под кнопками?

    @Paul14
    Я так понял вы хотите сделать так, чтобы при нажатии на блок изменялся контент в другой области сайта.

    <div class='show_content'  target_attr='0'>Показать контент для 1 блока </div>
    <div class='show_content'  target_attr='1'>Показать контент для 2 блока </div>
    
    <div class='class_name'>1 блок для нажатия</div>
    <div class='class_name'>2 блок для нажатия</div>
    
    <div class='show_content'  target_attr='0'>Показать контент для 1 блока </div>
    <div class='show_content'  target_attr='1'>Показать контент для 2 блока </div>

    <script>
    $('.class_name').click(function(){
    //Определим порядковый номер блока. Все блоки, по которым кликаем должны иметь класс class_name. В переменной i будет 0 или 1 или 2... 
    let i = $('.class_name').index($(this))  
    // Класс active в css  =>   .active{background:red}  подсветка выбранного пункта
    $('.class_name').removeClass('active').eq(i).addClass('active') 
    // Сначала скроем весь персональный контент, который будет появляться при нажатии на разные блоки
    $('.show_content').hide();
    // Включим определенный контект сайта с атрибутом target_attr равным i (порядковому номеру нажатого блока) 
    $(`.show_content[target_attr=${i}]`).show();
    })
    </script>
    Ответ написан