Ответы пользователя по тегу JavaScript
  • Отображение в html содержимого формируемого в javascript, это возможно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    роботы разберутся и без оглавления, которое не несёт в себе ничего нового.
    Ответ написан
    Комментировать
  • Как сократить оператор if в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    if (a == 1 && a == 2)

    (почти) всегда будет false, т.к. не может быть одновременно равно и 1 и 2 (может последовательно), так что смело удаляйте весь блок.

    Если интересует «если а равно одному из списка», можно так:
    if ([1, 2, 100500].includes(a))
    Ответ написан
    1 комментарий
  • Почему не работает setTimeout?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    setTimeout(function () {
      var counter = 0;
    
      setTimeout(() => counter++, 1000); // через 1с увеличит на 1
    
      console.log(counter); // выведет 0, сразу
    
      setTimeout(() => {
        console.log(counter);
        nextselect.addClass('same-as-selected').trigger("click");
      }, 1400); // через 1.4с "кликнет"
    }, 500); // вообще всё начнётся только через пол-секунды
    
    
    0         - начало
    0.5       - начнёт выполняться внешняя ф-я:
                зарядятся два таймера, в промежутке выведет 0
    0.5 + 1   - counter увеличится на 1
    0.5 + 1.4 - еще раз выведется counter, добавится класс, клик
    Ответ написан
    2 комментария
  • В чем ошибка в цикле вывода четных чисел?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. for (let i = 0; i < 50; ...
      от 0 и до, но не включая, 50. Поменяйте 0 и < 50, чтобы это исправить.
    2. out += i + ' ';  // добавляется всегда, в любом случае
      if ( i % 2 != 0) continue; // проверка уже потом
      поменяйте порядок: сначала проверка, потом добавление
    3. document.querySelector('.out-2').innerHTML = out;
      срабатывает в каждой итерации цикла. А надо 1 раз, когда цикл отыграл все повторы. Вынесите эту строку из цикла.


    spoiler

    2..50 через один, по чётным — это 2 * (1..25) подряд.
    document.querySelector('.b-2').addEventListener('click', () => {
      document.querySelector('.out-2').innerText = Array(25) // создали массив из 25 пустых слотов
        .fill() // заполнили их undefined, чтобы можно было..
        .map((n, i) => 2 * (i + 1)) // каждый заменить на (его индекс + 1) * 2
        .join(' '); // и склеить в строку через пробел
    })
    все эти методы массива можно посмотреть на MDN.


    Ответ написан
    1 комментарий
  • Как создать функцию/переменную с проверкой, что они еще не созданы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    чтобы не раздувать файл, решил вынести общие функции и переменные в отдельный файл

    Ну вот практически уже используете модули, но ещё не совсем. Раз там какие-то переменные хранятся, значит для каждого калькулятора, видимо, нужна своя _копия_ этого общего куска.

    Как вариант, оберните всё, что там общего, в класс или функцию или объект и создавайте для каждого калькулятора новую копию.

    calc_init.js?1 не удачная идея. Именно потому, что возникают описанные в вопросе проблемы.
    Лучше один раз его просто загрузить <script src="calc_init.js"></script>. Пусть там просто определяется единственная
    функция
    function calc_init(n, id) {
      let el_script = document.createElement("script");
      el_script.src = `/scripts/script_${n}.js`;
      el_script.setAttribute('defer', '');
      document.body.appendChild(el_script);
    
      let el_div = document.createElement("div");
      el_div.setAttribute('id', id);
      document.body.appendChild(el_div);
    }
    и потом вызывать его функцию:
    calc_init(1, 'id_calc_1'); // номер калькулятора и id HTML-элемента, куда его впихнуть
    calc_init(3, 'id_calc_3');
    Ответ написан
  • Как сложить числа из 2 функций?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Продумайте, в какой момент что происходит. Какие есть события.

    Из каждой функции обновляйте значение переменной и отображайте сумму переменных:
    var price_pech = 0;
    var price_idosn = 0;
    
    //... 
    function MyFunction(sum) {
      price_pech = sum;
      $("#total_price").text(price_pech + price_idosn);
    }
    Ответ написан
    4 комментария
  • Как отследить событие работающего таймера?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в clearText() выполнять timer.innerHTML = 0;

    Вообще не айс держать в разметке значения. Лучше в какой-то переменной хранить число, и по таймеру его отображать в div:

    Таймеры в JS далеко не идеально точны. Если вкладка браузера перестаёт быть активной, таймеры в ней станут реже тикать. Поэтому не считайте setInterval(func, 1000) идеальной секундной стрелкой.

    Если важна точность, лучше запоминать момент времени const D = new Date(); и по таймеру брать текущее время и считать разницу с тем моментом: let seconds = Math.round((new Date() - D) / 1000)

    Событие таймера при этом можно вызывать чаще, чем раз в секунду: скажем, раз в 200 мс.
    Ответ написан
    Комментировать
  • Как сделать поиск нескольких div с id через textarea?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот для старта:
    дальше сами.

    id через пробел или запятую.
    $('#search').on('input', function(){ // При вводе текста..
      $('.table-item.-active').removeClass('-active'); // убираем класс .-active у .block.-active
      const ids = $(this).val().split(/[ ,]/).filter(el => el.length);
      for (let id of ids) {
    	  $(`.table-item[id="${id}"]`) // берём блок у которого есть совпадение по id
          .addClass('-active'); // выдаём ему класс .-active
      }
    });
    Ответ написан
    2 комментария
  • Как в js указать все числа находящиеся в определенном диапазоне?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В JS есть клевая штука: генераторы.
    Чтобы не забивать сразу память всеми значениями (что, если понадобится от 1 до 1050), можно их получать по одному:
    // эта функция - Генератор. Он создаёт итерируемые штуки
    function* makeRangeIterator(start = 0, end = 100, step = 1) {
        let iterationCount = 0;
        for (let i = start; i < end; i += step) {
            iterationCount++;
            yield i;
        }
        return iterationCount;
    }
    
    // вот сделаем итератор от 1 и до 10 (исключая конец)
    var r1_10 = makeRangeIterator(1, 10);
    
    // в цикле получим из итератора значения
    for (i of r1_10) {
      console.log(i); // выведет от 1 до 9
    }
    Ответ написан
    Комментировать
  • Почему не срабатывает условие (подсчет слов в тексте)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Хорошие решения приходят в голову при чтении документации. Например, метод строки split() в качестве разделителя может принимать не только строку, а и регулярное выражение.

    Логика вашего скрипта: разбить текст по пробелу ИЛИ запятой ИЛИ точке. Регулярка для этого - группа символов в квадратных скобках: /[ ,.]/ — будет соответствовать пробелу или запятой или точке.

    Подвох в том, что могут получаться пустые строки как элементы массива. Например, из "test one." получится ["test", "one", ""] Поэтому стоит пройтись по массиву, оставив в нём только строки ненулевой длины: arr.filter(w => w.length > 0)

    Ну и взять длину полученного массива.
    Ответ написан
    Комментировать
  • Влияет ли цикл requestAnimationFrame на скорость воспроизведения анимации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    разная частота вызовов функции в requestAnimationFrame() – зависит от устройства, активности/неактивности вкладки и др.

    Но в вашу функцию параметром при вызове передаётся время, прошедшее с некого момента старта, первого вызова. И положение куба стоит расчитывать исходя не из числа вызовов функции, а только исходя из времени.

    Так анимация в разных условиях будет иметь идентичную скорость перемещения куба, хоть и с разной частотой кадров: где-то плавнее, где-то скачками, но, например, коснётся пола он одновременно на всех устройствах.
    Ответ написан
    Комментировать
  • Как ускорить while loop?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    includes() и indexOf() каждый раз, считайте, пробегают, в среднем, по полстроки.
    Представьте, что там дико длинные строки, гигабайтные.
    Поэтому алгоритм желательно построить так, чтобы по каждой Войне и Миру пройтись 1 раз или меньше.

    Условие хорошо сужает возможные символы до всего 26 букв латинского алфавита a..z

    Рабочее решение под
    спойлером

    Например, можно создать массив из 26 счётчиков и заполнять их из первой строки и опустошать из второй.
    Вот такое моё решение прошло тест:
    function scramble(str1, str2) {
      if (str1.length < str2.length) return false;
      const a = Array(26).fill(0);
      for (let c of str1) a[c.charCodeAt(0) - 97]++;
      for (let c of str2) a[c.charCodeAt(0) - 97]--;
      for (let n of a) if (n < 0) return false;
      return true;
    }
    * 97 это ASCII-код маленькой латинской "a"
    Ответ написан
    Комментировать
  • Как записать в одномерный массив все элементы из многомерного?

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно проверять длину буфера:
    // every 100ms examine the socket and send more data
    // only if all the existing data was sent out
    setInterval(() => {
      if (socket.bufferedAmount == 0) {
        socket.send(moreData());
      }
    }, 100);

    Вариант — сделать свою обёртку над буфером отправки. Чтобы в буфере самого WS было максимум одно сообщение, а остальные ждали в _вашей_ очереди, над которой вы полный хозяин.
    Ответ написан
    1 комментарий
  • Почему выводит undefined при выводе значения объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    response.response — строка текста. Её надо JSON.parse(), и потом уже тащить из полученного parsed.records[0].firstName
    Ответ написан
  • Как обновлять значения объекта, а не переписывать их?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если откинуть шелуху, вопрос сводится к тому, как объединять объекты «глубоко» — как делать deep merge.
    Довольно частый вопрос и есть несколько решений: использовать готовую библиотеку или написать рекурсивный обход свойств объекта: если свойство это объект, то (повторить для него). Если свойство примитив то скопировать.
    Ответ написан
    Комментировать
  • Как "x" становиться элементом массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    arr.filter(nam(20,50))
    
    // это то же самое:
    arr.filter(function (x) { return x >= 20  &&  x <= 50; })
    
    // или так:
    function f(x) {
      return x >= 20  &&  x <= 50;
    }
    arr.filter(f)

    Метод массива .filter(f) применит функцию f по очереди к каждому элементу массива. Т.е. вызовет функцию f(10), f(20), ... f(70)
    И на выходе оставит те из элементов, для которых вызов f(элемент) вернул true.
    Ответ написан
    1 комментарий
  • Как управлять памятью в javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объект числа занимает больше памяти, чем само число. Где-то пишут, что байты числа (8) + ещё 8 байт. Поэтому в 2 раза больше памяти потребуется только на числа: 4e9 * 16 байт = 64e9 байт примерно 60 Гб.
    Эффективнее использовать память можно было бы с помощью ArrayBuffer.
    Ответ написан
    3 комментария
  • Как поженить php и js?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    если JS в теле страницы, которую формирует PHP, то просто вставляйте в вывод:
    index.php
    <?php
    $result = [];
    while ($ar_fields = $my_elements->GetNext()) {
          $result[] = $ar_fields;
    };
    ?>
    
    const items = <?php echo json_encode($result); ?>;
    Ответ написан
    3 комментария
  • Как вырезать из строки подстроку и определенное количество символов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. Найти индекс начала этой подстроки в строке .indexOf()
    2. Сложить длину подстроки и сколько там символов после.
    3. substr()
    Ответ написан
    Комментировать