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

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

    не подключён jQuery на момент выполнения этого кода.
    Ответ написан
  • Как применить условие к нескольким классам и id?

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

    Вместо ".required" написать ".required, #parent_cat_id, #category_id"
    Ответ написан
    2 комментария
  • Как реализовать автоматическую коррекцию формата ввода в калькуляторе на 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] И перед склейкой в одну строку для отображения в табло, проводить необходимые коррекции чисел.
    Ответ написан
  • Как правильно получить элемент по классу (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
      }
    }
    Ответ написан
    Комментировать
  • Как это работает (алгоритм с использованием рекурсии для вычисление числа Фибоначчи)?

    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 комментария
  • Как оптимизировать работу скрипта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо перебирать в цикле имеющиеся значения. Удобнее держать данные (строки) в массиве массивов:
    data = [
        ["M166 E16", "A-Class", "2004", "A 160", "W168.II", "бензин"],
        ["M166 E19", "A-Class", "2004", "A 190", "W168.II", "бензин"],
        // и остальные данные. 
      ];


    Вытащить значения полей ввода лучше лишь 1 раз и запомнить в переменных:
    // вместо многократного
    ($("#class").val())
    // лучше один раз
    var _class = $("#class").val();
    // и потом использовать значение этой переменной


    Общий алгоритм: ищем, перебирая строки. Как только нашли, дальше не ищем. В конце смотрим, нашлось вообще что-то (показываем) или нет (пишем «нет результатов»).

    Поиск вызывает вопросы:
    1. точно ли ищете полное соответствие значений или достаточно подстроки;
    2. важен ли case (может, искать будут «БЕНЗИН» вместо «бензин»
    3. точно ли хотите искать каждое значение во всех полях строки? Например, год – известно же, что он в определённой колонке. Быстрее сравнивать искомый год только с одним полем.


    Сравниние с -1 короче записать так: !!~value – тоже будет false только если value == -1

    Итого
    $(document).ready(function() {
      const data = [
        ["M166 E16", "A-Class", "2004", "A 160", "W168.II", "бензин"],
        ["M166 E19", "A-Class", "2004", "A 190", "W168.II", "бензин"],
        ["M266 E15", "A-Class", "2005", "A 150", "W169.I", "бензин"],
        // и остальные данные. 
      ];
    
    
      $('.left').on('input', function() {
        const _class = $("#class").val(),
          _model = $("#model").val(),
          _god = $("#god").val(),
          _kuzov = $("#kuzov").val(),
          _tip = $("#tip").val()
        ;
        
        var index = -1; // сначала считаем, что "не найдено"
        
        for(let i = 0; i < data.length; i++) {
          let car = data[i];
          if( !!~car.indexOf(_class)
            &&  !!~car.indexOf(_model)
            &&  !!~car.indexOf(_god)
            &&  !!~car.indexOf(_kuzov)
            &&  !!~car.indexOf(_tip)
          ) {
            index = i;
            break;
          }
        }
        
        if(!!~index) {  // нашли и index стал больше -1
          $("#page-title").html( "Мотор " + data[i][0] );
        } else {        // не нашли и index === -1
          $("#page-title").html( "Нет такого" );
        }
      });
    });
    Ответ написан
    Комментировать
  • Где посмотреть структуру современного приложения JS (ES6 модули)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как сделать одновременное редактирование документа, как в google docs?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Почитайте про шаблон проектирования «Команда».

    Понадобится слать из каждого клиента «команды» – каждый введённый символ, удалённый символ, удаление/вставка фрагмента текста, изменение форматирования. И всем редактирующим рассылать каждую полученную команду.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    попробуйте вместо
    if (document.form.name.value == '' || document.form.phone.value == '' ) {

    вот так:
    if (this.name.value == '' || this.phone.value == '' ) {
    Ответ написан
    Комментировать
  • Как при нажатии на enter добавить?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    При копировании из HTML заменять <br> на \n.
    При копировании из textarea в div – наоборот, \n на <br>:
    document.getElementById("btn-from")
      .addEventListener('click',function(){
        elTa.value = elSrc.innerHTML
          .replace(/<br\/?>/ig, '\n')
          .replace(/\n+/g, '\n')
          .trim()
        ;
    });
    
    document.getElementById("btn-to")
      .addEventListener('click',function(){
        elSrc.innerHTML = elTa.value
          .replace(/\n/g, '<br>')
          .trim()
        ;
    });


    Рабочий пример
    Ответ написан
    Комментировать
  • Как с помощью циклов определить простое или составное число?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Всего два возможных исхода: «простое» или «составное».
    Случай с составным правильно определяется в варианте, где вы поставили break.

    Но там не break нужен. У вас функция, которая должна вернуть значение. Как только обнаружили, что найден делитель, всё, можно сразу возвращать результат «Составное число».

    Я бы порекомендовал такую логику: в цикле только ловите ахтунг-момент найденного делителя - и сразу возвращайте "Составное". Если же весь цикл отработал и не вылетел из функции, возвращайте "Простое". Не надо никаких «флагов» и доп. переменных. Код получается короткий и понятный.

    spoiler
    function testCycle(n) { 
      for (let i = 2; i < n / 2; i++)
        if (n % i === 0)
          return "Составное число"; 
      return "Простое число";
    }

    Примечания:
    • let – это то же, что и var, но действует не в рамках всей функции, а только в рамках блока. В данном случае, внутри цикла.
    • === – это «строгое» равенство. То же, что и ==, но ещё и проверяет, чтобы типы совпадали, т.е. не прокатит "0" === 0. Зато работает чуть быстрее.
    • проверяем не до n, а до n / 2, т. к. целые множители не могут превышать половину произведения (второй множитель не меньше 2)
    Ответ написан
    Комментировать
  • Что делать после todo?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сделайте вложенный todo: где задачи 1-го уровня из себя представляют списки задач.
    Ответ написан
    Комментировать
  • Почему не срабатывает копирование в буфер?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В буфер можно записывать только по действию пользователя: в обработчике клика, например. Но никак не по асинхронному событию где-то в коде.
    You can use the "cut" and "copy" commands without any special permission if you are using them in a short-lived event handler for a user action (for example, a click handler).


    Если у вас код не на странице, а это вы пилите расширение в браузер, можно запросить доп. разрешения, и тогда всё получится.
    Ответ написан
    Комментировать
  • Как после "10" вызовов function write() в сек, блокировать её на "10мин"?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На стороне сервера – надо сохранять массив времен последних вызовов функции. При очередном вызове смотреть число времен в этом массиве и время самого раннего. Дописывать в конец текущее время и удалять записи старше 1 секунды.

    В качестве хранилища можно использовать Redis или другое хранилище в памяти.

    Если квота распространяется на каждого юзера в отдельности - хранить для каждого отдельно. В качестве ключа использовать в т.ч. user_id.

    На клиенте похожий принцип: хранить массив времен вызовов и проверять число и время самого раннего при каждом.
    Ответ написан
    Комментировать
  • Как разворачивать и сворачивать (2 и более статей не получается)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не работает потому, что функцию sh() переопределяете для каждой статьи заново – остаётся последний вариант.

    Лучше сделать так:
    1. Скрываемым частям статей давать класс с display:none У вас это text__podzigilovol.
    2. В ссылке-кнопке для спрятать/показать записывать id управляемой статьи в data-атрибуте: data-id="info-2" – так кнопка будет «знать», кем она управляет.
    3. Кнопкам не писать в href никакого javascript:..., вместо этого лучше на них повесить слушателя события клика. Удобно дать всем кнопкам определённый класс, по нему их отыскать и в цикле повесить слушателя события.
    4. Обработчик клика описывается лишь один раз. Он получает в качестве this кликнутую ссылку. Из неё берёт data-атрибут с id нужного блока. И включает/выключает ему класс, который прячет этот блок.
    Рабочий пример
    Код
    function sh(event) {
      const className = "text__podzigilovol";
      event.preventDefault();
    
      obj = document.getElementById(this.dataset.id);
      if(!obj) return;
      if( obj.classList.contains(className)) {
        obj.classList.remove(className);
      } else {
        obj.classList.add(className);
      } 
    } 
    
    
    Array.prototype.forEach.call(
      document.querySelectorAll('.js-btn-readmore'),
      function(e){
        e.addEventListener('click', sh);
      }
    );
    Ответ написан
    8 комментариев
  • Из строки с "часами", сделать таймер?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Закидывайте» и «ловите» не сколько осталось, а время того события, до которого отсчитываете. В виде Unix timestamp'а, целого числа. Так всегда сможете посчитать, сколько осталось.
    Ответ написан
    Комментировать
  • Как заменить элементы одного массива элементами другого по заданному правилу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Забыли .length – вероятно, собирались перебирать i от 0 до длины строки arr1. Тут не массивы, а две строки.

    for (i=0; i<arr1.length; i++) {
        for (j=0; j<arr2.length; j++){


    Вложенный цикл не нужен. Достаточно перебрать каждую цифру входа.

    Чтобы найти соответствующую цифре i букву, достаточно взять i-й элемент строки arr2:
    arr2[ i ];

    Коротко, в одну строку это можно решить через преобразование строки в массив и применение функции к каждому элементу.
    В одну строку
    var arr1 = '3649824598';
    var arr2 ='АБВГДЕЖЗИК';
    
    arr1.split('').map(n => arr2[n]).join('')  // ГЖДКИВДЕКИ

    • split('') сделает из строки массив цифр;
    • map() применит к каждой цифре функцию, которая заменит цифру на соотв. букву из arr2;
    • join('') склеит элементы массива (теперь уже буквы) в одну строку.
    Ответ написан
    Комментировать