Задать вопрос
  • SessionStorage взять значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сохраняйте только значение флага и при загрузке страницы выполняйте функцию.

    Объект для сохранения в *Storage сериализуется в текст. Как JSON.stringify() При этом теряются исполняемые методы и ссылки на узлы DOM-дерева. Да и само DOM-дерево-то на новой странице будет уже другое.
    Ответ написан
  • Почему не работает код js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    На момент выполнения кода jQuery еще не загружен.
    Ответ написан
    5 комментариев
  • Дайте совет, как построить самый простой график?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без библиотек, как я понял по комментариям ТС, можно просто отрисовать график в SVG и разместить на сайте.
    Это можно сделать в Adobe Illustrator или другом векторном редакторе и вывести оттуда готовый SVG.

    Из массива координат строить график также можно без библиотек, разобравшись в несложном синтаксе SVG и самостоятельно написав простой код. Вам понадобится добавлять элементы line.

    Удобнее, с прицелом на будущее, использовать дополнительную, не-jQuery и не-Bootstrap, библиотеку. В идеале разобраться с D3js. Там и масштабирование осей под данные, и динамическое обновление графика по данным и интерактивность – всё легко кодируется, но придётся инвестировать пару часов в обучение.
    Ответ написан
    Комментировать
  • Как реализовать некоторый аналог сессий на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вполне можете при добавлении ноутбука в клиенте отправлять эти данные и на сервер, там хранить в сессии и при загрузке страницы отдавать массив уже отобранных.

    Иначе, как уже посоветовали, в localStorage:
    // при добавлении ноута в коллекцию
    localStorage.setItem('laptops', JSON.stringify( laptopArray ));
    
    // при рендере страницы после перехода
    var laptopArray = JSON.parse(localStorage.getItem('laptops')) || [];
    Ответ написан
    Комментировать
  • Почему функция не привязывается к указаному классу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    TypeError: $ is not a function

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

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    невозможно, т.к. сообщество не может инициировать диалог. Пользователь должен написать первым или разрешить сообщения от сообщества.
    Ответ написан
    Комментировать
  • Как масштабировать произвольный многоугольник?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Масштабирование происходит относительно выбранной точки, центра. Из центра проводятся векторы в каждую из вершин многоугольника. Длина каждого вектора умножается на k. При умножении на 0, многоугольник коллапсирует в эту точку. Или при плавном увеличении k, многоугольник «растет» из этого центра. И располагаться этот центр может где угодно – точка произвольная.

    Вам нужно только решить, где центр.

    Если расположить центр в (0, 0) задача упрощается, т.к. координаты вершин совпадают с векторами в них из центра.

    На JS могла бы быть примерно такая функция, принимающая на вход коэффициент k, массив координат центра и массив массивов координат точек:
    function scale( k, center, points) {
      return points.map( p => p.map( (x, i) => center[i] + k * (x - center[i])));
    }
    
    scale(
      2, // в два раза
      [3, 1], // относительно точки (3,1)
      [ [0,0], [1,1], [3,1], [10,10] ] // этот четырёхугольник
    )
    // [ [-3, -1], [-1, 1], [3, 1], [17, 19] ]

    В любом N-мерном пространстве годится. Сделал живой пример, можно поиграть: клик по полю назначает центр масштабирования
    Ответ написан
  • Как применить условие к нескольким классам и id?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    перечислить селекторы через запятую?

    Вместо ".required" написать ".required, #parent_cat_id, #category_id"
    Ответ написан
    2 комментария
  • Как убрать интервалы времени на графике D3 JS?

    Может, поможет пример: убирают выходные дни
    Ответ написан
    Комментировать
  • VK_API как отсылать случайные изображения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. получить список изображений в альбоме группы: photos.get()
    2. выбрать N случайных
    3. отправить их как приложения к сообщению: поле attachment в messages.send()
    Ответ написан
    6 комментариев
  • Как можно улучшить дизайн этой визитки?

    • не смешивать языки: русский и англ.
    • мелкий белый текст будет нечитабельным на визитке 9x5см
    • белый текст по темному фону придется печатать офсетом пятой белой краской, это дорого.
    • «каньон» пишется через А.
    • телефонный номер лучше читается без лишних дефисов.
    • логотип менее важен, чем телефон и пр. информация – больше места под инфу, меньше под лого
    • название "Dag trip" близко к "Bad trip".
    Ответ написан
    3 комментария
  • Как реализовать автоматическую коррекцию формата ввода в калькуляторе на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот такое регулярное выражение заменит ноль в начале строки на пустую строку, если за нулём НЕ идёт один из . + - * /

    var re = /^0(?![\.\+\-\/\*])/;
    
    ['03','0','0.','0+'].map(s => s.replace(re,'')) /* 3,,0.,0+ */


    Просто единственный ноль также удалится – ведь за ним не идёт один из спец-символов. Поэтому применяйте эту регулярку только когда длина строки больше 1.
    Старый ответ

    Неудобно организовано, т.к. содержание табло может поменяться из нескольких мест..
    С минимальными правками отн. нынешнего варианта, можно попробовать так:
    везде, где изменяется содержание табло, получать введённые числа (бить строку по одному из + - * /; каждую из частей бить по точке, и каждое из получившихся целых прогонять через parseInt() – это отбросит нули в начале. Потом собирать: склеить точкой, склеить знаком операции.

    Но лучше как-то иначе организовать всю логику. Например, в процессе ввода не текстовую строку собирать, а заполнять массив числами и операторами. [5.1, "*", 4.2, "-", 3.7] И перед склейкой в одну строку для отображения в табло, проводить необходимые коррекции чисел.
    Ответ написан
  • Ffmpeg зациклить видео, как?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно, mp4 не позволяет простой конкатенации файлов, поэтому при склейке он декодируется и снова жмётся.

    Быстрее один раз разжать видео в .ts формат, который потом можно просто склеивать.
    Делал похожее для сборки mp3+картинки в статичное видео.

    Примерно так:
    bash скрипт
    #  из mp4 сделать ts
    TMPVIDEO="tmp_video.ts"
    ffmpeg  \
      -i "short.mp4"  \
      -bsf:v h264_mp4toannexb  \
      -an  \
      -f mpegts  \
      -y -hide_banner  \
      "$TMPVIDEO"
    
    # до этого определить, сколько раз повторить фрагмент,
    # чтобы покрыть длину mp3
    REPEATS=5
    LONGVIDEO="long_video.ts"
    N=1
    while [ $N -le $REPEATS ]; do
    	ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
    	    -c:v copy \
    	    -y -hide_banner  \
    	    "$LONGVIDEO"
    
    	local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
    
    	rm -f "$TMPVIDEO"
    	mv "$LONGVIDEO" "$TMPVIDEO"
    	local N=$[$N << 1]
    	echo "N: $N"
    done
    # получили длинное видео с запасом
    
    # подрезать длину, чтобы точно соответствовала
    FFMPEG -i "$TMPVIDEO" \
      -c:v copy \
      -t $MUSIC_LENGTH \
      -y -hide_banner  \
      "$LONGVIDEO"


    Потом остаётся собрать из аудио и видео общий файл. В mp4 аудио идёт в формате AAC. Для скорости можно заранее разжать mp3 в aac, заодно измерив точную длительность.
    Ответ написан
  • Как правильно получить элемент по классу (js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно через querySelectorAll()
    // внутри ul с классом list ищем все li
    var myNodeList = document.querySelectorAll('ul.list li');
    
    if( myNodeList.length) { // что-то нашлось, коллекция не пустая
      var el0 = myNodeList[0]; // первый 
    }
    Рабочий пример

    Метод querySelectorAll() есть и у документа и у элемента. Так что можно сначала получить элемент, внутри которого искать, а затем внутри него собрать коллекцию:
    var list = document.querySelectorAll('ul.list'); // все UL класса list в документе
    if( list.length) {
      var items = list[0].querySelectorAll('.list');
      // любые элементы класса list внутри первого найденного ul.list
    
      if(items.length) {
        var item = items[0]; // первый из li
      }
    }
    Ответ написан
    Комментировать
  • Как изменять размеры svg в зависимости от размеров внешнего контейнера?

    В принципе SVG вписывается в контейнер, достаточно задать тому ширину, а элементу svg указать viewbox.

    Один глюк, который не понимаю. Если viewbox задать программно, как у вас в фиддле, через .attr('viewbox', '0 0 1200 250') – svg не становится «живым». Зато если через инструменты разработчика иму изменить параметр viewbox, например, вместо 1200 поставить 1201, все оживает: график вписывается в ширину и меняется при изменении окна.

    Глюк исправляется, если не создавать программно SVG и атрибут, а прописать их сразу в HTML.
    Рабочий fiddle.
    Ответ написан
    Комментировать
  • Как это работает (алгоритм с использованием рекурсии для вычисление числа Фибоначчи)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Числа Фибоначчи – это последовательность, начиная с 0 и 1, где каждый следующий равен сумме двух предыдущих.

    Третий равен 0 + 1 = 1 // итого первые три ряда: 0 1 1
    Четвёртый это сумма последних двух единиц = 2 // 0 1 1 2
    Пятый это 1 + 2 = 3 // 0 1 1 2 3
    И так далее. Вот начало ряда:
    значение:         0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
    порядковый номер: 0  1  2  3  4  5  6   7   8   9  10  11  12
    Восьмой, если считать с 0, равен 21.

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

    Чтобы вычислить очередное значение, надо знать два предыдущих. Отсюда и (n-1) и (n-2)

    Поскольку любой элемент ряда считается одинаково, пишут всего одну функцию. Она сразу готова дать ответ для первых двух элементов, если n = 0 или 1. В остальных случаях ей придётся вызывать саму себя.

    Движок JavaScript'а сам позаботится о хранении промежуточных значений и цепочки кто-кого вызвал и с каким параметром.
    Ответ написан
    Комментировать
  • Бинарный поиск в координатной сетке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По координатам вычисляйте индекс квадрата. Что-то типа dlina_stroki * position.y + position.x
    Это точно быстрее поиска, пусть и бинарного )

    Если там действительно квадраты через единый шаг, то так должно получиться. Квадраты в массиве ведь упорядочены по колонкам, столбцам? Пример с реальными данными помог бы.

    Допустим, там целочисленные координаты от 0 до 1800 с шагом 200. Поле 10x10 — массив длиной 100.
    0,0      200,0    400,0    ... 1800,0
    0,200    200,200  400,200  ... 1800,200
    0,400    200,400  400,400  ... 1800,400
    ...
    0,1800   200,1800 400,1800 ... 1800,1800


    Интересует индекс элемента (400,200)

    i = storona * y / shag + x / shag

    Шаг у нас shag = 200 значит, искомый индекс 10 * 200 / 200 + 400 / 200 = 12
    Ответ написан
    Комментировать
  • LocalStorage создание и получение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно. Курить документацию по localStorage и по Storage
    const dg = document.getElementById.bind(document);
    const inKey = dg('in-key');
    const inVal = dg('in-val');
    dg('btn-to').addEventListener('click', e => {
      localStorage.setItem(inKey.value, inVal.value);
    });
    dg('btn-from').addEventListener('click', e => {
      inVal.value = localStorage.getItem(inKey);
    });
    dg('btn-list').addEventListener('click', e => {
      let list = [];
      for (let i = 0; i < localStorage.length; i++) {
        let k = localStorage.key(i);
        list.push('<dt>'+k+'</dt><dd>'+localStorage.getItem(k)+'</dd>');
        dg('list').innerHTML = list.join('\n');
      }
    });
    рабочий пример
    Ответ написан
    3 комментария
  • Как сделать такую анимацию в adobe premier или где еще?

    Adobe AfterEffects для задачи подходит гораздо лучше, чем Premier.

    Вот урок (на англ.) по анимации размера объекта уровнем звука, именно как вы хотите.
    Ответ написан
    Комментировать