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

    @holllop
    Для того чтобы определить, загружен ли скрипт или находится в процессе загрузки, можно использовать флаги или атрибуты, которые вы могли бы установить в элементе скрипта. В вашем случае, как один из вариантов, можно добавить к элементу скрипта атрибут data-loaded, который будет указывать на его состояние. Для этого вам нужно модифицировать функцию isScript.
    spoiler
    Примерно как-то так, если я правильно понял ход ваших мыслей
    const isScriptLoaded = (url) => {
        const scripts = document.getElementsByTagName('script');
        for(let i = scripts.length; i--;) {
            if(scripts[i].src === url) {
                return scripts[i].getAttribute('data-loaded') === 'true' ? scripts[i] : false;
            }
        }
        return false;
    };
    
    const loadScriptBody = (c) => {
        let url = (c.params) ? arrayToUrlParams(c.url, c.params) : c.url;
        let script = isScriptLoaded(url);
        if(script){
            // Скрипт уже загружен и готов к использованию:
            c.callback();
        } else {
            script = document.createElement('script');
            script.src = url;
            script.setAttribute('data-loaded', 'false');  // Устанавливаем флаг загруженности в 'false'
            script.addEventListener("load", () => {
                script.setAttribute('data-loaded', 'true'); // Меняем флаг на 'true', когда скрипт загрузился
                c.callback();
            }, false);
    
            if(c.attributes && c.attributes.length > 0){
                for(let i = 0; i < c.attributes.length; i++){
                    script.setAttribute(c.attributes[i].name, c.attributes[i].value);
                }
            }
            document.getElementsByTagName('head')[0].appendChild(script);
        }
    };
    Ответ написан
    7 комментариев
  • Как обработать массив переменной длины?

    @holllop Автор вопроса
    Сначала хочу выразить великую благодарность IvanU7n, он меня подтолкнул к ответу
    function accepting_expenses_array(req, res) {
      const expenses_array = req.body;
      const expenses_as_numbers = expenses_array.map(Number);
      
      // Определяем MAX(id_work) из таблицы "works"
      pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
        if (error) {
          throw error;
        }
        const maxIdWork = maxResult.rows[0].max;
    
        // Формируем INSERT-запрос и значения для вставки
        let insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ';
        let values = [];
        
        for (let i = 1; i < expenses_as_numbers.length; i += 8) {
          if (i !== 0) {
            insertQuery += ', ';
          }
          insertQuery += `($${1}, $${i + 1}, $${i + 2}, $${i + 3}, $${i + 4}, $${i + 5}, $${i + 6}, $${i + 7}, $${i + 8})`;
          // Формируем значения для вставки
          values.push(maxIdWork, ...expenses_as_numbers.slice(i, i + 8));
        }
        
        console.log(values);
        console.log(insertQuery);
      });
    }

    в консоле получаю
    INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES , ($1, $2, $3, $4, $5, $6, $7, $8, $9), ($1, $10, $11, $12, $13, $14, $15, $16, $17), ($1, $18, $19, $20, $21, $22, $23, $24, $25), ($1, $26, $27, $28, $29, $30, $31, $32, $33)

    а это именно, то чего я хотел достичь
    Ответ написан
    Комментировать
  • Не приходит в голову алгоритм лучше. Как сделать лучше?

    @holllop Автор вопроса
    В моём конкретном случае решением будет
    if(clickCount > 1){
                for (let i = 2; i <= clickCount; i++) {
                    elementstypeWorkFirst[i-2].innerHTML = '';
                }
            }
    Ответ написан
    1 комментарий
  • Как добавить сайт в nginx с помощью node js?

    @holllop
    Я бы рекомендовал сразу на Node.js поставить модуль fs в вашем вопросе не как без него.
    Например
    1. Добавить новые конфигурации сайта в общий файл nginx conf.
    можно примерно таким образом.
    const fs = require('fs');
    const path = require('path');
    
    const nginxConfPath = '/etc/nginx/nginx.conf'; // путь к вашему файлу nginx.conf
    
    // Чтение содержимого nginx.conf
    const nginxConfContent = fs.readFileSync(nginxConfPath, 'utf8');
    
    // Дополнение новыми настройками
    const newConfig = 
        server {
            listen 80;
            server_name example.com;
            location / {
                root /path/to/new/website;
                index index.html;
            }
        }
    ;
    
    const updatedNginxConfContent = nginxConfContent + newConfig;
    
    // Запись измененного содержимого обратно в файл nginx.conf
    fs.writeFileSync(nginxConfPath, updatedNginxConfContent, 'utf8');

    2. Создать папку сайта.

    const newWebsitePath = '/path/to/new/website'; // путь к новой папке сайта
    
    // Создание папки
    fs.mkdirSync(newWebsitePath);

    в остальном не очень уверен по этому наверное лучше не буду писать )
    Ответ написан
    2 комментария
  • Бесконечная загрузка страницы, как исправить?

    @holllop Автор вопроса
    Причина, по которой у меня возникала бесконечная загрузка, заключается в том, что когда я изменял массив orderData внутри цикла for. Это приводит к изменению длины массива, а следовательно, к изменению условия цикла for, которое проверяет i < orderData.length. В результате, цикл может выполняться бесконечное количество раз, вызывая бесконечную загрузку.
    Проблему решил так
    function processing (orderData, workData, workObjectData){
      console.log("доступны и в функции", orderData, workData, workObjectData);
      const updatedOrderData = [];
      for (let i = 0; i < orderData.length; i++) {
        const orderId = orderData[i].order_id;
        const matchingWorkItems = workData.filter(workItem => workItem.id_order === orderId);
        if (matchingWorkItems.length > 0) {
          matchingWorkItems.forEach(workItem => {
            updatedOrderData.push({ ...orderData[i], name_object: workItem.name_object });
          });
        }
        updatedOrderData.push(orderData[i]);
      }
      console.log("updatedOrderData", updatedOrderData);
    }

    так же хочу поблагодарить iljaGolubev за подсказку по оптимизации
    Ответ написан
    1 комментарий
  • Запутался с логикой. Не могу найти решение?

    @holllop Автор вопроса
    в итоге сделал так понимаю что это не лучший вариант, но хоть работает. Буду ещё думать, как оптимизировать весь процесс.
    var orderNumber = document.getElementById('id_order').value;
      var department = document.getElementById('department').value;
      var customer = document.getElementById('customer').value;
      var contractNumber = document.getElementById('id_contract').value;
      var objectName = document.getElementById('name_object').value;
      var orderDate = document.getElementById('date_contract').value;
      var note = document.getElementById('note').value;
    
      // Создаем массив с полученными значениями
      var valuesArray = [orderNumber, department, customer, contractNumber, objectName, orderDate, note];
      
      // Получаем значения из блоков <td>
    var tdElements = document.getElementsByClassName('val');
    var tdValuesArray = [];
    for (var i = 0; i < tdElements.length; i++) {
      var value = tdElements[i].value;
      tdValuesArray.push(value);
    }
    
    var tdInputs = document.getElementsByClassName('number');
    var tdInputArray =[];
    
    for (var i = 0; i < tdInputs.length; i++){
      var value = tdInputs[i].value;
      tdInputArray.push(value);
    }
    
    var printer_line = tdValuesArray.concat(tdInputArray);
    var mergedArray =valuesArray.concat(printer_line);
    
    if (isAddFormatClicked == false && isAddRowClicked == false){
      spetional();
    }
    
    handleAddFormat();
    
    if (isAddRowClicked == true){
      const selectElements1 = document.querySelectorAll('.val1');
      var selectElementsArray1 = [];
      for (var i = 0; i < selectElements1.length; i++) {
        var value = selectElements1[i].value;
        selectElementsArray1.push(value);
      }
    
      var tdInputs1 = document.getElementsByClassName('number1');
      var tdInputArray1 =[];
    
      for (var i = 0; i < tdInputs1.length; i++){
        var value = tdInputs1[i].value;
        tdInputArray1.push(value); 
      }
    
      var printer_line1 =  selectElementsArray1.concat(tdInputArray1);
      console.log("Что в printer_line1", printer_line1);
      console.log("чё тут",isAddFormatClicked1, selectedFormat1)
      main_condition(selectElements1);
      setTimeout(()=>{
        additional_dispatch1();
        console.log("printer_line1 не завимо была ли нажата кнопка", printer_line1)
      },1000);
    }
    
    async function main_condition(selectElements1) {
      console.log("доступ к isAddFormatClicked1, selectedFormat1 в фукции",isAddFormatClicked1, selectedFormat1)
      if (isAddFormatClicked1 == true) {
        if(selectedFormat1 == null){
          console.log("проверка доступен ли массив selectElements1", selectElements1);
          const newSelect = document.createElement('select1');
          const selectedPrinterId = selectElements[1].value;
          console.log("что в newSelect, selectedPrinterId", newSelect, selectedPrinterId);
          setTimeout(async () => {
            const selectedFormat = await fetchDataAndProcess(newSelect, selectedPrinterId);
            console.log("прошёл selectedFormat", selectedFormat);
            printer_line1.splice(5, 1);
            printer_line1.splice(5, 0, selectedFormat.toString());
            additional_dispatch1()
          },2000);
        }else{
          setTimeout(async () => {
            console.log("проверяю что selectedFormat1 точно не null", selectedFormat1);
            printer_line1.splice(5, 1);
            printer_line1.splice(5, 0, selectedFormat1.toString());
            additional_dispatch1()
          },2000);
        }
      }
    }
    
    async function handleAddFormat(){
      console.log("handleAddFormat в нём", isAddFormatClicked, selectedFormat)
      if(isAddFormatClicked == true){
        printer_line.splice(5, 1);
        if(selectedFormat == null){
          const newSelect = document.createElement('select');
          const selectedPrinterId = selectElements[1].value;
          const selectedFormat = await fetchDataAndProcess(newSelect, selectedPrinterId);
          printer_line.splice(5, 0, selectedFormat.toString());
          main_dispatch();
          additional_dispatch();
        } else{
            console.log("я сюда то зашёл или нет")
            printer_line.splice(5, 0, selectedFormat.toString());
            main_dispatch();
            additional_dispatch();
          }
      }else{
        main_dispatch();
      }
    }
    
    async function spetional(){
      if(isAddFormatClicked == true){
        main_dispatch();
        printer_line.splice(5, 1);
        if(selectedFormat == null){
          const newSelect = document.createElement('select');
          console.log("доступ к selectElements", selectElements[1].value);
          const selectedPrinterId = selectElements[1].value;
          const selectedFormat = await fetchDataAndProcess(newSelect, selectedPrinterId);
          printer_line.splice(5, 0, selectedFormat.toString());
          main_dispatch();
          additional_dispatch();
        } else{
            printer_line.splice(5, 0, selectedFormat.toString());
            additional_dispatch();
          }
        }
      }
    
    function main_dispatch(){
      console.log("Отправка  записи valuesArray + printer_line", mergedArray)
      fetch('http://:3000/main_entry', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(mergedArray)
      })
      .then(response => response.json())
      .then(data => console.log(data))
      .catch(error => console.error(error));
    }
    
    function additional_dispatch(){
      console.log("отправка printer_line", printer_line)
      fetch('http://:3000/small_main_entry', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
          body: JSON.stringify(printer_line)
        })
      .then(response => response.json())
      .then(data => console.log(data))
      .catch(error => console.error(error));
    }
    
    function additional_dispatch1(){
      console.log("отправка printer_line1", printer_line1)
      setTimeout(()=>{
        fetch('http://:3000/small_main_entry', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
          body: JSON.stringify(printer_line1)
        })
      .then(response => response.json())
      .then(data => console.log(data))
      .catch(error => console.error(error));
      }, 1000);
    }
    
    async function fetchDataAndProcess(newSelect, selectedPrinterId) {
      try {
        const url = `http://:3000/printer_format?printer_id=${encodeURIComponent(selectedPrinterId)}`;
        const keyVal = 'format_id';
        const keyText = 'format';
    
        const response = await fetch(url);
        const jsonData = await response.json();
        const result = jsonData.map(item => item[keyVal]);
    
        const myVariable = result.map(Number);
        for (const element of myVariable) {
          console.log(typeof element); // number
        }
        const minValue = Math.min(...myVariable);
        return minValue;
      } catch (error) {
        console.error(error);
      }
    Ответ написан
    Комментировать
  • SyntaxError: Unexpected token 'P', "POST-запро"... is not valid JSON, как исправить эту ошибку?

    @holllop Автор вопроса
    у меня ошибка. я не правильно обрабатывал на сервере. Спасибо Михаил Р., он помог обнаружить ошибку.
    Ответ написан
    Комментировать
  • Что почитать про практическое использование на JS?

    @holllop
    Дак это не совсем корректный вопрос.
    Что можно почитать про практическое применение JS, ну например:
    - написать плагин сбора любой информации со страницы;
    - сформировать 5 запросов на сервер, получить ответ, обработать;
    - изменить состояние объекта и прочее.

    А что ты уже знаешь ?
    например если брать
    - написать плагин сбора любой информации со страницы;
    то тут зависит что читать от того какой браузер и какую информацию нужно вытащить. Если брать
    - сформировать 5 запросов на сервер, получить ответ, обработать;
    то тут вообще легко берёшь открываешь браузер пишешь как сделать запросы POST/GET в Node.js/PHP. итд
    Ответ написан
    Комментировать
  • Библиотека спектограмма audio?

    @holllop
    Ну Tone.js например
    Ответ написан
    Комментировать
  • Не могу понять что я делаю не так с select?

    @holllop Автор вопроса
    szQocks, был прав я делал скрипт несмотря что у меня нет значений departament.id и departament.name
    Так что правильный скрипт выглядит вот так
    const departmentSelect = document.querySelector('#department');
    
    fetch('http://example.com/departament')
      .then(response => {
        if (!response.ok) {
          throw new Error('Ошибка загрузки данных');
        }
        return response.json();
      })
      .then(data => {
        const options = data.map(item => {
          const option = document.createElement('option');
          option.value = item.departament; // значение option
          option.textContent = item.departament; // текст варианта
          return option;
        });
        departmentSelect.append(...options);
      })
      .catch(error => {
        console.error(error);
        // Обработать ошибку
      });
    Ответ написан
    Комментировать
  • Django-templates + JS: что не так с кнопкой закрытия попапа?

    @holllop
    Ну смотри на первый взгляд код, связанный с кнопкой закрытия попапа, выглядит правильным. Он использует событие hide.bs.modal, которое срабатывает при закрытии модального окна, и выполняет необходимые действия, чтобы обновить значения на странице.
    Но, скорее всего проблема может быть связана с другим кодом, например, с обработчиками кликов на кнопку или с CSS стилями для модального окна. (да знаю звучит глупо, но проверь).
    Уточни, как именно не работает кнопка закрытия попапа. Не происходит ли событие клика на кнопку вообще, или есть ли какая-то другая ошибка или неправильное поведение?
    Также полезно будет увидеть остальной JS код, который связан с попапом, чтобы понять, может быть, есть какие-то конфликты или проблемы в других частях кода.
    Ответ написан
    Комментировать
  • Как исправить CORS ошибку Access to fetch at ${API} from origin ${CLIENT} has been blocked by CORS policy?

    @holllop
    Ну я когда столкнулся с подобной проблемой просто поставил пакет CORS на сервер(node.js) и всё. Если что это делается командой npm install cors
    Ответ написан
  • Не могу понять, что не так с innerHTML?

    @holllop Автор вопроса
    if (record) {
        wrapper1.innerHTML = 
        `<div> <p>Вы точно хотите удалить запись:</p> <table> <tr> <th>Порядковый номер записи:</th> <th>Номер шахты:</th> <th>Название шахты:</th> <th>Адрес шахты:</th> <th>ФИО директора:</th> <th>Номер телефона:</th> </tr> <tr> <td>${record.id_k1}</td> <td>${record.n_mine}</td> <td>${record.name_mine}</td> <td>${record.adress}</td> <td>${record.full_name_of_direcor}</td> <td>${record.phone_number}</td> </tr> </table> <button type="submit" name="submit" class="dle">Удалить запись</button> </div>`; //это всё должно быть в одной строке
      } else {
        wrapper1.innerHTML = 'Записи с таким ID не найдено';
      }
    });

    Не знаю может это работает и при многострочном вводе (и это особенность из-за моего редактора кода)
    Ответ написан