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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. подробнее про загрузку скриптов с async и defer

    // вызовет initialize только когда догрузятся все скрипты defer:
    document.addEventListener('DOMContentLoaded', initialize);
    Ответ написан
    1 комментарий
  • Что такое коллекция в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Четкого определения «collection» в JavaScript не встречал. Интуитивно, коллекция это структура данных для хранения нескольких значений.

    Объект и массив, по-моему, можно отнести к коллекциям.

    В ES6 появились два новых типа данных – Map и Set, которые тоже можно отнести к «коллекциям». В переводе на Русский язык словом «Коллекция» назвали из них именно Set, предназначенный для хранения только уникальных значений. Но я бы не считал требование уникальности значений отличительным признаком «коллекций» вообще.
    Ответ написан
    2 комментария
  • Что значит .chance?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    chance – новое придуманное свойство объекта request, назначаемое ему обработчиком.

    Пришёл запрос. Ему навесили новое свойство chance, записав в него случайное число от 0 до 1.
    В ответ на GET-запрос возвращают JSON, описывающий объект с единственным свойством тоже под названием "chance" (шанс), со значением взятым из ранее назначенного свойства объекта запроса.

    Свойство можно назвать как угодно. Например, toster. Тогда код выглядел бы так (замена в двух местах), но функционировал точно так же; возвращал тот же самый формат ответа:
    код
    const express = require('express')
    const app = express()
    app.use((request, response, next) => {  //Промежуточный обработчик
        console.log(request.headers)
        next()
    })
    app.use((request, response, next) => {
        request.toster = Math.random()
        next()
    })
    app.get('/', (request, response) => {
        response.json({
            chance: request.toster
        })
    })
    app.listen(3000)


    .headers — свойство объекта запроса, наследованное от нативного Node'овского объекта запроса, см. http.IncomingMessage.headers. Содержит все HTTP-заголовки принятого HTTP запроса.
    Ответ написан
    Комментировать
  • Как преобразовать массив из 64 чисел от 0 до 63 в цвет?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Тут некоторая избыточность.
    Цвет в вебе задаётся одним байтом 0..FF (0..255) для каждого компонента: R, G, B и, опционально, альфа (прозрачность 0..100). Прозрачность, вероятно, отбросим.
    Будем считать, что цвет – это три байта = 24 бита.

    0..63 это 6 бит. Для цвета достаточно четырёх чисел 0..63, чтобы получить 4 * 6 = 24 бита.
    четыре 6-битовых дают три 8-битных:
    00000011 11112222 22333333


    В массиве из 64 элементов 64 / 4 = 16 таких четвёрок, или 16 цветов. Можно генерить градиент )

    Вариант решения
    (()=>{
      // из четырёх чисел 0..63 получить строку цвета типа "#abcdef"
      const makeColor = (n1, n2, n3, n4) => {
        const r = (n1 & 63) << 2 | (n2 & 48) >> 4;
        const g = (n2 & 15) << 4 | (n3 & 60) >> 2;
        const b = (n3 & 3) << 6 | n4 & 63;
        return '#' + [r,g,b].map(n => n.toString(16).padStart(2,'0')).join('');
      }
      
      // из массива чисел от 0 до 63, длиной кратной 4, получить массив цветов
      const arrToColor = arr => {
        const len = arr.length;
        if (len % 4) throw "Длина массива не кратна 4";
    
        const result = [];
        for (let i=0; i<len; i+=4)
          result.push(makeColor(...arr.slice(i, i+4)));
    
        return result;
      }  
    
      // тест
      const test = () => arrToColor(
        [...new Array(64)].map(()=>Math.floor(64 * Math.random()))
      );
      return test();
    })()
    
    /*
    #941510,#4b31ca,#eec8c9,#4c9202,
    #336a01,#95b7ec,#e73d44,#4069e6,
    #4d1700,#8efa27,#8e0333,#f089af,
    #67b561,#fc8fc8,#48503c,#f308a9
    */


    Ответ написан
    Комментировать
  • Можно ли упростить функцию?

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

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. дайте какой-то уникальный id тому div'у рядом с "Результат"
    2. получите этот div, как вы уже делаете с "chislo1": var div = document.getElementById(...
    3. вставьте в него результат: div.innerText = "вот, что получилось";
    Ответ написан
    3 комментария
  • Как выполнить код после перезагрузки страницы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Пусть форма отправляет данные POST'ом на главную.
    Сервер, получив данные, пусть включает в код страницы js, который хотите выполнить.
    Ответ написан
  • Как взять значение из элемента?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Допустим, у вас такая разметка:
    <section>
      <article>
        <a href="#">1 ссылка</a>
      </article>
    </section>


    Цифру "1" можно получить так:
    const el = document.querySelector('a'); // находит первый подходящий элемент
    const text = el.innerText;
    const digitText = text.substring(0,1); // тут будет текст единичка
    const digitNumber = +digitText; // тут уже число 1


    С тегом span так же:
    const el = document.querySelector('span'); // найдет самый первый элемент span в документе


    Если элементов span, например, много, а нужен единственный внутри, скажем, известного div'а
    <span>не нужный</span>
    <div id="theone">
      <span>300 спартанцев</span>
    </div>

    в таком случае можно указать id дива и внутри него искать первый элемент span:const span = div.querySelector('#theone span');
    Ответ написан
    Комментировать
  • Генерируемый список Js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. Node.insertBefore()

    Что-то типа:
    function insertFirst(id) {
      const li = document.createElement('li'); // создали новый листайтем
      li.innerText = "меня тут не стояло";
      const parent = document.getElementById(id); // это ul
      const first = parent.firstChild; // это первый li до вставки
      parent.insertBefore(li, first); // впихнули новый li перед бывшим первым
    }
    Ответ написан
  • Не могу понять работу метода .map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function camelize(str) { // на вход приходит строка
       return str      // вот тут пока ещё строка
         .split('-')   // здесь из этой строки сделали массив, разбив её по символу дефиса
                       // ниже пошёл массив ["lol", "kek", "cheburek"]
         .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) // что-то сделали с каждым элементом массива
         .join(''); // соединяет ['my', 'Long', 'Word'] в 'myLongWord'
     }


    Теперь упростим непонятную строку.
    К ней пришёл массив, у которого вызывается метод map() – он просто применит функцию в нём к каждому элементу массива. На выходе получится новый массив.
    .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) //**
    
    // то же самое, что:
    .map(
      function(word, index) {
         return index == 0 ? word : word[0].toUpperCase() + word.slice(1);
      }
    )
    
    // то же самое, что:
    .map(
      function(word, index) {
        if (index == 0) {
          return word;
        } else {
          return word[0].toUpperCase() + word.slice(1);
        }
      }
    )


    Метод массива .map() вызывает функцию, которая в нём аргументом, для каждого элемента массива и передёт в неё следующие три параметра:
    1. Текущий обрабатываемый элемент массива.
    2. Индекс текущего обрабатываемого элемента в массиве.
    3. Массив, по которому осуществляется проход.
    Ответ написан
    1 комментарий
  • Почему не получается перезаписать символ в двумерном массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Строку разбили по пробелам на слова. И затем у каждого слова пытаетесь заменить первый символ на его заглавную версию. Но вот такой доступ к строке как к массиву букв работает только «для чтения»:
    mass[i][0]

    Нельзя просто взять и .. заменить символ в строке.

    См. Доступ к символам:
    отрывок документации
    Другим способом (введённым в ECMAScript 5) является рассмотрение строки как массивоподобного объекта, в котором символы имеют соответствующие числовые индексы:
    return 'кот'[1]; // вернёт "о"
    При доступе к символам посредством нотации с квадратными скобками, попытка удалить символ, или присвоить значение числовому свойству закончится неудачей, поскольку эти свойства являются незаписываемыми и ненастраиваемыми. Смотрите документацию по методу Object.defineProperty() для дополнительной информации.


    Вариант решения – сделать из каждого слова настоящий массив букв:
    const titleCase = str => str
        .toLowerCase()
        .split(' ')
        .map(word => {
          const chararr = word.split('');
          chararr[0] = chararr[0].toUpperCase();
          return chararr.join('');
        })
        .join(' ');
    
      titleCase("I'm a little pea"); // I'm A Little Pea
      titleCase("I love the sky and the trees"); // I Love The Sky And The Trees
    Ответ написан
  • Как привязать клик по элементу создаваемых в цикле?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вместо onClick используйте addEventListener()


    Upd. Корректнее вешать единственный общий обработчик на родительский элемент - он «поймает» все клики на элементы внутри себя.
    Ответ написан
    3 комментария
  • Танцы с обьектом и деструктуризацией?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    ({email} = body)
    Оно?

    Пример:
    {
      const body = {
        email: 'myEmail'
      };
    
      console.log(
        ({email} = body)   // Object { email: "myEmail" }
      );
    }


    См. Object Destructuring - Assignment without declaration
    Ответ написан
    Комментировать
  • Как можно созать видео динамичнеских графиков?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Точно можно сделать в Adobe After Effects: они умеют читать данные и связывать любые свойства с прочитанными параметрами. Но пока не придумал, как автоматизировать плавную смену позиций соседних стран, поднимающаяся всегда сверху над опускающейся.

    Другой вариант, сделать весь график и его анимацию в веб-среде, с помощью тех же D3.js и затем экспортировать её в видео программно или просто записью экрана.
    Ответ написан
    Комментировать
  • Корректировка JS кода ( сложение, вычитание )?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Раз используется jQuery почему бы сразу не отбирать нужные чекбоксы. И считать сумму их цен. При этом предыдущее значение цены никому уже не нужно, никаких вычитаний.
    function Check() {
      var price = 0;
      var PriceBoxes = $('[name=Price][type=checkbox]:checked');
      if (PriceBoxes.length) price = $.makeArray(PriceBoxes)
        .map(el => +el.value)
        .reduce((p,c) => p+c);
        
      $('.message').val(price);
    }


    Ответ написан
    4 комментария
  • Как один div спрятать, а другой вывести после нахождения на сайте более одной минуты?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬


    Только вместо 3000 (3 секунд) поставьте 6E4 (60000, минуту)
    Ответ написан
    Комментировать
  • Как отменить удаление элемента с помощью mutationobserver?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В коллбэк передаётся ссылка на удалённый(-е) элемент(ы).

    Аргумент коллбэка – массив MutationRecord'ов. При единичном удалении там один элемент. У него есть свойство removedNodes — это NodeList удалённых элементов.

    spoiler
    (1) […]
    ​  0: MutationRecord
    ​​  addedNodes: NodeList []
    ​​  attributeName: null
    ​​  attributeNamespace: null
    ​​  nextSibling: #text "
      "
    ​​  oldValue: null
    ​​  previousSibling: #text "
      "
    ​​  removedNodes: NodeList(1)
    ​​​    0: <li id="to-delete">
    ​​​    length: 1
    ​​​    <prototype>: NodeListPrototype { item: item(), keys: keys(), values: values(), … }
    ​​  target: <ul id="someElement">
    ​​  type: "childList"
    ​​  <prototype>: MutationRecordPrototype { type: Getter, target: Getter, addedNodes: Getter, … }
      length: 1
    ​  <prototype>: Array []


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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Путаете id элемента и сам элемент.

    HTML:
    <div id="my-div">Привет!</div>

    JS:
    var id = "my-div"; // это id
    var el = document.getElementById(id); // элемент
    el.getBoundingClientRect() // должно работать
    Ответ написан
    1 комментарий
  • Как сделать проверку что если хотя бы один чек бокс выбран?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В обработчике проверять коллекцию чекбоксов до первого включенного и ставить класс родителю.

    По картине трудно посоветовать конкретнее. Лучше бы привели разметку.
    Ответ написан
    Комментировать