Ответы пользователя по тегу JavaScript
  • Как убрать лишний "мусор" при всталвке из word в CKeditor 5?

    neuotq
    @neuotq
    Прокрастинация
    Для этого используйте фичу по вставке из офиса.
    https://ckeditor.com/docs/ckeditor5/latest/feature...

    Добавить в плагины:
    //****
     // CKEditor
        ClassicEditor.create($('#data')[0], {
            htmlSupport: { allow: htmlSupport },
            removePlugins: [ 'Link', 'SourceEditing' ],
            plugins: [ PasteFromOffice],
            fontSize: { options: [ 8, 10, 12, 14, 18, 20, 24, 28, 36 ] },
        })
        .then(editor => {
            CKEditor = { field: 'data', data : editor };
        })
        .catch(error => {
            console.error(error);
        });
    Ответ написан
    Комментировать
  • Как исправить Ошибки при ajax запросов в vk api?

    neuotq
    @neuotq
    Прокрастинация
    dataType: 'JSONP' - почему JSONP? Удалить или заменить на json. Так же там может вылетать ответ с лимитом обращений к api.
    Ответ написан
  • Я тут таймер сделал, но почему то когда я переключаю окно на что-то другое, таймер останавливается. В чем проблема?

    neuotq
    @neuotq
    Прокрастинация
    Так задумано. Неактивные вкладки имеют низкий приоритет, поэтому там не гарантируется исполнение в риалтайме js.
    Выход переписать например на webworker.
    В целом тема обширная, можешь гуглить JavaScript inactive tabs
    Ответ написан
    1 комментарий
  • Как отключить скролл страници при фокусе определенного элемента?

    neuotq
    @neuotq
    Прокрастинация
    Вам нужно следить за событиями keydown, далее снимаем действие по умолчанию с помощью preventDefault.
    Таким образом в самом общем случае отключения реакции на все кнопки будет:

    document.addEventListener('keydown', e => {
      e.preventDefault();
      return false;
    });


    Далее ищите нужные коды для своих кнопок, отключаете поведение по умлочанию, добавляете своё поведение.
    Например:

    document.addEventListener('keydown', e => {
       if (e.key === 'ArrowDown') {
        e.preventDefault();
        //Ваша логика
        return false;
      }
    });
    Ответ написан
    Комментировать
  • Как при клике убрать активный класс?

    neuotq
    @neuotq
    Прокрастинация
    Немного упростим главный код и исправим названия класса.
    Активный класс, если это БЭМ или типа БЭМ, должен быть не _active, а fits-cars-showmore-content_active, ну и с остальными соответственно.
    Так же разделим название для data атрибутов, чтобы у кнопок и контента они различались, так желательно в данной семантике. Либо в дата атрибут передавать айди кого будем дёргать. Тут уже на усмотрение разработчика в зависимости от дельнейшего пути
    Сам цикл упростим (но желательно конечно вернуть/добавить проверки аргументов, существования элементов и тп, я убрал для наглядности.).
    const autoBtns = document.querySelectorAll('.block-tabs-main-home__item');
    	autoBtns.forEach(
        btn => {
          btn.addEventListener("click", (e) => {			
            const contentId = btn.getAttribute("data-content-id");     
            document
                .querySelectorAll(`[data-id="${contentId}"], .fits-cars-showmore-content_active`)
                .forEach( (el) =>
                  el.classList.toggle('fits-cars-showmore-content_active')
                )
    	        }
          );
        }
      );

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

    neuotq
    @neuotq
    Прокрастинация
    Ставьте ему фокус насильно после смены "режима".
    document.getElementById("myPasswordField").focus();

    Это строку, с вашим айди поля, добавьте после строчки со сменой режима. Возможно там уже тем или иным способом находится элемент инпута, тогда просто у этого элемента вызвать метод focus()
    Ответ написан
    1 комментарий
  • Почему переменная не меняет значение, если обернуть действие в функцию?

    neuotq
    @neuotq
    Прокрастинация
    В первом случае происходят простое прямое изменение переменной existence1, вы там напрямую к ней обращаетесь и меняете значение.
    Во втором случае в момент вызова addcartProduct(existence1) значение в переменной existence1 копируется и дальше используется внутри функции addcartProduct в переменной num. При передаче параметров переменные в javascript копируются по значению, те создаётся новая переменная и туда копируется значение из переденной в параметре(есть нюансы с объектами!). Во многих язык программирования есть инструменты позволяющие передавать переменную по ссылке, но javascript такого не поддерживает.
    Поэтому будем использовать нюансы передачи значения в переменных объектах(и массивах).
    Если огрубить, то при создании объекта в js сам объект создаётся где-то в памяти, а в переменную помещается идентификатор(ссылка) на то что это за объект. Так вот, при передаче объекта в функцию, в локальную переменную внутри копируется именно это значение(а не поля и элементы как кажется), поэтому переменная внутри функции хоть и другая, но ссылается на этот же объект в памяти.
    Поэтому если мы изменим свойства этого объекта, то они поменяются и в оригинале. При это если бы эту локальную переменную перепишем(например создадим новый объект) то внешняя переменная не изменится, ведь во внешней осталась оригинальная ссылка на старый объект, а во внутреннем будет новая уже.
    Кажется непонятным, но все просто если понять что у объектов(и массивов) значение переменной это айди объекта в памяти, а переменные в js передаются всегда по значению, поэтому всё логично.
    Итак перепишем ваш пример, чтобы мы могли менять значение снаружи из функции через локальную переменную.

    //Объекты обычно объявляют как константы, чтобы случайно не переписать сам объект
    //при это свойства объекта менять можно
    //потому что константа это значение переменной - ссылка на объект в памяти
    const existence1=  { 
    value: false
    };
    
    function addcartProduct (num) {
      if (num.value) {console.log('+1')}
        else {
          console.log(num)
          num.value = true;
        }
    }
    
    //false
    console.log(existence1.value)
    
    addcartProduct(existence1);
    //true
    console.log(existence1.value)
    Ответ написан
    Комментировать
  • Как остановить обратный отсчет?

    neuotq
    @neuotq
    Прокрастинация
    countdown возвращает объект с разными свойствами в тч со свойством value, которое при случае когда дата "от" больше даты "до" будет отрицательным. Значит нужно добавить проверку на это значение.

    Примерно так:

    const standart = moment().tz("Europe/Moscow");  
    const nowDay = moment(standart, 'YYYY-MM-DD HH:mm');
      
    const eventDay = moment('2023-05-21 02:05', 'YYYY-MM-DD HH:mm'); 
    
    
    const countDown = () => {     
      const timers = moment(nowDay, 'YYYY-MM-DD HH:mm')
        .countdown(eventDay, "YYYY-MM-DD HH:mm");
      console.log(timers.value)
      if(interval && timers.value <= 0) {
            clearInterval(interval)
       }
          console.log(timers.toString())
       }
    
    const interval = setInterval(countDown, 1000);


    Под себя адаптируйте этот код. Ну и конечно от momentjs и компашки нужно избавиться, но это уже отдельная легаси история.
    Ответ написан
    Комментировать
  • Не работает slick слайдер после того, как отображаю слайды с помощью JS с подгрузкой json данных?

    neuotq
    @neuotq
    Прокрастинация
    А где и как инициализируется сам слик?
    Возможно вы забыли после обновления html его заново инициализировать, чтобы он узнал об изменениях.
    Отдельно отмечу что в Slick есть функции динамического добавления слайдов программно. Может быть вам такой способ больше подойдёт?
    Ответ написан
  • Как сделать анимацию курсора под текстом?

    neuotq
    @neuotq
    Прокрастинация
    У вас другие слои перехватывают события poiner-events, поэтому конвас как бы не видит их.
    Для этого, например, можно для main__section отключить : pointer-events: none;, а потом для нужных элементов включать, в данном случае для canvasFluid: pointer-events: all;

    PS и помним что такой эффект крайне ресурсоемкий, советую протестировать на "слабых" устройствах, на многих будет МНОГО меньше 60 fps, да даже меньше 10.
    Ответ написан
    4 комментария
  • Как выделить селектор?

    neuotq
    @neuotq
    Прокрастинация
    Пффф, легко.
    Берём вычисляем свгешку, и родитель родителя.
    Да не супер надёжно, но работает) Можно ещё доработать специфичность.
    document.querySelector('[d="M5.293 8.293a1 1 0 0 1 1.414 0L12 13.586l5.293-5.293a1 1 0 1 1 1.414 1.414l-6 6a1 1 0 0 1-1.414 0l-6-6a1 1 0 0 1 0-1.414Z"]').parentElement.parentElement;
    Ответ написан
  • Как выводить несколько значений подряд при клике?

    neuotq
    @neuotq
    Прокрастинация
    Ваш код грязный конечно, даже стили немного.
    Вот я тоже набросал грязное решение. Вам я бы рекомендовал немного переверстать, но в целом(обратите внимание я добавил pointer-events none на .types-select__option-text в css на кодпене это видно)
    Саму идею я думаю вы поймёте и под себя переделаете. Ниже код и кодпен.

    //Данные по содержанию меню
    const furnTypes = [
      {
        'id' : 1,
        'title' : 'Офисная&nbsp;<span>меб</span>ель'
      },
      {
        'id' : 2,
        'title' : 'Техника / сантехника'
      },
      {
        'id' : 3,
        'title' : 'Сборка кухни'
      },
    ];
    
    //Каждое активно может быть только один раз
    const activeMenuItems =   new Set();
    
    const clickHandler = e => {
      if(activeMenuItems.add(parseInt(e.target.getAttribute("furn-id"))) ) {
        //Если поменялся перестроим меню
        updateActiveMenuItems(activeMenuItems);
      }  
    };
    
    //Строим меню на основе данных items, вставляем в target
    //на элементы вешаем событие clickHandler
    buildSelectMenu = (target, items, clickHandler) => 
    {
      //создаем родителя
      const parentUl = document.createElement("ul");
      parentUl.classList.add('types-select__options');
      //Каждый из пунктов
      items.forEach(
        item => {
          const childLi = document.createElement("li");
          childLi.classList.add('types-select__option');
          childLi.setAttribute('furn-id', item['id']);
          childLi.addEventListener("click",clickHandler);
          const childTextBlock = document.createElement("div");
          childTextBlock.classList.add('types-select__option-text');
          // Лучше потом на setHtml заменить, но пока нет поддержки
          childTextBlock.innerHTML = item['title'];
          childLi.appendChild(childTextBlock);
          parentUl.appendChild(childLi);
        }
      )
      //Запихиваем туда куда нужно
      target.appendChild(parentUl);  
      return parentUl; 
    }
    
    const updateActiveMenuItems = ids => {
      
      const parent = document.querySelector('.types-select__active-items');
      parent.innerHTML = '';
      ids.forEach( id => {
        const curItem = furnTypes.find( el => el['id'] === id)
        const activeMenuItemEl = document.createElement("div");
        const activeMenuItemTitleEl = document.createElement("span");
        activeMenuItemTitleEl.innerHTML = curItem['title'];
        const activeMenuItemdeleteButtonEl = document.createElement("button");
        //Лучше через текстовую ноду
        activeMenuItemdeleteButtonEl.innerHTML = 'x';
        activeMenuItemdeleteButtonEl.setAttribute('active-furn-id', curItem['id']);
        
        activeMenuItemdeleteButtonEl.addEventListener("click", e => {
          //Чтобы кликалась не взирая на клик событие родителя
          if(e && e.stopPropagation) e.stopPropagation();
          
          if(activeMenuItems.delete(parseInt(e.target.getAttribute("active-furn-id"))) ) {
            //Если поменялся перестроим меню
             updateActiveMenuItems(activeMenuItems);
          } 
        }); 
        
        activeMenuItemEl.appendChild(activeMenuItemTitleEl);
        activeMenuItemEl.appendChild(activeMenuItemdeleteButtonEl);
        parent.appendChild(activeMenuItemEl);
        
      })
      
    }
    
    // Строим меню
    const furnitureMenu = buildSelectMenu(
      document.querySelector('#furnitureMenu'), 
      furnTypes, 
      clickHandler
    );
    
    document.querySelector('.types-select__btn')
      .addEventListener("click", e => {
        // Странное имя класса, наверное должн быть types-select__menu_active
        document.querySelector('.types-select__menu').classList.toggle("_active");
    } )


    Ответ написан
    1 комментарий
  • Как сохранить строку в JS в Windows1251 ANSI?

    neuotq
    @neuotq
    Прокрастинация
    Привет друг.
    Лучше пользоваться любезно представленным для нас Encoding API

    //Создаем энкодер, который нам сделает ArrayBuffer в utf8
    //Без параметра будет кодировка UTF8
    const encoderUTF8 = new TextEncoder();
    //Закодируем строку
    const arrayUTF8 = encoderUTF8.encode("Привет!");
    //Теперь создадим декодер в cp1251, список кодировок и их метки здесь 
    // https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings
    let encToCP1251 = new TextDecoder('cp1251');
    //Получаем строку в нужной кодировке
    const strCP1251 = encToCP1251.decode(arrayUTF8);
    
    
    //Генерируем URL
    const url = URL.createObjectURL(
      //Создаем файл
      new File([strCP1251], "foo.txt", {
      type: "text/plain",})
    );
    
    //Создаём ссылку
    let aElement = document.createElement('a');
    aElement.href = url;
    aElement.download = 'filenameCP1251.txt';
    aElement.textContent = 'Скачай меня полностью!';
    document.body.appendChild(aElement);


    Живая демка

    Ответ написан
  • Есть ли смысл делать анимацию без JS?

    neuotq
    @neuotq
    Прокрастинация
    Анимация = анимации рознь.

    Конкретный ответ со списком вы тут не увидите, это будет большая статья, со множественными "а вот тут", "но здесь" просто потому что многое зависит от контекста, задач, планирование.
    Главные рекомендации это не делать на js то, что отлично реализуется с помощью css. Этим к сожалению часто болеют многие фронтендеры, особенно из тех кто принципиально не любит вёрстку. Банальные примеры некоторые виды трансформаций объектов при булевых сменах какого параметра(условно навел/убрал наведения, вкл-выкл и тп).

    Но нужно иметь ввиду, что там где у вас выходит сложная логика, разные усложнённые сценарии, динамические параметры запуска и тп и тд. Без js естественно никуда.

    Поэтому просто зная возможности css, имея здравый смысл, вы будете видеть и знать где что использовать.
    К счастью css тоже в последнее время активно развивается давай нам всё больше возможностей.
    Поэтому - простая штука, что-то типа одноразовых анимации, простого повторения, туда сюда - подумать про css.
    Если к этому добавляются всякие реакции на сложные тайминги, старт-пауза перемотать остановить на промежутке и тп - js.
    Ну и безусловно разные сложные, многоходовки с завязкой друг на друга - однозначно js.

    В целом информации на эту тему достаточно в интернете, мудрить здесь особо не стоит. Поэтому повторюсь: просто здравый смысл и держать в уме знание css и не брезговать его использовать. Нередко кстати сами верстальщики уже готовят эти анимации, но это уже отдельный разговор организации команд и внутрипроектной кухни. Я сторонник того что фронтэндер, пусть и не обязан прям верстать верстать, но знать вёрстку/css должен на очень хорошем уровне.
    Ответ написан
    Комментировать
  • Внесение данных в input react из внешнего подключаемого скрипта?

    neuotq
    @neuotq
    Прокрастинация
    В целом нужен код. Но если человеческим языком:
    Нов реакте принято не трогать значения напрямую через обращение к DOM элементам. У вас есть определенное состояние, привязанные переменные, разные мутаторы, слушатели событий и тп.
    Поэтому когда вы в ручную ставите значение через input.value вы, скорее всего, нарушаете логику работы вашего приложения. И при фокусе внутренняя логика реакта срабатывает, сверяет текущее состояние приложение(сверяет данные) и приводит в соответствие с ним интерфейс(ваши инпуты).
    А так как вы данные не меняли, у вас как бы обнуляется поле.
    В целом переставайте думать html элементами. Думайте данными, меняйте данные, подключайте данные. Остальное просто интерфейс, который вы собираете как кирпичики подключая к ним провода с данными. Реакт уже сам берёт на себя обновление непосредственно того что будет уже в браузере отображаться. Ваша задача писать логику как это будет меняться, не трогая(почти всегда) сами эти элементы напрямую.
    Поэтому откройте документацию по реакту, посмотрите ролики. Хотя бы базовые основы, там всё просто.
    Ответ написан
  • Как при import убрать расширение .js?

    neuotq
    @neuotq
    Прокрастинация
    Через import в nodejs реализуется относительно новый принцип модулей(для nodejs) - ECMAScript. Указывать расширение файла при этом обязательно.
    Ответ написан
    Комментировать
  • Как решить задачу по изменению элементов JS c помощью input?

    neuotq
    @neuotq
    Прокрастинация
    Хорошо бы let не использовать если в этом нет необходимости(в данном случае не супер критично).
    Я бы посоветовал вывести нужные штуки в отдельные функции, которые вызываются по необходимости.
    Тогда будет универсальный подход и свобода действий.
    Отдельная функция на то, чтобы поставить слушалку события на клик, которая примет как параметр элемент - решит вашу проблему.
    Вот код и демо на кодпене
    Ответ написан
    Комментировать
  • Как получить число и вернуть измененное число в новом теге?

    neuotq
    @neuotq
    Прокрастинация
    Вы немного запутались где какие у вас объекты, внутренняя переменная в функции у вас можно вообще убрать и упростить, да и метода innerHTML у нее нет
    function replaceNum() {
        const price = document.querySelector('.amount').innerHTML;
        const res = document.querySelector('.res');
        const num = 2;
        res.innerHTML = `${price * num}`;
    }
    replaceNum();

    const вместое let - тк мы далее не меняем эти переменные.
    Далее домашка вам, добавить проверку на существовании элементов откуда берёте и куда добавляете число, а так же проверку на то что данные из amount - являются числом, а не чем-то другим, а так же можно добавить параметры функции, как раз элемент откуда берём, элемент куда и множители
    Ответ написан
    1 комментарий
  • Как оптимально искать в большом массиве?

    neuotq
    @neuotq
    Прокрастинация
    Очевидный двоичный поиск. Рекурсивная функция, берёте элемент который по середине, сравниваете, отсекаете соответсвующую половину, и повторяете снова. В интернете полно примеров.
    Ответ написан
    1 комментарий
  • Как получить обьекты из массива по их значению?

    neuotq
    @neuotq
    Прокрастинация
    Используйте filter
    let ar = [
    {
    'name' : 'Vasya',
    'isCool' : true
    },
    {
    'name' : 'Sanya',
    'isCool' : false
    }
    ];
    
    ar = ar.filter(el => el.isCool)
    Ответ написан
    1 комментарий