Задать вопрос
  • Как отключить strictMode у плагина intl-tel-input?

    cdcdcd
    @cdcdcd
    Bug creator
    Для отключения strictMode в плагине intl-tel-input при выборе определенной страны, можешь использовать метод setOptions после инициализации.
    Тем не менее, можно реализовать сброс и повторную инициализацию плагина с обновленным значением strictMode

    if (selectedCountry === "th") {
                iti.destroy(); // Уничтожаем текущий экземпляр
                iti = window.intlTelInput(item, {
                    initialCountry: "th",
                    separateDialCode: true,
                    strictMode: false,
                    utilsScript: "https://cdn.jsdelivr.net/npm/intl-tel-input@23.1.0/build/js/utils.js",
                });
            }


    Такой подход является рабочим, но не самым оптимальным (ресурсоемкое)

    как вариаент:
    - фильтрация пользовательского ввода без пересоздания
    Если strictMode отвечает за валидацию ввода, можно отключить его влияние, добавив свою собственную логику валидации, независимо от состояния strictMode.

    const isValidNumber = iti.isValidNumber();
    if (!isValidNumber && selectedCountry !== "th") {
        // Показываем ошибку для других стран, но не для Таиланда
    }


    Если количество полей небольшое, пересоздание экземпляра (destroy и пересоздание) подходит как простое и понятное решение, в иных решениях нет
    Ответ написан
  • Как перекрутить слайдер в swiper js?

    cdcdcd
    @cdcdcd
    Bug creator
    Проблема в том, что Swiper с включённым loop воспринимает только фактические индексы слайдов, соответствующие количеству слайдов (в вашем случае — от 0 до 9).
    Даже если ты передаёшь индекс больше количества слайдов, Swiper всё равно будет ограничивать значение.

    Чтобы реализовать вращение на 3 полных круга + случайный индекс, нужно учитывать поведение с loop, а также использовать slideToLoop, который корректно обрабатывает циклическую прокрутку

    swiperRef.current.slideToLoop(randomIndex, 2000, 'ease-out');
    setTimeout(() => {
        setCurrentSlide(randomIndex);
        console.log('Выпавший слайд: ', randomIndex);
    }, 2000);


    И useEffect лишний
    потому что он пытался сразу перейти на индекс 30, который не существует

    https://jsfiddle.net/fdot6gpe/
    Ответ написан
  • Как определить инлайн стиль и заменить на соответствующие теги?

    cdcdcd
    @cdcdcd
    Bug creator
    Вот тебе что-то на подобие парсера на js, который обрабатывает входной HTML-код (span, p) на целевые теги (strong, h2, и т.д.)

    function processHtml(inputHtml) {
      // Создаешь временный DOM для парсинга HTML
      
      const parser = new DOMParser();
      const doc = parser.parseFromString(inputHtml, 'text/html');
    
      // Обрабатываешь span внутри p
      doc.querySelectorAll('p span[style]').forEach((span) => {
        const style = span.getAttribute('style');
        const fontSizeMatch = style.match(/font-size:\s*([\d.]+)pt/);
        const fontWeightMatch = style.match(/font-weight:\s*(\d+)/);
      // дописать остальные регулярки (font-style и т.д.)
    
        let newElement;
    
        if (fontSizeMatch) {
          const fontSize = parseFloat(fontSizeMatch[1]);
          
          if (fontSize >= 18) {
            newElement = document.createElement('h2');
          } else if (fontSize >= 16) {
            newElement = document.createElement('h3');
          }
        }
    
        if (!newElement && fontWeightMatch) {
          const fontWeight = parseInt(fontWeightMatch[1], 10);
       
          if (fontWeight >= 700) {
            newElement = document.createElement('strong');
          }
        }
    
        // Если замена нашлась, то создаешь новый элемент
        if (newElement) {
          newElement.textContent = span.textContent;
          span.replaceWith(newElement);
        }
      });
    
      // Удаляешь лишние стили из p
    
      doc.querySelectorAll('p').forEach((p) => {
        p.removeAttribute('style');
      });
    
       return doc.body.innerHTML; // возвращаешь обработанный html
    }
    
    
    const inputHtml = `
    <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;">
    <span style="font-size:18pt;font-family:Calibri,sans-serif;color:#000000;background-color:#ffffff;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">
       Тут текст
    </span>
    </p>`;
    
    const resultHtml = processHtml(inputHtml);
    console.log(resultHtml);


    Соответственно, если будут дополнительные условия, код можно легко расширить
    https://jsfiddle.net/dfhw4eo6/
    Ответ написан
    2 комментария
  • Можно ли прописать формулу расчёта с нефиксированной скидкой?

    cdcdcd
    @cdcdcd
    Bug creator
    1. Крепим таблицы скидок (фиксированные скидки для различных комбинаций):

    const discounts = {
      "A2": {
        "Глянцевая": [
          { min: 1, discount: 1 }, // До 10 листов
          { min: 10, discount: 0.9 }, // От 10 листов
          { min: 100, discount: 0.85 }, // От 100 листов
        ],
        "Матовая": [
          { min: 1, discount: 1 }, // До 10 листов
          { min: 10, discount: 0.8 }, // От 10 листов
          { min: 100, discount: 0.7 }, // От 100 листов
        ],
      },
      "A3": {
        "Глянцевая": [
          { min: 1, discount: 1 },
          { min: 10, discount: 0.95 },
          { min: 100, discount: 0.9 },
        ],
        "Матовая": [
          { min: 1, discount: 1 },
          { min: 10, discount: 0.85 },
          { min: 100, discount: 0.75 },
        ],
      },
    };


    2. Функция для расчёта скидки:

    function getDiscount(format, type, amount) {
      const rules = discounts[format][type];
      let discount = 1;
    
      for (const rule of rules) {
        if (amount >= rule.min) {
          discount = rule.discount;
        }
      }
    
      return discount;
    }


    3. Обновляем код калькулятора

    jQuery(function ($) {
      $("#calc .form-control").on("input change", function () {
        const format = $("#paper option:selected").text();
        const type = $("#paper-type option:selected").text();
        const pricePerSheet = Number($("#paper option:selected").val());
        const multiplier = Number($("#paper-type option:selected").val());
        const amount = Number($("#paper-amount").val());
    
        if (!amount || amount < 1) {
          $("#totalprice").text("0 руб.");
          return;
        }
    
        // Получение скидки
        const discount = getDiscount(format, type, amount);
    
        // Расчёт итоговой стоимости
        const total = amount * pricePerSheet * multiplier * discount;
    
        // Вывод результата
        $("#totalprice").text(`${total.toLocaleString("ru-RU")}`);
      });
    });


    4. HTML с адаптацией под решение (остаётся практически неизменным):

    <div id="calc">
      <label>Формат бумаги</label>
      <select class="form-control" id="paper">
        <option value="2">A2</option>
        <option value="1">A3</option>
      </select>
    
      <label>Тип бумаги</label>
      <select class="form-control" id="paper-type">
        <option value="1">Глянцевая</option>
        <option value="2">Матовая</option>
      </select>
    
      <label>Листов в упаковке</label>
      <input type="text" class="form-control" id="paper-amount" />
    
      <div>
        <span id="totalprice">0</span> руб.
      </div>
    </div>


    Вся эта пурга динамического расчёта стоимости с учетом фиксированных скидок на основе комбинаций формата бумаги, типа бумаги и количества, лучше всего использовать таблицу скидок или конфигурационный объект, который описывает правила расчёта (определил выше).

    Это избавит тебя от необходимости прописывать каждую комбинацию вручную и упростит поддержку кода.

    Код проверил

    https://jsfiddle.net/pnr4hz10/
    Ответ написан
  • Как можно менять ::backdrop через JS?

    cdcdcd
    @cdcdcd
    Bug creator
    const style = document.createElement('style');
    style.textContent = `
      dialog::backdrop {
        background: red;
      }
    `;
    document.head.appendChild(style);


    И по памяти, ::backdrop — это псевдоэлемент, и он не может быть напрямую изменён через свойство cssText в js.
    Только через стили CSS, которые можно обновлять с помощью js, ну или через класс

    document.querySelector('dialog').classList.add('custom');


    dialog.custom::backdrop {
      background: red;
    }


    Можно динамически добавить или изменить стили для ::backdrop через тег
    Ответ написан
    Комментировать
  • Как фильтровать массив в массиве методом filter?

    cdcdcd
    @cdcdcd
    Bug creator
    const users = [
      ["Alice", 25, true],
      ["Bob", 30, false],
      ["Charlie", 22, true],
      ["David", 27, true],
      ["Eve", 20, false]
    ];
    
    const filteredUsers = users.filter(([name, age, status]) => age > 25 && status);
    
    console.log(filteredUsers);
    
    [
      ["David", 27, true]
    ]


    Что улучшено:
    Деструктуризация: Использование деструктуризации ([name, age, status]) повышает читаемость и облегчает доступ к элементам вложенных массивов.
    Стрелочная функция: Более лаконичная запись условия.
    Корректное условие: Условие проверяет, что возраст больше 25 (age > 25) и status равен true.
    Семантика: Переменная filteredUsers более точно отражает суть данных.

    пробуйте различные варианты, как в книгах так и в связке с локальной машиной )
    Ответ написан