Задать вопрос
Ответы пользователя по тегу JavaScript
  • Почему не получается воспользоваться js модулем?

    black1277
    @black1277
    Вольный стрелок
    При использовании импортов тип скрипта должен быть указан как "module". Попробуйте так:
    <script type="module"> // <-- =========  здесь =============
            const tooltip = d3.select("body").append("div")
                .attr("class", "tooltip")
                .style("opacity", 0);
    //=============
                        const script = document.createElement('script');
                        script.id = 'dynamic-script'; 
                        script.type = 'module';    //================= Добавляем этот атрибут================
                        script.src = "/static/js/" + scriptFile; 
                        document.body.appendChild(script);
    //=============
    </script>
    Ответ написан
    2 комментария
  • Как в JS добавить вторую кнопку Закрыть или Отмена?

    black1277
    @black1277
    Вольный стрелок
    const fn = () => {
      document.getElementById('burger-menu').classList.toggle("burger-hidden");
      document.getElementById('burger-button').classList.toggle("burger-icon-close");
    }
    document.querySelectorAll('.burger-icon').forEach(el=>el.addEventListener('click', fn))
    Ответ написан
    2 комментария
  • Как сделать возможность посадить элемент при Drag'n'Drop на определенное место?

    black1277
    @black1277
    Вольный стрелок
    Примерно, вот так:

    const deleteButton = document.querySelectorAll('.column__card-button');
    const addButton = document.querySelector('.add_card')
    const cardContent = document.querySelector('.column__card-content_add')
    const columns = document.querySelectorAll('.column')
    const columnTitle = document.querySelector('.column_title')
    const mainContainer = document.querySelector('.main_container')
    const toDoContainer = document.querySelector('.todo_container')
    let actualCard = null;
    const tasks = document.querySelectorAll('.column__card')
    const areatxt = document.getElementById('textareaid')
    
    addButton.addEventListener('click', function() {
      let columnCardText = areatxt.value;
      areatxt.value = ''
      const newColumnCard = `<div class="column__card" draggable="true"><div
      class="column__card-content">${columnCardText}</div><button class="column__card-button"></button></div>`
      columnTitle.insertAdjacentHTML("afterEnd", newColumnCard);
      //updateLocalStorage()
    });
    
    mainContainer.addEventListener('click', function(event) {
      if (event.target.classList.contains('column__card-button')) {
        const card = event.target.closest('.column__card');
        if (card) {
          card.remove();
        }
      }
      //updateLocalStorage()
    });
    
    function dragStart(e) {
      actualCard = e.target
      e.target.classList.add("is-dragging");
    };
    
    function dragEnd(e) {
      this.classList.remove('hovered');
    };
    
    function dragEnter(e) {
      e.preventDefault();
      this.classList.add('hovered');
    };
    
    function dragLeave() {
      this.classList.remove('hovered');
    };
    
    function dragOver(e) {
      e.preventDefault();
      const activeElement = mainContainer.querySelector(`.is-dragging`);
      const currentElement = e.target;
      
      const isMoveable = activeElement !== currentElement && currentElement.classList.contains(`column__card`);
    
      if (!isMoveable) {
        if (e.target.classList.contains("column") && !this.contains(actualCard)) {
          this.appendChild(actualCard);
        }    
        return;
      }
      // e.clientY — вертикальная координата курсора в момент,
      // когда сработало событие
      const nextElement = getNextElement(e.clientY, currentElement);
    
      // Проверяем, нужно ли менять элементы местами
      if (
        nextElement &&
        activeElement === nextElement.previousElementSibling ||
        activeElement === nextElement
      ) {
        return;
      }
    
      this.insertBefore(activeElement, nextElement);  
    };
    const getNextElement = (cursorPosition, currentElement) => {
      // Получаем объект с размерами и координатами
      const currentElementCoord = currentElement.getBoundingClientRect();
      // Находим вертикальную координату центра текущего элемента
      const currentElementCenter = currentElementCoord.y + currentElementCoord.height / 2;
    
      // Если курсор выше центра элемента, возвращаем текущий элемент
      // В ином случае — следующий DOM-элемент
      const nextElement = (cursorPosition < currentElementCenter) ?
          currentElement :
          currentElement.nextElementSibling;
    
      return nextElement;
    };
    for (const column of columns) {
      column.addEventListener('dragenter', dragEnter);
      column.addEventListener('dragleave', dragLeave);
      column.addEventListener('dragover', dragOver);
      column.addEventListener('drop', drop);
      column.addEventListener('dragstart', dragStart);
      column.addEventListener('dragend', dragEnd);
    }
    
    function drop(e) {
      e.preventDefault();
      actualCard.classList.remove("is-dragging");
      actualCard = null;
      this.classList.remove('hovered');
      //updateLocalStorage();
    };


    Запоминалку на LocalStorage рипнул только.
    Ответ написан
    Комментировать
  • Как исправить ошибку .targets is not allowed in preset options?

    black1277
    @black1277
    Вольный стрелок
    Во-первых, убедитесь, что пресеты установлены тоже:
    npm i -D @babel/preset-env
    Во-вторых, вы пару квадратных скобок забыли. Должно быть вот так:
    {
            test: /\.js$/,
            exclude: /node_modules/,
            use: {
                    loader: 'babel-loader',
                    options: {
                      presets: [
                        ['@babel/preset-env', { targets: "defaults" }]
                      ]
                    }
                  }
          },
    Ответ написан
    Комментировать
  • Почему моя анимация не работает?

    black1277
    @black1277
    Вольный стрелок
    Потому что вы ищете свойство "--main-up" в селекторе класса .favicon, а определили его в :root
    Попробуйте так
    let root =  document.documentElement;
    root.style.setProperty("--main-up", random+'px');
    Ответ написан
    Комментировать
  • Как контролировать ввод в input?

    black1277
    @black1277
    Вольный стрелок
    примерно так
    if(name==='entity' && !value.match(/^\d+$/)) return // если имя равно entity и введены не только цифры - делаем возврат из ф-и (без изменения стейта)
    Ответ написан
  • Как открыть ссылку во внешнем приложении?

    black1277
    @black1277
    Вольный стрелок
    Вот тут описан принцип для проводника Windows, делайте аналогично - Как из браузера открыть папку в проводнике Windows
    Ответ написан
    Комментировать
  • Нужно ли импортировать jquery в каждый файл react приложения?

    black1277
    @black1277
    Вольный стрелок
    Да нужно. Почитайте про модули и пространства имен. В финальном проекте jquery будет включен один раз(не бойтесь дублирования не будет).
    Ответ написан
    1 комментарий
  • Как правильнее создавать инстанс класса, все инициализирующие методы которого будут выполнены только внутри самого класса?

    black1277
    @black1277
    Вольный стрелок
    Сделайте класс со статическими методами и свойствами, но не используйте это
    new Geomap( {} );
    потому что по завершении всех функций - созданный объект будет удален. Можно, конечно сделать внутри вечно ожидающие кэлбеки, которые через замыкание будут держать объект в памяти, но для чего это нужно я не представляю - проще использовать тогда паттерн модуля, вместо класса.
    Ответ написан
    2 комментария
  • Что за баг при замене (replace) текста?

    black1277
    @black1277
    Вольный стрелок
    Так $& - Вставляет сопоставившуюся подстроку - вот документация
    Заэкранируй символ $ вот так
    const content = `&1===e.nodeType)if(r="data-"+t.replace(K,"-$$&").toLow`;
    Ответ написан
    Комментировать
  • Что происходит в этом цикле?

    black1277
    @black1277
    Вольный стрелок
    // создаем стрелочную функцию, принимающую два параметра
    const countChars = (str, char) => {
    	// создаем переменные и присваиваим им значение 0
    	let i = 0;
    	let count = 0;
    	// запускаем цикл с предусловием
    	while (i < str.length) { // пока i меньше чем длина строки str
    		// исполняем тело цикла
    
    		// берем символ из строки str расположенный по индексу i и переводим в нижний регистр
    		// берем символ из аргумента функции и переводим в нижний регистр
    		if (str[i].toLowerCase() === char.toLowerCase()) { // сравниваем оба значения
    			// если совпало увеличиваем счетчик на 1
    			count = count + 1;
    		}
    		// перед новой итерацией цикла увеличиваем индекс на 1
    		i = i + 1;
    	}
    // возвращаем из функции накопленный результат подсчета или начальное значение если совпадений не было
    	return count;
    };
    
    let result = countChars('abba#abba#abba#', '#') // пример использования
    console.log(result); // 3
    Ответ написан
    Комментировать
  • Почему не работает проверка на val input`а?

    black1277
    @black1277
    Вольный стрелок
    Обычно у input проверяют value на значение. А element.val() это метод из jQuery. Вы уверены что у вашего input есть атрибут val? Выведите его в консоль сначала.
    Ответ написан
  • Какую книгу прочитать по JavaScript со средним уровнем знания js?

    black1277
    @black1277
    Вольный стрелок
    Прочитайте серию книг "Вы пока еще не знаете JS" Кайла Симпсона, есть издания 2022г.
    Ответ написан
    Комментировать
  • Npm init не работает, как исправить?

    black1277
    @black1277
    Вольный стрелок
    Идете в папку C:\Program Files\nodejs\ там находите 4 файла npm.cmd, npm, npx.cmd, npx - открываете их в редакторе и заменяете prefix -g на prefix --location=global Мне это помогло. Если что - вот ссылка на issues в библиотеке npm https://github.com/npm/cli/issues/4980
    Ответ написан
    6 комментариев
  • Как изменить имя скачиваемого файла?

    black1277
    @black1277
    Вольный стрелок
    Атрибут download соблюдается только на ресурсах с тем же доменом.
    Ссылка на документацию https://developer.mozilla.org/ru/docs/Web/HTML/Ele...
    Был похожий вопрос

    Как изменить имя скачиваемого файла?. Там у автора вроде, получилось через XMLHttpRequest
    Ответ написан
    2 комментария
  • Как выбрать все кнопки с одним классом и сделать открытие/закрытие контента?

    black1277
    @black1277
    Вольный стрелок
    Так document.querySelector и выбирает первый элемент, удовлетворяющий поиску. Чтобы добавить действие всем элементам с классом btn-more нужно использовать document.querySelectorAll, который возвращает массивоподобную коллекцию, по которой можно пробежать мапом и навесить действие. Но, основная сложность будет в том, чтобы каждой кнопке сопоставить свои элементы, которые нужно скрывать\показывать. Нужно либо добавить им дополнительные атрибуты с одинаковым значением для каждой группы либо по структуре DOM дерева выбирать нужные.
    Ответ написан
    2 комментария
  • Почему не считывается value инпута?

    black1277
    @black1277
    Вольный стрелок
    Вы считываете значения инпута однократно, в момент выполнения функции test. Для того чтобы это работало как вы хотите - нужно вешать обработчик на инпут, реагирующий на изменение значения в нем
    let test = () => {
    let inp = document.querySelector('input')
    let warn = document.createElement('div')
    let att = inp.getAttribute('value')
    inp.id = 'inpId'
    let inpId = document.getElementById('inpId');
    inpId.addEventListener("input", ()=>{
    if (inpId.value > 3) {
        warn.style.display = 'none';
    }
    })
    warn.classList.add('hi');
    warn.innerHTML = 'Тестовая штука';
    inp.insertAdjacentElement('afterend', warn);
    }
    test();

    ну и скрипт должен располагаться ниже инпута в потоке html
    Ответ написан
    1 комментарий
  • Как сохранить select option в localstorage?

    black1277
    @black1277
    Вольный стрелок
    Чтобы при загрузке страницы был выбран сохраненный вариант из списка option, нужно чтобы у нужного варианта был атрибут selected. Пример:
    <select name="nm" id="nam">
      <option value="QBC">QBC</option>
      <option value="QEF">QEF</option>
      <option value="GHI" selected>GHI</option> <!-- этот вариант будет выбран-->
      <option value="KLM">KLM</option>
    </select>

    значит вам нужно в каждом option выводить переменную вместо selected, которая будет либо пустая, либо равна selected (если сохраненное состояние равно выводимому option).
    Добавил рабочий пример, где всё работает (проверял)
    Пример на функциональных компонентах

    import React, { useState, useEffect } from 'react'
    
    const LocalStorage = () => {
      const date = [
        { symbol: 'RU', label: 'рубль' },
        { symbol: 'USD', label: 'доллар' },
        { symbol: 'EUR', label: 'евро' }
      ]
    
      const [curr, setCurrencies] = useState(date)
      const [currentSymbol, setCurrentSymbol] = useState("EUR") // опция выбранная по умолчанию (если нет данных в localstorage)
    
    // срабатывает один раз при загрузке компонента
      useEffect(() => {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol')
          setCurrentSymbol(item)
        }
      }, [])
    
    // обработчик - срабатывает при выборе опции списка
      const selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        setCurrentSymbol(e.target.value)
      }
    
      return (
        <div>
          <select onChange={selectHandler} value={currentSymbol}>
            {
              curr.map(currencies => (
                <option key={currencies.symbol} value={currencies.symbol}>
                  {currencies.symbol} {currencies.label}
                </option>
              )
              )
            }
          </select>
        </div>
      )
    }
    
    export default LocalStorage


    на классовых

    import React, { Component } from 'react'
    
    
    class ClassLocal extends Component {
      constructor(props){
        super(props);
        this.state = {
          curr: [
            { symbol: "RU", label: "рубль" },
            { symbol: "USD", label: "доллар" },
            { symbol: "EUR", label: "евро" }
          ],
          currentSymbol: "EUR"
        }
      }
    
    
      componentDidMount() {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol');
          this.setState({currentSymbol: item})
        }
      }
    
    
      selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        this.setState({currentSymbol: e.target.value})
      }
    
      render() {
        return (
          <div>
            <select onChange={this.selectHandler} value={this.state.currentSymbol}>
              {
                this.state.curr.map(currencies => (
                    <option key={currencies.symbol} value={currencies.symbol}>
                      {currencies.symbol} {currencies.label}
                    </option>
                  )
                )
              }
            </select>
          </div>
        )
      }
    }
    
    export default ClassLocal

    Ответ написан
    7 комментариев
  • В чем отличие EventLoop в браузере от EventLoop в Node.js?

    black1277
    @black1277
    Вольный стрелок
    Вы немного запутались. Начиная с 11-й версии Node.js, разница в поведении приведенного вами кода в браузере и ноде - была устранена. Касаемо 6 этапов или фаз, они происходят внутри движка libuv(libuv - это многоплатформенная библиотека C, которая обеспечивает поддержку асинхронного ввода-вывода на основе циклов событий).
    Разница в том, что в Node.js мы можем не дожидаться окончания всех этих фаз, а вклиниться на определенных этапах для исполнения микрозадач (при помощи setImmediate и process.nextTick), а в браузере идет взаимодействие с Web API’s (браузерные или веб API), из которого могут поступать новые события (клики, движения мыши и др.), добавляющие в очередь новые макрозадачи(если установлены обработчики этих событий). Кроме того, в браузере есть рендеринг, который не может быть выполнен пока идет выполнение задачи движком(из этого следует, что необходимо разбивать тяжелые и длительные задачи на части).
    Как я не пытался изложить точнее и короче, к моим словам можно придраться буквально к каждой фразе. Поэтому, лучше самому изучить первоисточник и пару статей на русском:
    What is the Event Loop?
    Объяснение работы EventLoop в JavaScript
    Игра по правилам: Event loop Node.js
    Как устроены цикл событий и стек вызовов в JavaScript
    Ответ написан
    1 комментарий
  • Как сравнить значение времени?

    black1277
    @black1277
    Вольный стрелок
    Комментировать