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

    @mrSeller Автор вопроса
    const video = document.createElement('video')
    video.onloadeddata = function (event) {
      const { duration } = event.target
      video.remove()
      console.log(duration)
    }
    video.setAttribute('src', path)
    Ответ написан
    Комментировать
  • Как разбить массив на подмассивы с разными размерами?

    @mrSeller Автор вопроса
    Накинул пока такую функцию, висит проблема с тем, что количество элементов может не соответствовать плите, значит надо привносить динамику.
    Рефакторинг, естественно, в последнюю очередь

    Функция

    getTile() {
      let topics = this.topics.slice(0)
      let tile = []
      let types = ['double', 'triple', 'triple-left', 'triple-right']
      let regularity = [0,1,2,0,1,3]
      let i = 0 // regularity iterator
      let obj
    
      while(topics.length) {
        let type = types[regularity[i]]
    
        switch(type) {
          case 'double':
            obj = resetObj(type)
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            tile.push(obj)
            break
    
          case 'triple':
            obj = resetObj(type)
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            tile.push(obj)
            break
    
          case 'triple-left':
            obj = resetObj(type)
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            tile.push(obj)
            break
    
          case 'triple-right':
            obj = resetObj(type)
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            obj.array.push(topics.shift())
            tile.push(obj)
            break
        }
    
        // reset regularity iterator
        if (i === 5) {
          i = 0
        } else {
          i++
        }
    
        function resetObj(type) {
          return {
            type,
            array: []
          }
        }
      }
    
      return tile
    }

    Ответ написан
  • Как подключить внешний файл js в файл php?

    @mrSeller
    Вынесите JS в отдельный файл и подключите его перед закрывающим тегом body:
    Ответ написан
  • Куду всовывать return false; или event.preventDefault()?

    @mrSeller
    e.preventDefault() блокирует нативное действие/событие.
    А return false прекращает дальнейшее выполнение кода внутри функции.

    Сейчас поглядим, что там в примере

    UPD: если видео находится в iframe, то ничего поделать не получится, нельзя влиять на DOM внутри <iframe />
    Ответ написан
  • Как правильно запрограммировать поэкранный скроллинг?

    @mrSeller Автор вопроса
    На данный момент решил проблему так:
    Посмотрел чему равен e.originalEvent.wheelDelta, при прослушке mousewheel.
    При скролле на тачпаде значение быстро нарастает от 3 до неопределенного числа (в зависимости от силы толчка - может быть сотня, может 400, может больше, может меньше). Далее начинает медленно затухать так же до 3. Меньше 3 оно никогда не равно.

    Покумекал, прикинул, потестил и выяснил, что для моего скрипта оптимально будет реагировать на модуль дельты (Math.abs(e.originalEvent.wheelDelta)) больше 25 - таким образом медленно затухающая инерция после прошествия 1000мс (минимальное время на скролл в моем скрипте) уже будет игнорироваться, как и совсем слабые (случайные) толчки.

    Правда, не знаю как мышь генерирует эту дельту и что там получится.

    UPD: Решил переделать и придумал такую логику:
    При каждом вызове mousewheel сравниваю значение e.originalEvent.wheelDelta с прошлым значением
    $(document).on('mousewheel', function (e) {
        e.preventDefault();
    
        // действо происходит в методе класса, it === this 
        // (в каждом методе создаю переменную it, равную this - для удобства)
        // it.scrollDelta - свойство класса - изначально равно null
        if ( Math.abs(e.originalEvent.wheelDelta) > it.scrollDelta ) {
            console.log('New Event');
            // т.к. условно это новое событие, то мы вызываем нужные нам скрипты
            // проблемка только в том, что сначала по нарастающей идет постоянный вызов,
            // но у меня он игнорируется за счет блокирования скрипта на время анимации;
            // эту проблему можно решить, вызывая "новое событие" только первый раз,
            //  а дальше вызывать его только после начала затухания
        }
        it.scrollDelta = Math.abs(e.originalEvent.wheelDelta);
    });

    PS: Остается только придумать, как различать здесь мышь и тачпад, ведь у мыши то, скорее всего, дельта будет всегда одинаковой (кто-то может замерить как мышь себя ведет?)
    Ответ написан
  • Можно ли сделать автоматическое расположение блоков в плитке?

    @mrSeller
    Без JS не обойтись никак.
    Либо сам пиши код, либо используй библиотеку, которуб предложил iBird Rose
    Ответ написан
    Комментировать