• Как вы разрабатываете сайты в нынешних реалиях?

    Stalker_RED
    @Stalker_RED
    Ненавидят их те, кто не умеет их готовить.
    Это очень круто, если вы умеете выбросить все лишнее из бутстрапа и кастомизировать его.
    И это очень печально, когда для сайта из трех простеньких страничек подключают полтора мегабайта ненужной шелухи. Просто потому, что разработчику лень, а заказчик "не шарит".
    Ответ написан
    2 комментария
  • Почему в значениях инпута нету данных объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    if (elem == "edit") {
        app.UserBook.fullView(elem);

    Понятно, elem - это строка.

    fullView(elem) {
        const d = document;
        const i = elem;
        d.querySelector('#Edname').value = this.items[i].fname;

    И используя эту строку как ключ, вы пытаетесь что-то достать из this.items.

    Из тех самых items, которые вроде бы массив:

    for (let i = 0; i < this.items.length; i++) {


    Как-то странно получается, не находите?
    Ответ написан
    7 комментариев
  • Почему в значениях инпута нету данных объекта?

    rockon404
    @rockon404
    Frontend Developer
    Вы передаете в вызов fullView(elem) аргументом elem либо строку 'edit', либо строку 'rubbish'.
    Естественно в вашем массиве нет таких элементов, поэтому вы и получаете ошибки при попытке обращения к их свойствам:
    this.items.edit.fname;  // Uncaught TypeError: Cannot read property 'fname' of undefined
    this.items.rubbish.fname;  // Uncaught TypeError: Cannot read property 'fname' of undefined
    Ответ написан
    3 комментария
  • Почему JS hook не работает?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Всё работает, просто done надо дёргать по окончании анимации, типа так.

    А вы сейчас вызываете done сразу же - ну элемент и удаляется.
    Ответ написан
    1 комментарий
  • Это вообще люди делают?

    vicodin
    @vicodin
    Имею некоторый опыт
    опыт измеряется не в годах работы ;-)
    Ответ написан
    3 комментария
  • Bullshit Web - чрезмерное загромождение сайтов десятками скриптов и модулей. Можно ли решить эту проблему?

    alexfilus
    @alexfilus
    Senior backend developer
    https://developers.google.com/speed/pagespeed/insi...
    Прогоняете нужную страницу здесь. Во-первых получаете рекомендации, во-вторых сжатые ресурсы, в-третьих пугающие красные цифры для начальства.
    После этого и часть шрифтов оказывается не так уж и нужна, и иконки шрифтовые норм, а не те что дизайнер непонятно где отрыла. И фотки хоть и растрят, но уже не бесят этим начальство)
    Ответ написан
    Комментировать
  • Bullshit Web - чрезмерное загромождение сайтов десятками скриптов и модулей. Можно ли решить эту проблему?

    Разработчики сайтов вовсе не задумываются об оптимизации
    Не увидел по диагонали выборку, поэтому рискну предположить что это не разработчики, а вебмастера, которые обвешивают WordPress кучей bullshit'a.
    Ответ написан
    7 комментариев
  • Bullshit Web - чрезмерное загромождение сайтов десятками скриптов и модулей. Можно ли решить эту проблему?

    snap44
    @snap44
    Фыр!
    5b66f6989b4fa204912050.png
    И так работает большинство "верстальщиков". Зато заказчик 2-3тыщи сэкономил на вёрстке.
    Ответ написан
    Комментировать
  • В какие тэги можно передавать параметры?

    rockon404
    @rockon404
    Frontend Developer
    В какие тэги можно передавать параметры кроме тэга id?

    id это не тег, а атрибут.

    а в class указываю стиль для обработчика

    Не стиль, а класс.

    Бывает такое что нужно передавать больше пораметров, как это сделать?

    Не знаю, что именно вы хотите, но можно использовать data-атрибуты

    Рекомендую найти любой хороший учебник по html/css и изучить от корки до корки.
    Ответ написан
    Комментировать
  • Как на JS узнать deg курсора относительно какой-то условной точки?

    Stalker_RED
    @Stalker_RED
    deg в смысле угол? Угол измеряется между двумя прямыми, а не двумя точками. Нужно как минимум три точки.
    oBPKzx.png
    let rad = Math.atan2(P3.y - P1.y, P3.x - P1.x) -
                Math.atan2(P2.y - P1.y, P2.x - P1.x)
                
    	display.value = rad * (180 / Math.PI)

    jsfiddle.net/72cLse6z
    Ответ написан
    Комментировать
  • Как создать массив из объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const arr = Object.entries(obj).map(([ k, v ]) => ({ id: +k, name: v.nameEn }));
    Ответ написан
    Комментировать
  • Как сделать, что бы кажый раз по клику на инпут, курсор был в начале?

    Dima_So
    @Dima_So
    Experientia est optima magistra
    function setSelectionRange(input, selectionStart, selectionEnd) {
      if (input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
      }
      else if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
      }
    }
     
    function setCaretToPos (input, pos) {
      setSelectionRange(input, pos, pos);
    }
    
    elem.onclick = function() {
    	setCaretToPos(document.getElementById("elem"), 0);
    }


    <input id="elem" type="text" value = "1111111111111111111">
    Ответ написан
    Комментировать
  • Как это сверстать?

    emilov
    @emilov
    Фрилансер
    Если не морочится ты можешь тупо background поставить зеленый фон, а потом уже верстать блоки с надписями и оформлять под дизайн, или же это можно сделать через псевдоэлементы :after :before, с теними тоже самое
    Ответ написан
    Комментировать
  • Как быть с camelCase на фронте и snake_case на бэкенде?

    mazhekin
    @mazhekin
    Frontend, Backend Web Developer
    Если бекендер очень высокого уровня, то есть умеет красиво и оптимально проектировать методы и данные под потребности клиентских app, четко это документировать (swagger) и покрывать тестами свои методы, то обычно таких проблем не возникает.
    В противном случае контролируйте все что приходит с бекенда, сделайте статические мапперы, подстраиваться под бек не вариант, всякие линтеры начнут ругаться, вы начнете запутыватся в плохоименованных переменных, уговаривать бекендеров слать данные в нужном формате то же больше времени потратите, третий вариант сам приемлемый, бекенд часто шлет, не то что в нужном формате а еще много того что не нужно на фронт.
    Например: бекенд шлет (это частая ситуация, так в бд например хранится, а правила кодирования у разных клиентов (web, ios, android) свои, но они могут использовать один и тот же бек)
    {
      ID '2342',
      stu_cfg: 'werwer'
      pfu_num: '1231'
      sys_created: '2000-12-10'
      register_date: '06 Mar 2017 21:22:23 Z'
    }

    бы обозначаете что вам нужно и в каком виде (в тайпскипте например) (или в js комментариями)
    interface SomeEntity {
      id: string,
      status: string,
      created: Date
      registered: Date 
    }


    class MyMapper {
        static someEntityToClient(data): SomeEntity {
            const someEntity: SomeEntity = {
               id = data['ID'],
               status = data['stu_cfg'],
               created = moment(data['sys_created']).toDate
               registered = moment(data['register_date']).toDate 
            }
            return someEntity;
        } 
    }

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

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Весьма существенный момент, который я не нашел в вопросе - упоминание о предыдущем разрабе на сайте осталось после переноса его в cms?

    Почему это так важно.

    Авторские права есть неотделяемые и отделяемые.
    Первые купить-продать нельзя, человек, даже умирая, не лишается этих прав. Это право авторства, право автора на имя, право на защиту от искажений, право на неприкосновенность произведения (ст. 1265 - 1267 ГК РФ).
    Вторые купить и продать можно и нужно - и собственно, все, кто что-то создает - этим и живут :) Самое главное из них - исключительное право на произведение (ст. 1270 ГК РФ), по которому появляется некто, получающий от автора право пользоваться его произведением по договору отчуждения (ст. 1285 ГК РФ), лицензионному договору (ст. 1286 ГК РФ), договору авторского заказа (ст. 1288 ГК РФ), положении о служебном произведении или произведении, созданном по заказу (ст. 1295 - 1296 ГК РФ). Сразу отметим, что произведения, созданные в рамках ст. 1295-1296, сразу переходят в исключительную собственность заказчика (сохраняя при этом естественно неимущественные права за разрабом).

    Так вот, если ТС не отметил, что предыдущий дизайн сайта создан Васей Пупкиным надписью типа "Дизайн сайта by Vasya Pupkin" - то виноват ТС - он нарушает ст. 1265-1266, присваивая себе авторство.
    Если же ТС отметил это, а ниже дописал "перенос на сms by Contora", то права Васи ... все равно нарушены :) но поместить сайт себе в портфолио контора уже имеет право. Но тем не менее на месте Васи я бы не стал орать о нарушении его прав на весь мир.
    Бумажного договора о том, что Вася делал сайт для Заказчика - нет. Следовательно, Васе сначала еще нужно доказать, что он на самом деле автор.
    Если он не доказал - свободен (а как он будет доказывать - это его проблемы, в гражданском процессе каждая сторона должна доказать свою правоту, ссылаясь на обстоятельства, которые она считает существенными).
    Если доказал (а доказать - если попадется грамотный судья - будет несложно - наверняка есть переписка с заказчиком, есть обьяснимые Васей принципы построения проекта...) - то суд усмотрит тут нарушение ст. 1266 ГК РФ - Заказчик обладает исключительным правом на работу Васи в силу ст. 1296 ГК РФ, но эта статья не дает ему право на модификацию работы Васи, если только заказчик и Вася это не оговаривали ранее, да и то, поскольку договор был устный, они легко откажутся от своих слов. А если Контора не упомянула Васю как разработчика - сюда добавится ст. 1265 - и суд вполне может обязать Контору убрать свое лого с сайта.

    Так почему же Васе все-таки стоит не жужжать?

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

    И Вася приплыл... ст. 171 УК РФ (и вот там будет действовать презумпция невиновности. Но Васе это будет слабым утешением - ведь всплывет не один эпизод с заказчиком - а все, что когда-либо Вася делал)

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

    UPD: Требовать удалить сайт из портфолио Вася никаких прав не имеет - Контора выполнила свою работу и теперь имеет на нее свои права в силу тех же ст. 1265 - 1266 ГК РФ. Но он может заявить это в суде - и если суд постановит - придется удалить
    Ответ написан
    4 комментария
  • Прав ли разработчик?

    profesor08
    @profesor08
    Нехорошо размещать чужие работы в своем портфолио без четкий формулировок, разместите логотип и укажите где он используется. Но писать что сайт это ваша разработка, это равносильно выстрелу в ногу. Всплыл один случай, всплывут и другие. Выплывет это на всеобщее обозрение, репутация рухнет.
    Ответ написан
    Комментировать
  • Прав ли разработчик?

    @Interface
    Выше уже отписались о том, что в суде вы скорее всего выиграете. Однако я вижу еще 2 ньанса:
    1) морально-этический, имхо в данном случае просто некрасиво приписывать себе чужую работу. Вы можете указать что делали определенную часть.
    2) репутация. Вы же для чего-то делаете себе портфолио, значит вы хотите предстать в хорошем свете. А вот если ваш потенциальный заказчик захочет про вас узнать побольше - он может наткнуться на этот вопрос. Или на гневный пост того разработчика. И вопрос уже не только в том, что вы будете выглядеть несколько неэтично, но еще и в том что он может задуматься сколько еще проектов у вас в портфолио отмечены как разработка с нуля, а на деле натягивание на CMS.

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

    @abberati
    frontend-разработчик
    function createPlaylist(properties) { /* весь ваш скрипт */ }
    
    let playlist = createPlaylist(someData);
    playlist = createPlaylist(anotherData);


    динамически нужно менять в js, а оттуда изменения подхватывать в вёрстку.
    у всех изменений должен быть один-единственный источник - логика приложения, тогда не будет рассинхрона между разметкой и логикой
    Ответ написан
    4 комментария
  • Как сделать такую сортировку?

    Stalker_RED
    @Stalker_RED
    Для начала алфавит:
    let alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.split('')
    charcode использовать нельзя, потому что в юникоде буква "ё" идет после буквы "я". И это, похоже, навсегда.

    Дальше функция, которая определяет "расстояние" между буквами.
    function getRange(a, b) {
      let iA = alphabet.indexOf(a), iB = alphabet.indexOf(b) // ищем на каких позициях встречаются эти буквы в алфавите
      if (iA === -1 || iB === -1) return Infinity // если вообще не встречаются - расстояние бесконечность.
      return Math.abs(iA - iB)
    }
    
    
    getRange('а', 'р') // -> 17
    getRange('а', 'я') // -> 32
    getRange('к', 'в') // -> 9
    getRange('а', 'f') // -> Infinity  (и никто не мешает добавить английский алфавит)


    На основе этой функции не сложно написать сортировку по расстоянию:
    function getClosestWord(letter) {
      return [...words].sort((word1, word2) => {
      	return getRange(word1[0], letter) - getRange(word2[0], letter)
      })
    }
    
    getClosestWord('а') // ->
    ["аметист", "баржа", "дом", "еж", "креветка", "каток", "кот", "лимон", "море", "морж", "нора", "рога", "рыба", "рак", "сани", "сом", "собака", "том", "танк"]
    
    getClosestWord('п') // ->
    ["рыба", "рак", "рога", "нора", "собака", "сани", "сом", "танк", "море", "том", "морж", "лимон", "каток", "кот", "креветка", "еж", "дом", "баржа", "аметист"]


    Дело за малым - повторять пока не закончатся слова.
    Ответ написан
    Комментировать
  • Как написать условие?

    @hell
    if(e.parentNode.tagName.toLowerCase()==='p'&&(e.nextSibling||e.previousSibling)){}
    или альтернатива
    if(e.parentNode.tagName.toLowerCase()==='p'&&e.parentNode.childNodes.length>1){}
    а чтобы не учитывать текстовые узлы
    if(e.parentNode.tagName.toLowerCase()==='p'&&e.parentNode.children.length>1){} (в старых ие будет включать комментарии)
    Ответ написан
    Комментировать