• Как правильно передать параметры в функцию-обработчик чтобы потом его можно было удалить?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    На моей практике лучшим методом работой с различными EventEmitter/PubSub механизмами - это подписыватель возвращающий отписыватель. То есть некая функция, которая на основе своих аргументов организует подписку и возвращает функцию без аргументов, которая при вызове отменит подписку, отпишет от события и т.д.
    Пример из личной библиотеки:
    import {curry} from 'ramda';
    export const subscribe = curry((target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): (() => void) => {
        target.addEventListener(eventName, handler);
        return () => target.removeEventListener(eventName, handler);
    });

    Если убрать ramda и typescript, то останется такое:
    export const subscribe = (target, eventName, handler) => {
        target.addEventListener(eventName, handler);
        return () => target.removeEventListener(eventName, handler);
    };

    Суть: subscribe при вызове подпишет DOM объект target на событие eventName с функцией handler и вернет функцию без аргументов, которая при вызове отпишет DOM объект target от события eventName для функции handler

    В Вашем случае будет так:
    const curry = (i) => (e) => changeCountry(e, i);
    const unsubscribe = subscribe(button, 'click', curry(i));
    // когда подписка больше не нужна, просто вызываем unsubscribe()
    Ответ написан
    Комментировать
  • Зачем нужен return вообще кроме окончания функцыи?

    potapchino
    @potapchino
    функция всегда что-то возвращает. чтобы указать, что именно функция должна возвратить, используется ключевое слово return. это и есть его суть. даже если его(return) нет в теле функции, функция все равно вернет undefined по умолчанию.

    spoiler
    эта функция вернет undefined, т.к. ключевого слова return нет.
    function func() {
      var a = 5;
      var b = 10;
      var sum = a + b;
    }
    var result = func()
    console.log(result) // undefined


    эта функция вернет строку 'i love js', т.к. вы явно на это указали с помощью ключевого слова return.
    function func() {
      var a = 5;
      var b = 10;
      var sum = a + b;
      return 'I love js';
    }
    var result = func()
    console.log(result) // 'I love js'


    вернет сумму двух чисел
    function func() {
      var a = 5;
      var b = 10;
      var sum = a + b;
      return sum;
    }
    var result = func()
    console.log(result) // 15


    вернет сумму двух чисел
    function func(a, b) {
      var sum = a + b;
      return sum;
    }
    var result = func(3, 7)
    console.log(result) // 10


    тоже самое
    function func(a, b) {
      return a + b;
    }
    var result = func(2, 2)
    console.log(result) // 4


    следующие две функции возвращают undefined. первая явно, вторая неявно
    function func1() {
      return undefined;
    }
    var result = func1()
    console.log(result) // undefined
    
    
    function func2() {
      
    }
    var result = func2()
    console.log(result) // undefined


    вернет другую функцию
    function func() {
      return function () {
        return 'ааа сложнааа'
      };
    }
    var result = func()
    var result2 = result()
    console.log(result) // function func()
    console.log(result2) // 'ааа сложнааа'
    console.log(func()()) // 'ааа сложнааа'


    как только в функции встречается это ключевое слово, интерпретатор немедленно останваливает выполненние функции(выходит из нее) и возвращает то что написано после этого ключевого слова. именно поэтому этот цикл выполнит всего лишь одну итерацаю, а не 100, как и должно, и вернет 1.
    function func() {
      for (var i = 1;  i < 100; i = i + 1) {
        return i
      }
    }
    var result = func()
    console.log(result) // 1


    а вот так вернет 100
    function func() {
      for (var i = 1;  i < 100; i = i + 1) {
        
      }
      return i
    }
    var result = func()
    console.log(result) // 100


    а вот так вернет undefined
    function func() {
      for (var i = 1;  i < 100; i = i + 1) {
        
      }
      return 
    }
    var result = func()
    console.log(result) // undefined
    Ответ написан
    2 комментария
  • Как данными из json заполнить таблицу?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собираем html:

    const data = JSON.parse(json);
    const html = `
      <tbody>${data.response.items.map(n => `
        <tr>
          <td>${n.title}</td>
          <td>${n.director}</td>
          <td>${n.year}</td>
          <td>${Object.values(n.photo).map(n => `<img src="${n}">`).join('')}</td>
        </tr>`).join('')}
      </tbody>
    `;

    Добавляем в таблицу:

    $('#example').append(html);
    // или
    document.querySelector('#example').insertAdjacentHTML('beforeend', html);
    Ответ написан
    3 комментария
  • Почему не работает перенос строки в .append?

    alexandrknyazev13071995
    @alexandrknyazev13071995
    Есть способ задания строки не с помощью обычных и двойных обычных строк, но и с помощью обратных ковычек. В этом случае можно не беспокоиться о переносе строки.
    $( 'head' ).append( `
    вставляю
    что
    хочу
    `);
    Ответ написан
    Комментировать
  • "Норматив верстки", какой он?

    Evanre
    @Evanre
    Front-end developer
    Имхо, посылайте такого заказчика в увлекательное "трех-буквенное" путешествие легкой пешей походкой. Не стоит этот человек Вашего времени. Он всегда найдет к чему придраться, он никогда не будет уважать Ваш труд.

    Развивайтесь лучше профессионально, прокачивайте скилы, учите JS. Хороший фронт разраб сейчас берет в среднем 100 баксов за одну уникальную страницу, за лендинг больше. Что касается почасовки - от 10 баксов\час. На апворке фронты пишущие на js-фреймворках начинаются от 30\час. Это без TeamViewer'a, Скайпа и прочих извращений. Максимум - прога апворка, которая делает скрины каждые 5 минут, но это только при почасовке.

    Вот Вам пример с собственного опыта. Нарисовался заказчик. Сделать сайт с представлением услуг по продаже и установке заборов и прочего, около 18 страниц, пару сингл продуктов, архив, услуги главная в виде лендинга. Все как положено. Все должно наполняться из админки. Ну я потратил время, посчитал фронт + бекенд (дизайн был), написал ТЗ. По деньгам выходило примерно 950$ (Чтобы Вы понимали, зарубежные заказчики платят за такой функционал минимум в 2 раза больше). Он отказался, сказал дорого, рассчитывал не дороже 800. Ну я отказался сперва, потом через пару дней понял, что в данный момент работы другой нет и написал ему что соглашаюсь на его условия. Он ответил что если что напишет. Прошел месяц, я вчера ради интереса решил загуглить название его фирмы. И что Вы думаете? Убогий лендинг на бесплатном домене. Вместо полноценного сайта ему сделали кривой статический (index.html) лендос. Про то что творится в инспекторе я промолчу....
    Ответ написан
    Комментировать
  • Как обеспечить бесперебойный мониторинг работы сайтов/серверов, и их безопасность?

    mausspb
    @mausspb
    web разработчик, системный администратор
    Хммм , странно, чем вас zabbix не устроил ?

    • Хорошо настроенный firewall
    • правильные права для сайтов
    • Регулярные проверки сайтов по расписанию с оповещением ( у меня стоит через telegram)
    • Zabbix
    • fail2ban ( с блокировкой после n-го количества не верных авторизаций на сайте )

    Все должно летать, или у вас какие-то конкретные проблемы есть с безопасностью ?
    Ответ написан
    Комментировать
  • Как перенять объектно-ориентированное мышление?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Т.е. сложно понимаю, что "засунуть" в один объект, что в другой, что должно быть статическим методом, что приватным и тд.


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

    То есть по сути наше приложение - один объект. У него внутри вообще все. У этого объекта есть один метод - обработай запрос. Когда внешний мир его вызывает, меняются значения каких-то переменных, вызываются какие-то внутренние "приватные" для внешнего мира функции, и делается работа.

    Теперь задумаемся о декомпозиции всего этого хаоса. Мы находим какую-то задачу, которую выполняет наш код (например какую функцию вызвать для обработки каждого конкретного запроса) и выносим это в отдельный объект. Отправка email-ов - отдельный объект. Весь SQL зашиваем в отдельный объект. Соединение с базой - объект. Пользователи - объекты. Все - объекты.

    И главное, у каждого объекта есть своя область ответственности. UNIX way. Каждый объект делает что-то одно и делает это хорошо. Бывает так что ну... нужно сделать так что бы один объект делал две вещи. НЕ вопрос, мы можем его попросить сделать что-то сложное, а он будет как хороший менеджер тупо делегировать работу другим объектом. То есть он и сложную штуку сделает, и сам не будет знать как она делается.

    А все безхозные функции, которые не пренадлежат никаким объектам (например функции порождающие объекты) можно вынести в статические методы. Главное что бы статичесих переменных у нас небыло (ибо это те же глобальные переменные). И поменьше публичного ибо черт его знает что эти разработчики будут использовать. Причем "те разработчики" это вы завтра.

    Вообщем писав всё время на процедурке, сложно перейти на ооп.


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

    Вы можете начать погружаться в ООП с того, что разобраться "почему глобальные переменные это плохо", почему "состояние порождает сложность" и что такое эта "сложность" (многие почему-то думают что сложность выражается в написании кода а не в его чтении или поддержке), почему "изоляция" (и как следствие инкапсуляция) - это хорошо. Как это все соотносится с декомпозицией. Что такое "ответственность", что такое зависимости, связанности

    Подскажите, какой проект начать писать (гостевая, блог), или может начать изучать фреймворк.


    Фреймворки универсальны, а значит чистого ООП там быть не может. Во всяком случае нет ни одного фреймворка на котором стоит учиться ООП.

    Есть хорошие упражнения на развитие понимания объектно-ориентированного проектирования. Например вот: https://habrahabr.ru/post/206802/

    Сразу хочу отметить что это крайности. Упражнения же. Они должны ограничивать вас что бы заставлять думать и задавать правильные вопросы.

    Или может подскажите книгу/сайт где пошагово в ооп написан какой-то проект, чтобы быстрее пришло понимание.


    Так вы научитесь делать один конкретный проект а на втором вы уже проиграете. Так дела не делаются. Надо разобраться с причинами появления идеи ООП. Ну то есть что было до. Можно еще с функциональным программированием попробовать разобраться. В PHP оно слабо применимо, но основные идеи очень тесно переплетаются с ООП и познав немного функциональщины ваше ООП будет лучше. Да и если про ООП вы можете найти много булшита, про функциональщину врут мало.
    Ответ написан
    3 комментария
  • Какой мне выбрать CMS для интернет магазина с расширенным меню?

    Kublyakov
    @Kublyakov
    Сайт, который вы приводите в пример работает на https://www.webasyst.ru/
    То есть на webasyst точно можно реализовать нужное вам меню.
    Но советую подумать, стоит ли ради этого переезжать на другой движок.
    Неужели в woocommerce ничего нельзя придумать? Вы пробовали обращаться за консультациями к специалистам по woocommerce?
    Если вам один человек сказал, что такое нельзя реализовать на woocommerce, попробуйте проконсультироваться с другими специалистами, может они другого мнения.
    Это выйдет точно дешевле, чем перевозить магазин на новый движок ради меню.
    Ответ написан
    1 комментарий
  • Как правильно интегрировать верстку?

    Первый способ лучше. Верстать, перемежая все это ковырянием в файлах шаблонов \ админке - занятие не из приятных. Постоянно приходится отвлекаться - то подключить что-то в админке, чтобы посмотреть, как работает новый блок, то еще что-то... а когда фронтенд полностью готов, остается только скопировать код и распихать по шаблонам (поменяв, в случае необходимости, классы). Двойной работы никакой нет.

    P.S. К тому же, если использовать jade \ slim при разработке, второй способ может стать серьезным препятствием.
    Ответ написан
    Комментировать
  • Как правильно интегрировать верстку?

    thewind
    @thewind
    php программист, front / backend developer
    Я всегда делаю полную верстку сначала, с адаптивностью (если требуется).
    При этом сразу применяю какие-то вещи, с которыми будет удобно работать в дальнейшем при интеграции (если знаю, на какую систему надо интегрировать).
    Потом, в ходе интеграции уже не отвлекаюсь на стили, а занимаюсь только backend / front JS.
    Ответ написан
    Комментировать
  • Как поменять ключи массиву?

    abler98
    @abler98
    Software Engineer
    $array = array_values($array);
    Ответ написан
    Комментировать
  • На чем писать фронтенд легко и непринужденно?

    Freika
    @Freika
    Senior Ruby on Rails developer
    Легко и непринужденно делегировать фронтендеру :)
    Ответ написан
    Комментировать
  • Как реализовать передвижение блока слева направо при прокрутке страницы вниз?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Это делается примерно так на jQuery: https://jsfiddle.net/IonDen/v8ubpuee/
    <div class="paravozik">
        Choo-choo
    </div>

    .paravozik {
        position: fixed;
        bottom: 0; left: 0;
        width: 100px;
        height: 50px;
        background: #000;
    }

    var $win = $(window),
        $paravozik = $(".paravozik"),
        top = 0,
        height = $(document.body).innerHeight(),
        vpHeight = 0,
        percent = 0;
        
    $win.on("scroll", function () {
        top = $win.scrollTop();
        vpHeight = $win.innerHeight();
        percent = top / (height - vpHeight) * 100;
        $paravozik[0].style.left = percent + "%";
    });
    Ответ написан
    5 комментариев
  • Как поступить с заказчиком на upwork.com?

    @Zakaz_zakaz
    Нужно плавно объяснять, что этого не было в ТЗ и вызывает у тебя дискомфорт. Вежливо попроси объяснить, почему предыдущий код не был принят и из-за чего ты должен делать по новому. Это потребует ресурсов и времени, поэтому попроси о увеличении бюджета.
    Ответ написан
    4 комментария
  • Как нужно делать рассылку со своего сайта (сервера)?

    @xtreme
    Снимаю порчу по SSH :)
    1. Изучить рекомендации по рассылкам у крупных почтовых сервисов (Google, Yandex, Mail.ru). При подготовке писем для рассылки строго следовать их рекомендациям.
    2. Зарегистрироваться в postmaster.yandex.ru, postmaster.mail.ru, чтобы следить за ходом рассылки писем.
    3. Отлавливать недоставленные письма, убирать их из листов рассылки, дабы не мусорить.
    4. Сделать механизм отписки от рассылки (это один из критериев пункта 1), причем 100% работающий в один клик.
    5. Мониторить нажатие кнопки "Спам" в вышеуказанных почтовых сервисах, также сразу исключать их из будущих рассылок.

    1к подписчиков - это мелочь. Можешь пробовать отсылать сразу все письма на свой почтовый релей (для 1к хватит и одного релея), даже почти дефолтно настроенный MTA будет рассылать с нужными интервалами.

    Обязательное условие - соблюдать все почтовые правила и не пренебрегать цифровыми подписями - SPF, DKIM, DMARC, правильные записи в DNS (A, MX, PTR).
    Ответ написан
    10 комментариев
  • Как сделать MySQL запрос с выборка сразу по двум значениям?

    postrg
    @postrg
    админ, voip
    Я не силён, но у меня получилось следующим образом.
    SELECT f.id_a
    FROM test AS f
      JOIN test AS s ON f.id_a = s.id_a
    WHERE f.id_b = 2 AND s.id_b = 3;

    Боюсь только к большому объёму данных сложно будет применить подобную конструкцию.
    Ответ написан
    Комментировать
  • JQuery AJAX GET Как передать несколько переменных?

    callback
    @callback
    заменить data: "id="+clkid, на data: "id="+clkid+"&static=12345", чтобы передать в static число 12345
    Ответ написан
    Комментировать
  • JQuery AJAX GET Как передать несколько переменных?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    data: {
        id: clkid,
        static: "something"
    },
    Ответ написан
    Комментировать
  • Насколько уникален ID сессии?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    хочешь ужасов?

    habrahabr.ru/post/137316
    поэтому обычно генерят с рендомной солью, например

    ну и всякие UUID все это давно предусмотрели
    Ответ написан
    Комментировать