Задать вопрос
  • Как изменить стили через javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    var el = document.querySelector("a[href='/products/962112']"); // в селекторе хардкод... не будет ссылки с таким href - все сломается
    
    // тут был цикл, но я его убрал, ибо один элемент берем
    
    var products = document.getElementsByClassName('product'); // тут коллекция, ее надо перебирать циклом
    for(var i = 0; i < products.length; i++) {
      products[i].style.height = el.style.height;
    }


    UPD: по просьбе origami1024 добавляю вариант с CSSOM
    Во-первых, нам понадобится новый элемент style, чей CSSOM мы будем править, его стоит разместить ниже других стилевых подключений (не важно через style или link), я же просто добавлю в конец head
    Сам CSSOM элемента style доступен через его свойство sheet - извлеку его сразу в переменную:
    const {sheet} = document.head.appendChild(document.createElement('style'));

    Во-вторых, в CSSOM правила пронумерованы с 0. Притом можно заменять существующие правила по их индексу, а можно вставлять новые в конец (индекс при этом так же нужно указывать, а если указать неверно - выкинет эксэпшн). Нам же удобнее обращаться к правилам по селектору, поэтому я сделаю объект для сопоставления селектора с индексом правила и счетчик индексов:
    const rulesIndexesBySelector = {};
    let nextIndex = 0;

    Ну и наконец реализуем вспомогательную функцию для обновления CSSOM правила по его селектору:
    function updateRule(selector, declarations) {
      const rule = `${selector}{${declarations}}`; // полное правило - селектор + декларации в {}
      if(selector in rulesIndexesBySelector) {
        // индекс селектора уже известен, обновим правило
        const index = rulesIndexesBySelector[selector];
        sheet.deleteRule(index); // сначала удалим старое правило освободив индекс и отменив его свойства
        sheet.insertRule(rule, index); // и вставим на его место новое
      } else {
        // новый селектор
        const index = nextIndex++; // важен именно постинкримент, чтоб самый первый получил 0, второй 1 и т.д.
        rulesIndexesBySelector[selector] = index; // запомним на будущее
        sheet.insertRule(rule, index); // и вставим правило в конец
      }
    }

    Пример примитивный, но каждый думаю спокойно расширит его под себя.
    У меня например declarations собираются из vue объекта, который можно мутировать (реактивные стили оО) + добавляются вендорные префиксы, если браузер не знает каких-то свойств (не автопрефиксер конечно, но зато работает по месту)

    Использовать это все теперь можно крайне просто:
    updateRule('.product', 'height: 40px; width: 50px');
    Ответ написан
    5 комментариев
  • Как удалить внешний блок?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const elem = document.querySelector('.one');
    const frag = document.createDocumentFragment();
    for(const child of elem.childNodes) {
      frag.appendChild(child);
    }
    elem.parentElement.replaceChild(frag, elem);
    Ответ написан
  • Как вызвать функцию через 5 секунд после клика?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Функция up должна корректно решать поставленную задачу
    Скорее всего проблема в обработчике события.
    Атрибуты вроде onclick работают только с глобальным контекстом, лучше их не использовать

    Правильнее выбрать input из DOM (например с помощью document.querySelector) и навешать обработчик через метод элемента addEventListener

    Так же важно помнить, что выбор элемента нужно делать после того, как он появится на странице, лучше всего для этих целей подходит событие DOMContentLoaded у document:
    document.addEventListener('DOMContentLoaded', function() {
      // здесь спокойно можем делать document.querySelector
    });
    Ответ написан
    Комментировать
  • Тратит ли функция cb = ( e ) => e ресурсы на вычисления?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В общем случае да - как минимум на создания контекста вызова, но после оптимизации может и не тратить, identity функция (функция просто возвращающая свой аргумент, как Ваш cb) хорошо инлайнится, тут вопрос в том - инлайнится ли функция, в которую Вы ее передаете.

    Для понимания, нужно понимать, что v8 делает с кодом под капотом:
    Когда платформа (браузер, node.js) только загрузила исходный код в v8, то выполняет его с помощью интерпретатора Ignition, а заодно анализирует это выполнение. На этом этапе весь код выполняется как есть.
    Функции которые вызвались 2-3 раза отправляются в оптимизирующий JIT компилятор TurboFan, который скомпилирует из JS машинный код и сделает множество оптимизаций. В частности он может инлайнить некоторые функции (но не все).
    Например, если при анализе кода выяснится, что некая функция f0 постоянно вызывает f1 передавая ей Ваш cb, и при этом f1 чистая функция - то f1 скорее всего заинлайнится в f0, а вызов cb просто заменится на свой аргумент. Но опять же, все зависит от Вашего кода и на сколько он оптимизируемый.

    В любом случае identity функция очень легкая
    Ответ написан
    4 комментария
  • Как ограничить тип T примитивными типами f32 и f64?

    bingo347
    @bingo347
    Crazy on performance...
    Ограничить дженерик-тип можно только типажами (traits).
    Что Вы хотите сделать? Какие методы f32 и f64 Вам нужны?
    Возможно данные методы уже реализованы в типажах стандартной библиотеки - тогда нужно ограничивать их суммой.

    Другой вариант, сделать свой типаж, ограничить дженерик тип им, имплементировать этот типаж для f32 и f64
    Имплементация должна представлять обертки над нужными действиями

    UPD: если нужно ограничение дженерик, на использование метода exp у f32 и f64:
    Типаж-контракт на метод exp:
    trait Exp {
        fn exp(self) -> Self;
    }
    
    impl Exp for f32 {
        fn exp(self) -> Self {
            <f32>::exp(self)
        }
    }
    
    impl Exp for f64 {
        fn exp(self) -> Self {
            <f64>::exp(self)
        }
    }


    так же можно воспользоваться следующим крэйтом:
    https://crates.io/crates/num
    Ответ написан
    2 комментария
  • Какие языки используют для создания приложений?

    bingo347
    @bingo347
    Crazy on performance...
    ОС чаще всего пишут на низкоуровневых языках, вроде C (Linux, FreeBSD), C++ (Windows), Rust (Redox). Иногда используют ассемблерные вставки.

    Игры (имеются в виду 3D игры) чаще всего пишут на C++, но так же возможно на C# (Unity), JS (Unity или что-то упрощающее работу с WebGL). Хотя могут быть и другие языки (например майнкрафт написан на JAVA, а старый добрый Doom - на C). Так же понадобится язык шейдеров для программирования видеокарты, например для OpenGL и WebGL таким языком является GLSL.

    Прикладной софт вообще пишется на чем угодно, выбор языка зависит от задачи. Но в некоторых сферах все же можно выделить лидеров:
    Энтерпрайз решения - Java EE, реже C#
    Десктопный софт под Windows - C# (реже другие языки .net платформы)
    Десктопный софт под MacOS - Swift
    Десктопный софт кросплатформенный - Java, Python, JS (Electron)
    Мобильный софт под Андроид - Kotlin, Java
    Мобильный софт под iOS - Swift
    Мобильный софт кросплатформенный - C# (Xamarin), JS (Cordova, ReactNative, etc.)
    Серверный софт - php, Python, Ruby, JS (node), Java, Go, Rust, ... вариантов много
    Браузерный софт - JS или то что компилится в JS (чаще TypeScript)
    Ответ написан
    11 комментариев
  • Как контролировать количество табов в puppeteer?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const PARES_CONCURENCY = 10; // сколько вкладок открываем за раз
    runURLs([
      'https://site.com/url1',
      'https://site.com/url2',
      'https://site.com/url3',
      'https://site.com/url4'
      // ...
    ]).then(() => console.log('Готово!'));
    
    async function runURLs(urls) {
      const browser = await puppeteer.launch();
      const tasks = urls.map(url => async () => {
        const page = await browser.newPage();
        await page.goto(url);
        // делаем что-то со страницей
        await page.close();
      });
      const queue = tasks.slice(PARES_CONCURENCY)[Symbol.iterator]();
      const runNextTask = () => {
        const {value, done} = queue.next();
        if(done) { return; }
        return value().then(runNextTask);
      };
      await Promise.all(tasks.slice(0, PARES_CONCURENCY).map(task => task().then(runNextTask)));
      await browser.close();
    }
    Ответ написан
    Комментировать
  • Как прослушать звуковой файл, получить текст и сравнить его с предоставленным текстом и нажать на определённую кнопку на JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    2. https://cloud.yandex.ru/services/speechkit
    3. точно не распознает, поэтому гуглим расстояние Левинштейна
    насчет нажать кнопку - не проще функцию вызвать напрямую?
    Ответ написан
    3 комментария
  • Как повысить requestAnimationFrame?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В колбэк requestAnimationFrame первым аргументом приходит время в миллисекундах с дробной частью (как в результате performance.now)
    меряйте сколько прошло времени после последней анимации, если меньше некоего порогового значения (подберите) - то просто планируем следующий requestAnimationFrame и ничего не рисуем
    Ответ написан
    Комментировать
  • Как изменить редактор по умолчанию в git?

    bingo347
    @bingo347
    Crazy on performance...
    итак, во-первых путь к VSCode будет отличаться на разных ОС:

    Windows:'C:\Program Files\Microsoft VS Code\Code.exe'вообще может быть любым, но по дефолту тут
    MacOS:
    '/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code'

    Linux: тут все сложнее, может отличаться от дистрибутива/пакетного менеджера (flatpak вообще в домашнюю папку все ставит), но где встречал, везде делает симлинк в исполняемые папки, поэтому узнаем следующей командой:which code

    и вот нужный путь и прописываем сразу после git config --global core.editor
    Ответ написан
  • Какой язык выбрать после PHP?

    bingo347
    @bingo347
    Crazy on performance...
    Если чисто посмотреть и отвлечься - попробуйте что-нибудь низкоуровневое, например C или Rust, или еще на уровень ниже - какой либо диалект ассемблера (для Linux'а например сейчас актуален NASM x86_64), это по крайней мере пользу принесет, в виде базового понимания, как железо работает.
    Другой вариант, посмотреть на парадигмы своего языка со стороны других языков. Например в php преобладает ООП - смотрим на другие ООП языки - C# или Java.
    И еще вариант, разобраться с совершенно новой парадигмой, например ФП (clojure, haskell) или акторами (Erlang, в какой то степени Go)
    P.S.

    ИМХО, но Ruby и Go - плохие языки, да php позволяет Вам на говнокодить, но и не запрещает писать качественный и поддерживаемый код, а вот с Ruby и Go так не пройдет:
    Ruby - write only язык, годный лишь на то чтоб накидать MVP, опробовать идею и, если поперло, переписать все с нуля... посмотрите исходники gitlab и попытайтесь в них хоть что-то понять, к вечеру Вас уже будет тошнить от Ruby, и так можно сказать про любой Ruby проект живущий дольше нескольких месяцев...
    Go - я убил на этот язык больше года, пока не понял, что язык форсирует на копипасту... Кто-то умный рассказал Вам про принцип DRY? С Go Вам придется забыть об этом принципе... Опять же, загляните в исходники докера, чтоб понять о чем я говорю...
    Ответ написан
    Комментировать
  • С чего правильно начинать изучение JavaScript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    learn.javascript.ru - конечно отвратительный учебник, написанный хорошим методистом, но отвратительным программистом. Научится, то Вы по нему научитесь, но плохим практикам...
    Флэнаган - с точностью до наоборот, книга от хорошего программиста, но вот с методологией обучения... вообщем научится будет сложно, но если научитесь, то научитесь правильным вещам

    ну и соглашусь с комментарием Brad9aga под вопросом, нужно сначала азы изучить, как вообще компьютер работает, как процессор считает, как память хранит данные, и лишь после браться за какой либо язык программирования
    Ответ написан
    5 комментариев
  • Используют ли document.write и почему бы нет?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    document.write сейчас реально используется только в одном случае - для динамического формирования документа внутри iframe, хотя и тут он постепенно вытесняется srcdoc атрибутом
    Ответ написан
    Комментировать
  • Vue.js, React или Angular? Express на Electron JS будет работать?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Vue.js, React или Angular?
    что знаете, то и берите...
    Далее все это запихну в Express.
    express это про создание тормознутых веб-серверов, у электрона есть более эфективное апи для этого:
    https://electronjs.org/docs/api/protocol
    https://electronjs.org/docs/api/ipc-main
    https://electronjs.org/docs/api/ipc-renderer
    Ответ написан
    Комментировать
  • Как правильно получать пакеты через node.js tcp сервер?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Может стоит внимательно читать доку?
    https://nodejs.org/api/buffer.html#buffer_buffers_...
    'ascii' - For 7-bit ASCII data only. This encoding is fast and will strip the high bit if set.

    ясно же написано, 7-битная кодировка, старший бит срезается, что и происходит в Вашем случае
    Ответ написан
    2 комментария
  • Почему node js не видит установленные пакеты npm?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1:
    PATH="$PWD/node_modules/.bin:$PATH" postcss --params

    Вариант 2:
    прописываем команду в секции scripts package.json и запускаем через npm run
    {
      "scripts": {
        "postcss": "postcss --params"
      }
    }
    npm run postcss
    вариант 3:
    запустить пакет через npx, для этого даже установки не требуетсяnpx postcss --params
    Ответ написан
    Комментировать
  • Как сделать так, чтобы scrollTop срабатывала при перезагрузке страницы, когда страница уже проскролена вниз?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function onScroll() {
        var windowTop = $(window).scrollTop();
        windowTop > 28 ? $('nav').addClass('stick-nav') : $('nav').removeClass('stick-nav');
    }
    $(window).scroll(onScroll);
    $(onScroll); // или просто onScroll();
    Ответ написан
    1 комментарий
  • Как я могу сделать скриншот страницы сайта на Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Ответ написан
    Комментировать