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

    FinGanapre
    @FinGanapre
    Реализация интересная, но вообще так:
    get last() {return this.method()}

    Вам просто не нужен method(). Перенесите тело в last.
    Ответ написан
    Комментировать
  • Как настроить добавление в корзину?

    FinGanapre
    @FinGanapre
    1. При добавлении в корзину проверять нет ли этого товара в корзине (У вас будут id товаров в реальном приложении, проверяйте по ним. В корзину в принципе складывают только id товаров)
    2. Кнопки добавить в корзину уже не должно быть в карточке товара, если он в корзине. На её место можно вставить выбор количества товара (с мин и макс значение, вводом в ручную и + -), а также добавить кнопку удалить если отдел маркетинга не против (можно удалять выбором менее 1)
    3. Очистка корзины = присвоение пустого массива. Из локала можно удалить так
    4. Подобное лучше писать на фреймворках, т.к. без них придётся ручками контролировать ререндеринг интерфейса. Как минимум стоит описать это через класс.
    Ответ написан
    Комментировать
  • Возможно ли прописать условие, если при нажатии кнопки воспроизведется функция 1, то name = "Vlad"?

    FinGanapre
    @FinGanapre
    Не уверен, что вам нужны 3 разные функции. Лучше закинуть имена в дата атрибуты кнопок и ловить клики на всех кнопках в одном обработчике. Т.к. можно кликнуть мимо кнопки, проверять есть ли дата свойство у элемента по которому кликнули перед присваиванием нового имени. Например так
    Ответ написан
    Комментировать
  • Есть ли язык Eris и вообще существует-ли?

    FinGanapre
    @FinGanapre
    Это не язык, а обёртка под node.js:
    https://www.npmjs.com/package/eris
    Ответ написан
    Комментировать
  • Как передавать значение from и to в div используя ion range slider?

    FinGanapre
    @FinGanapre

    Всё работает, не вижу проблемы
    Ответ написан
    Комментировать
  • Как переключать список через другой список?

    FinGanapre
    @FinGanapre
    Самый простой способ. Оборачиваем всё в див и ставим на него прослушку кликов. Если клик не по кнопке - выходим из функции. Задаём дата атрибуты у кнопок и списков. По клику на кнопку проверяем не открыт ли список, относящийся к ней. Если открыт - закрываем его и выходим из функции. Если закрыт, проверяем, нет ли открытых списков, если есть - закрываем. Открываем список, относящийся к кнопке. Списки разместил рядом с кнопками только чтобы было видно, что открываются и закрываются нужные. Разметку можно делать какую требуется, главное, чтобы кнопки и списки совпадали по дата атрибутам и находились внутри корневого элемента. Если нужно выносить кнопки в другие части документа, можно исправить поиск элементов на поиск по всему документу. В последнем варианте, если таких блоков на странице может быть несколько, можно добавить дополнительные дата атрибуты или префиксы к существующим.
    Код

    Pug
    .lists-app
      - const lists = new Array(10)
      - const items = new Array(3)
      
      each i, idx in lists
        button(
          data-list-toggle=`${idx}`
        ) open #{idx + 1}
        ul.lists-app__list(
          data-list=`${idx}`
        )
          each i, idx in items
            li list elem #{idx + 1}

    SASS
    .lists-app
      &__list
        display: none
        &--open
          display: block

    JS
    const rootClass = 'lists-app'
    const openClass = 'lists-app__list--open'
    const $listsRoot = document.querySelector(`.${rootClass}`)
    
    const findList = idx => {
      return $listsRoot.querySelector(`[data-list='${idx}']`)
    }
    const closeList = $el => {
      $el.classList.remove(openClass)
    }
    const openList = $el => {
      $el.classList.add(openClass)
    }
    const isOpen = $el => $el.classList.contains(openClass)
    const getOpenList = () => {
      return $listsRoot.querySelector(`.${openClass}`)
    }
    
    $listsRoot.addEventListener('click', e => {
      if (!e.target.hasAttribute('data-list-toggle')) {
         return
      }
      
      const idx = e.target.dataset.listToggle
      const $list = findList(idx)
      
      if (isOpen($list)) {
        closeList($list)
        return
      }
      
      const $openList = getOpenList()
      $openList ? closeList($openList) : null
      
      openList($list)
    })

    Ответ написан
    Комментировать
  • Как связать правильно связать график с беком?

    FinGanapre
    @FinGanapre
    Если под "налету" имеется в виду обновление данных на клиенте при изменении данных на сервере, то вам нужны веб-сокеты. Это удобная кроссбраузерная обёртка для них. Альтернатива из ушедших времён - long-polling и short-polling. Естественно, на серверной стороне также должен быть реализован этот метод передачи данных.
    Ответ написан
    Комментировать
  • Как запретить нажатие колёсика мыши на сайте?

    FinGanapre
    @FinGanapre
    Если вы хотите запретить активацию скролла по нажатию на колёсико, то так.

    document.addEventListener('mousedown', e => e.which === 2 ? e.preventDefault() : null )
    Ответ написан
    Комментировать
  • Как настроить особенности работы с дробями в JavaScript?

    FinGanapre
    @FinGanapre
    Считайте в копейках, выводите в интерфейс как нужно. По поводу ввода в поля - валидируйте значения любой удобной библиотекой.
    Ответ написан
    4 комментария
  • Почему сайт не видит jquery ui?

    FinGanapre
    @FinGanapre
    Css от jqueryUI не вижу чтобы был подключен. Сама библиотека (js) работает, просто стилей нет.
    На рабочем сайте у вас подключено отсюда
    devtools

    5f00eec6ae014569120313.jpeg
    5f00eed8b31c9723760633.jpeg
    Ответ написан
  • Почему this равно undefined в свойстве объекта?

    FinGanapre
    @FinGanapre
    Создайте геттер как вариант:
    const Api = {
      baseUrl: 'http://localhost:9000/',
      get dataUrl() {
        return `${this.baseUrl}api/odata/`
      }
    }
    
    console.log(Api.dataUrl)
    Ответ написан
    Комментировать
  • Почему на "превью" у age 25, а когда открываешь, то 45 (в первом случае)?

    FinGanapre
    @FinGanapre
    Когда вы "раскрываете" объект, вам показывают его текущее значение. Наведите на иконку с информацией (i) рядом с объектом в консоли "Value below was evaluated just now". Что означает, что значение ниже было вычислено в данный момент. В тот самый момент, когда вы раскрыли объект.
    При этом, значение определяется при первом раскрытии объекта.
    Запустите этот код:
    const user = {
      name: 'Nikola',
      age: 25
    }
    console.log(user)
    
    setTimeout(() => {
      user.age = 45
      console.log(user)
    }, 5000)


    Значение в объекте будет изменено через 5 секунд.
    При первом запуске кода, сразу раскройте первый вывод в консоль. Дождитесь, пока измениться значение и произойдёт второй. Можете снова открывать и закрывать первый вывод в консоль, его значение не будет меняться и будет составлять 25.

    Запустите код ещё раз, но в этот раз не открывайте первый вывод в консоль. После второго вывода откройте оба. Вы увидите, что и там и там значение будет составлять 45.
    Ответ написан
    1 комментарий
  • Как обрабатывать клик по любой ссылке?

    FinGanapre
    @FinGanapre
    Конкретно ваш код не отрабатывает, т.к. к вам приходит псевдо-массив (NodeList) всех элементов a в документе. Вы могли бы пройтись по нему циклом и повесить на каждый элемент обработчик, но так делать не нужно. Во-первых, вы заставляете браузер искать все a на странице, во-вторых - вешаете обработчик на каждую. При этом, делаете это через цикл.

    Так как по умолчанию все события всплывают (это поведение можно изменить, а также отменить всплытие события на элементе), т.е. клик на вложенный элемент можно поймать в родительском, лучше вешать все обработчики на документ.

    // вешаем обработчик на документ
    // если повесите на каждую ссылку - то кол-во обработчиков будет равно кол-ву ссылок
    // так себе идея
    document.addEventListener('click', e => {
      // определяем, что клик произошёл на ссылке
      if (e.target.nodeName === 'A') {
        // отменяем переход по ссылке
        e.preventDefault()
        console.log('do some there')
      }
    })


    getElementsByTagName - не стоит использовать. Сейчас прекрасно работают querySelector и querySelectorAll. Из старых способов получения элементов можете пользоваться разве что getElementById, т.к. он отработает чуть быстрее
    Ответ написан
    1 комментарий
  • Как получить значение input в таблице?

    FinGanapre
    @FinGanapre
    У вас в list храниться сейчас элемент tr из thead (помимо необходимых). На первой итерации вашего цикла вы проходите по немуи в list[i].getElementsByTagName("input") получаете undefined, т.к. там нет тегов input. При обращении undefined.value вы, соответственно, получаете ошибку. Измените селектор на более подробный, чтобы не захватывать tr из thead.

    Ну и у вас будет куча строк с id rowElement. Видимо, он должен быть динамическим и вы хотели добавить туда idx из цикла while. Советы по php - не нужно делать проверки на что-то прямо в шаблоне (class=...). Вынесите их в отдельные функции, которые будут возвращать вам значение. Если вам потребовалось echo в шаблоне, значит вы что-то делаете не так и нужно вынести логику за пределы шаблона. Также, не нужно соединять получение данных из бд и вывод шаблона. Почитайте про MVC.

    Единственное, что работает быстрее querySelector это getElementById. Для всего остального используйте querySelector и querySelectorAll. По принципу использования как любые css селекторы

    Например:
    // объявляем функцию
    const count = () => {
      // используем querySelectorAll чтобы указать, что нужны только tr в tbody
      let list = document.querySelectorAll("#TheTable tbody tr");
    
      // выводим значение 3 input
      list.forEach( tr => console.log( tr.querySelectorAll('input')[3].value ));
    }
    
    // вызываем функцию
    count();


    forEach
    querySelector
    querySelectorAll
    Ответ написан
  • Почему div выводит свой скрипт?

    FinGanapre
    @FinGanapre
    Начните с этого. Вы очень усложняете задачу. И не стоит дёргать DOM десять раз, если в итоге вам нужно добавить туда все 10 div. Соберите их в массив и разок добавьте всё вместе.

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

    Ещё момент. Не проще ли будет в вашем случае завести массив с нужными url или получать их откуда-то с сервера, чем склеивать строку и делать цикл на 10. Тогда вы просто используя map преобразуете это к нужному шаблону и выведите в нужное место.

    код

    <div class="div-container"></div>

    const slidesContainer = document.querySelector('.div-container')
    let i = 0
    let slides = []
    
    while ( i < 10) {
      slides.push(`
        <div>
          <img src="string-name${ i }.png"/>
        </div>
      `)
      
      i++
    }
    
    slidesContainer.insertAdjacentHTML(
      'beforeend',
      slides.join('')
    )

    Ответ написан
    Комментировать
  • Как передать результат request запроса во внешнюю переменную?

    FinGanapre
    @FinGanapre
    У вас асинхронный код. На момент вызова вывода в консоль, значение в переменную a ещё не присвоено. Используйте promise или async/await.
    Для удобства, используйте axios

    Чтобы лучше понять ситуацию, добавьте вывод в консоль в теле функции myFunction. Будет видно, что сначала выполниться ваш текущий вывод в консоль, а уже потом в теле функции myFunction
    Ответ написан
    6 комментариев
  • Где брать видео для сайта?

    FinGanapre
    @FinGanapre
    Есть сервисы, которые предоставляют плееры, которые можно встроить в сайт. Но это чаще всего нарушение авторского права. Т.к. большинство из фильмов предоставляются без разрешения правообладателя.
    Если делать всё законно, то нужна лицензия на публичный показ фильма.
    Вот первое, что нашёл - инфа не проверена, а просто найдена по первому запросу.

    Стоит обратить внимание и на то, что тот или иной фильм может быть запрещён к показу в той или иной стране. И вам, как онлайн кинотеатру, нужно соблюдать эти требования.
    Ответ написан
    Комментировать
  • Почему не привязывается this через метод call/apply в стрелочной функции?

    FinGanapre
    @FinGanapre
    Потому что у стрелочных функций нет собственного контекста:) их нельзя насильно привязать.
    Ответ написан
  • Я могу запретить движение input?

    FinGanapre
    @FinGanapre
    Нужно подкорректировать высоту и ширину относительно шрифта (через css переменные например)
    Взять библиотеку для кастомного скрола и заменить стандартный + скрыть его стилизовав
    Слушатель в итоге повесить на документ и отлавливать подобные элементы по data свойству(data-hidden-input), чтобы на все не вешать прослушку.
    И должно работать.

    вот так например, но это не инпут
    Ответ написан
    9 комментариев
  • Как сделать так чтоб при нажатии на кнопку выполнялась функция?

    FinGanapre
    @FinGanapre
    Меняем тут на doIt()
    <input type="button" value="нажми меня" name="Peremeshenie1" onClick="doIt()">


    Объявляем doIt
    function doIt() {
          setInterval(Peremeshenie, 20);  
    }


    либо просто
    <input type="button" value="нажми меня" name="Peremeshenie1" onClick="setInterval(Peremeshenie, 20);">
    Ответ написан
    Комментировать