Задать вопрос
  • В чем смысл быть гуру тостера?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    1. Работа над личным брендом: Высокая репутация в профессиональных сообществах повышает привлекательность для нанимателей.
    2. Улучшение существующих знаний: Хочешь что-то понять, объясни другому.
    3. Приобретение новых знаний: Специализация замыкает в узком спектре задач и проблем, а Q&A-сервисы - это источник задач и проблем из самых разных областей и иногда под самыми неожиданными углами.
    4. Альтруизм: Большинству из нас кто-то помогал в начале пути, пришло время возвращать долг и делать свой скромный вклад в рост кадров.

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

    Для чего просиживаете на тостере по 5-6 часов в день?

    Я в среднем раз в полчаса-час заглядываю. Если находится интересный вопрос, могу потратить на него минут 10. Некоторые на перекуры больше времени тратят.
    Ответ написан
    7 комментариев
  • Зависимость элемента от реализации дочернего элемента, допустима по БЭМ?

    RedEagle69
    @RedEagle69
    Html-верстальщик, Front-end разработчик
    Ну во-первых, нужно поработать над семантикой в html. Сборная div-янка это совсем не круто.
    Вот два варианта реализации:
    1)
    <section class="content">
      <div class="content__text-wrap">
        <h2 class="content__title">Заголовок</h2>
        <p class="content__descr">Блок с текстом</p>
      </div>
    </section>

    2)
    <section class="content">
      <div class="content__text-wrap article">
        <h2 class="article__title">Заголовок</h2>
        <p class="article__descr">Блок с текстом</p>
      </div>
    </section>

    А по поводу размера шрифта: большой разницы нет, всё зависит от контекста. Не забывайте про модификаторы. Верстать можно и так и сяк и наперекосяк.
    Ответ написан
    2 комментария
  • Как создать очередность выполнения функций в js?

    @alexbutav
    Подождите, прежде чем дать какой-то ответ/решение к задачи - нужно понять суть проблемы.
    Прежде всего давайте разбираться с проблематикой.

    Вам нужно, чтобы по событию вызывалась функция, в которой будут в определенном порядке вызываться три остальные? Причем этих остальных функций может быть N-ое количество и вызываться они должны в строгом порядке и только друг за дружкой?

    Или Вам нужно показывать модальные окна, после завершения обработки каждого из которых будет вызываться следующее?

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

    Ну есть у Вас N-массивов, в каждом лежит сколько-то функций. В какой-то момент Вам нужно вызывать из каждого массива, по одной функции, по очереди, причем одну после другой - ну так это называется стек. Кладёте в какой-то стек указатели на объекты функций при вызове вашей основной, а потом по событию из модалок шифтите( вытаскиваете из начала ) по одной и выполняете.

    Вам можно разделить отрисовку модалок или просто сделать функцию, которая будет извлекать из стека следующую и вызывать.

    Вот пример с комментариями.


    Но сразу хочу сказать, что это просто один из вариантов решения. Всё это конечно же можно сделать на промисах.

    Пример реализации, которую я показал плоха хотя бы тем, что есть глобальные объекты, что всегда нежелательно.
    Ответ написан
    3 комментария
  • Как перейти с VS Code на PhpStorm?

    @dimoff66
    Кратко о себе: Я есть
    Настройки в PHPStorm очень простые и очевидные, я сделал свою тему полностью под себя, поменяв и шрифт и цвета всех составляющих кода под то, что мне удобно и привычно.
    Ответ написан
    Комментировать
  • Как в JS отловить изменения сделанные при помощи innerHTML?

    nikolayshabalin
    @nikolayshabalin
    Автор профессиональных курсов в HTML Academy
    Ответ написан
    Комментировать
  • Что не так с кодом js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Это чё, в setInterval запихнули подключение обработчика keydown? Умно. Не нужен тут никакой setInterval.

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

    Размер картинок - а если решите поменять? Или опечатаетесь где-нибудь? Сделайте константу.

    Что касается рисования, то наверное, проще всего будет замостить холст фоновым изображением, а потом рисовать персонажа.

    Как это всё может выглядеть:

    const canvas = document.querySelector('#canvas');
    const ctx = canvas.getContext('2d');
    
    const TILE_SIDE = 32;
    
    let pickX = 0;
    let pickY = 0;
    
    const ground = new Image();
    ground.src = 'Ground.png';
    const pick = new Image();
    pick.src = 'Pick.png';
    
    document.addEventListener('keydown', function(e) {
      switch (e.keyCode) {
        case 87: pickY -= TILE_SIDE; break;
        case 65: pickX -= TILE_SIDE; break;
        case 83: pickY += TILE_SIDE; break;
        case 68: pickX += TILE_SIDE; break;
    
        default: return;
      }
    
      draw();
    });
    
    function draw() {
      for (let x = 0; x < canvas.width; x += TILE_SIDE) {
        for (let y = 0; y < canvas.height; y += TILE_SIDE) {
          ctx.drawImage(ground, x, y);
        }
      }
    
      ctx.drawImage(pick, pickX, pickY);
    }
    
    draw();
    Ответ написан
    Комментировать
  • Какой смысл использования node.js и прочего для backend?

    sim3x
    @sim3x
    если все заказчики, в основном, просят натяжку на CMS, где нужно понимание php
    False

    на CMS, где нужно понимание php
    False

    на каком уровне нужно знать backend
    на уровне - я знаю как решить данную проблему за Х часов, я ее уже решал минимум два раза
    Ответ написан
    1 комментарий
  • Как сделать background c с градиентом по границам текста?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Похоже, что единственный работающий вариант реализовать такой градиент на CSS - это играться со свойством mix-blend-mode и делать фолбек для старых браузеров. Что-то вроде этого:

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

    kawabanga
    @kawabanga
    А зачем вам .htaccess? правильно делает хостер, что запрещает вам с ним работать.

    Я бы на вашем месте проверял бы конфиг (config.php), если конфиг существует то запускаете в работу ваш сайт. А если нет - то запускаете процесс установки/настройки.
    Ответ написан
    Комментировать
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    opium
    @opium
    Просто люблю качественно работать
    Берите заказы посложнее пять заказов по двести и уже 1000
    Ответ написан
    3 комментария
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    Sanes
    @Sanes
    Найти покупателей на $1000. Фриланс это предпринимательская деятельность.
    Ответ написан
    Комментировать
  • Нагружает ли composer сайт на production?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Вам правильно написали, что по-хорошему, с Композером надо работать на локальной машине.

    Но, если будете гонять его на боевой машине, обязательно учтите, что Composer использует совершенно непотребное количество оперативной памяти (и автор отвечает на вопросы об этом, по сути, издёвками).
    К примеру, для установки Drupal 8 или обновления одного установленного модуля вам едва-едва хватит гигабайта. Что-то более серьёзное может потребовать больше.

    Так что я бы закладывал потребление RAM примерно 1-1.5 ГБ в моменты, когда Композер работает. Нагрузка на процессор тоже будет не нулевой, но она всё-таки много более сносная.
    Ответ написан
    6 комментариев
  • Как реализовать display: block по событию onclick одному div и при этом всем раннее открытым из 36 штук - display: none на чистом js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Разные классы не нужны, достаточно одного общего:

    .ranging {
      display: none;
    }
    
    .ranging.opened {
      display: block;
    }

    При клике смотрим индекс нажатой кнопки, обходим элементы с контентом, выставляем класс в зависимости от равенства текущего индекса индексу кнопки:

    const buttonSelector = '.selector';
    const contentSelector = '.ranging';
    const activeClass = 'opened';
    const toggleContent = (contents, index) =>
      contents.forEach((n, i) => n.classList.toggle(activeClass, i === index));
    
    
    // делегирование, назначаем обработчик клика один раз для всех кнопок
    // наверное, у них есть какой-то общий предок, тогда вместо документа
    // вешать обработчик следует на него:
    // document.querySelector('селектор_контейнера_с_кнопками').addEventListener(...
    document.addEventListener('click', e => {
      const button = e.target.closest(buttonSelector);
      if (button) {
        const buttons = document.querySelectorAll(buttonSelector);
        const index = Array.prototype.indexOf.call(buttons, button);
        toggleContent(document.querySelectorAll(contentSelector), index);
      }
    });
    
    // или, назначаем обработчик клика индивидуально каждой кнопке
    const onClick = function(e) {
      toggleContent(this, +e.currentTarget.dataset.index);
    }.bind(document.querySelectorAll(contentSelector));
    
    document.querySelectorAll(buttonSelector).forEach((n, i) => {
      n.dataset.index = i;
      n.addEventListener('click', onClick);
    });
    Ответ написан
    4 комментария
  • Как сделать фильтрацию по нескольким значениям в VueJS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложно это всё. Четыре селекта - очень похожие, четыре вычисляемых свойства - очень похожие. Многовато копипасты. Надо упростить.

    Первым делом внимательно посмотрим на все эти похожие куски кода, найдём, где они отличаются, и на основе этих отличий сделаем описание фильтров:

    filters: [
      { name: 'calculator.brand_filter', getter: obj => obj.brand.name, value: '' },
      { name: 'calculator.company_filter', getter: obj => obj.company.name, value: '' },
      { name: 'calculator.country_filter', getter: obj => obj.brand.country, value: '' },
      { name: 'calculator.side_filter', getter: obj => obj.sides, value: '' },
    ],

    Затем сделаем собственно фильтрацию, пропустим данные через массив фильтров (если значение фильтра выставлено - производится фильтрация, нет - оставляем данные как есть):

    computed: {
      filteredProfiles() {
        return this.filters.reduce((profiles, { value, getter }) => {
          return value
            ? profiles.filter(n => getter(n) === value)
            : profiles;
        }, this.profiles);
      },

    Далее, надо дать пользователю возможность задавать значения фильтров. Сделаем компонент фильтра:

    Vue.component('filter-select', {
      props: [ 'name', 'options', 'value' ],
      template: `
    <div>
      <p>{{ name }}<p>
      <select :value="value" @change="$emit('input', $event.target.value)">
        <option value="">-</option>
        <option v-for="n in options">{{ n }}</option>
      </select>
    </div>`
    });

    Подготовим опции для фильтров - массивы уникальных значений, по которым будет осуществляться фильтрация:

    computed: {
      filterOptions() {
        return this.filters.map(n => [...new Set(this.profiles.map(n.getter))]);
      },

    Наконец, создадим сами фильтры:

    <filter-select
      v-for="(n, i) in filters"
      v-model="n.value"
      :options="filterOptions[i]"
      :name="trans(n.name)"
    ></filter-select>

    Также не будем забывать про обнуление значений фильтров. Так что вот метод сброса фильтров и кнопка, по клику на которую он будет вызываться:

    methods: {
      resetFilters() {
        this.filters.forEach(n => n.value = '');
      },

    <button @click="resetFilters">{{ trans('calculator.reset_filter') }}</button>

    Демо можно посмотреть здесь (да, тут меньше фильтров, чем у вас - ну так вы свои данные не показали, а у меня воображения на большее не хватило).
    Ответ написан
    1 комментарий
  • Как, используя jquery, выполнить скрипт только для 1 карточки?

    @DanKud
    Во-первых id это уникальный идентификатор. Делать несколько элементов с одним id это в корне неправильно + через JQuery по id вы получите в ответ только один элемент. Используйте классы:
    <div class="aboutfilm">
        .....
    </div>
    
    <script>
    $('.aboutfilm').each(function() {
        $(this).on('click', () => {
            $(this).parent().find('.test').addClass('card-text-change');
            $(this).parent().find('.card-text').css('opacity', '1');
            $(this).css('display','none');
        });
    });
    </script>
    Ответ написан
    4 комментария
  • Есть ли аналог @media запросов только для мобильных устройств?

    @Genexys
    фронтенделье
    Вы не то смотрите. Почитайте спеку media какие они значения принемают
    Ответ написан
    Комментировать
  • Взлом или развод?

    flapflapjack
    @flapflapjack
    на треть я прав
    Может ли злоумышленник, получив данные о списках таблиц так же получить и содержимое этих таблиц?


    В зависимости от степени экранирования символов при фильтре какого-то из параметров.

    По сути, скорее всего инъекция была сделана именно на вашем сайте, следовательно запрос выполнялся от имени вашего пользователя, у которого есть все права на БД - следовательно может и удалять и читать любые записи.

    Нужно как-то отследить место SQL-инъекции.

    Я в этом не спец, но например можно посмотреть лог mysql на наличие строки SHOW DATABASES или SHOW TABLES, а так же по поиску слова UNION, коим часто пользуются при создании инъекций. Найдя в логах время исполнения данного запроса можно глянуть в access.log у апача запрошенный адрес сайта, который был запрошен в то же время, что и инъекция в SQL.

    Имея точное расположение скрипта можно поставить вставки функции для логирования $_SERVER['REQUEST_URI'] и определить что за запрос был сделан, и от этого плясать.
    Ответ написан
    1 комментарий
  • Как трансформировать шаблон для разных CMS???

    Robur
    @Robur
    Знаю больше чем это необходимо
    Программ нет, но есть сервисы:
    upwork.com
    freelansim.ru

    это основные, там можно конвертировать 100%, за некоторую плату конечно.
    Если не подходят по каким-то причинам, есть еще множество других подобных сервисов.
    Ответ написан
    Комментировать
  • Как присвоить значение iframe к input?

    Stalker_RED
    @Stalker_RED
    iframe.contentWindow.body.innerHTML
    https://developer.mozilla.org/en-US/docs/Web/API/H...

    Если iframe с другого домена, то нужно будет настроить CORS.
    Ответ написан
    2 комментария