Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.06.2020, 14:06
ab3 ab3 вне форума
Интересующийся
Отправить личное сообщение для ab3 Посмотреть профиль Найти все сообщения от ab3
 
Регистрация: 26.05.2020
Сообщений: 10

Debounce input выдает ошибку
Хочу затормозить ввода интпута для поиска,использую lodash.debounce,debounce работает(консоль выводит),но когда доходит до инпута выдает ошибку:
country.js?dc0a:18 Uncaught TypeError: Cannot read property 'elements' of null
at HTMLFormElement.searchInputHandler (country.js?dc0a:18)
at invokeFunc (index.js?8df7:160)
at trailingEdge (index.js?8df7:207)
at timerExpired (index.js?8df7:195)


Если не использовать debounce то все работает отлично,подскажите в чем проблема?Почему пишет null не могу понять

Вот мой код:
import countryListItem from '../templates/counry-list-item.hbs';
import countryList from '../templates/country-list.hbs';
import fetchCountry from '../services/fetch-country.js';
import debounce from 'lodash.debounce';
import { Notyf } from 'notyf';

const notyf = new Notyf();

const refs = {
  counryList: document.querySelector('#country-list'),
  seacrhForm: document.querySelector('#search-form'),
};

// refs.seacrhForm.addEventListener('input', debounce(searchInputHandler, 500));
refs.seacrhForm.addEventListener('input', searchInputHandler);

function searchInputHandler(e) {
  clearListItem();

  console.log('aaa');

  const form = e.currentTarget;
  const input = form.elements.query;
  const inputValue = input.value;

  if (inputValue === '') {
    return;
  } else {
    fetchCountry.query = inputValue;

    fetchCountry
      .fetchCountries()
      .then(data => {
        if (data.length > 10) {
          notyf.error(
            'Too many matches found.Please enter a more specific query!',
          );
        } else if (data.length >= 2 && data.length <= 10) {
          renderCountryList(data);
        } else if (data.length === 1) {
          renderCountryListItems(data);
        } else notyf.error('Nothing found.Please enter a valid request');
      })
      .catch(error => console.log(error));
  }
}

function renderCountryListItems(items) {
  const markup = items.map(item => countryListItem(item)).join('');
  buildCountryList(markup);
}

function renderCountryList(items) {
  const markup = countryList(items);
  buildCountryList(markup);
}

function buildCountryList(item) {
  refs.counryList.insertAdjacentHTML('beforeend', item);
}

function clearListItem() {
  refs.counryList.innerHTML = '';
}

Последний раз редактировалось ab3, 12.06.2020 в 15:19.
Ответить с цитированием
  #2 (permalink)  
Старый 12.06.2020, 14:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

ab3,
const form = document.querySelector('form');

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 12.06.2020, 15:23
ab3 ab3 вне форума
Интересующийся
Отправить личное сообщение для ab3 Посмотреть профиль Найти все сообщения от ab3
 
Регистрация: 26.05.2020
Сообщений: 10

Переделал,я подключался к форме,просто скидывал не весь код(не смог найти как правильно выкладывать код на форум и поэтому скинул только малую часть)без debounce все работает с debounce только

clearListItem();

  console.log('aaa');

  const form = e.currentTarget;

Последний раз редактировалось ab3, 12.06.2020 в 15:25.
Ответить с цитированием
  #4 (permalink)  
Старый 12.06.2020, 15:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

ab3,
вы меняли строку 22
const form = e.currentTarget;

на
const form = document.querySelector('form');

?
Ответить с цитированием
  #5 (permalink)  
Старый 12.06.2020, 15:52
ab3 ab3 вне форума
Интересующийся
Отправить личное сообщение для ab3 Посмотреть профиль Найти все сообщения от ab3
 
Регистрация: 26.05.2020
Сообщений: 10

Спасибо,так работает,но я так обращаюсь на прямую к форме и если у меня 2 формы,то работать не будет,вернее будет находить первую...Нашел ошибку,нужно было обращаться e.target.value.Чет сразу не додумался проконсолить event

Последний раз редактировалось ab3, 12.06.2020 в 15:57.
Ответить с цитированием
  #6 (permalink)  
Старый 12.06.2020, 16:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

ab3,
const form = e.path.find(({localName})=> localName == 'form');
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UglifyJs выдает ошибку при import class s24344 Сборка проекта, утилиты 2 24.06.2018 10:29
Выдает ошибку Uncaught SyntaxError: Unexpected identifier script4.js:2 Xfacktor Общие вопросы Javascript 11 10.08.2014 23:18
При добавлении DOCTYPE "плывут" размеры input type=text Demath (X)HTML/CSS 4 08.07.2012 19:27
Выдает ошибку. Что делать? octavian Общие вопросы Javascript 1 20.02.2010 12:13
ИЕ выдает ошибку в простеньком скрипте. QQQ AJAX и COMET 14 27.03.2009 18:10