• Какое направление/сферу выбрать?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Самым главным критерием для вас должно быть то, что вам самому нравится, а не мнение незнакомцев из интернета. Так как с этим придётся проводить ооочень много времени. Даже в том, что действительно нравится можно перегореть, а в ином - так и подавно.
    Ответ написан
    Комментировать
  • Как создать свои ошибки в JS?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    function isNum(num) {
        if (typeof num.x !== 'number' || typeof num.y !== 'number' ) {
            throw  new Error('point is not a number ');
        }
        console.log('isnm');
    }
    
    let exampleNum = new Point(1,1);
    
    try {
        isNum(exampleNum);
    } catch(e) {
        console.error(e);
    }


    А вообще это говно-код. Рассказать почему? Код должен быть само-документируемым. Функция по объявлению принимает число, но постойте-ка, что я вижу: в действительности я должен передавать ей целый объект из экс, игрик, а не число. Я не должен смотреть внутрь isNum, чтобы понять, что в неё передавать. Раз она названа таким образом то она должна проверять: число ли аргумент. Либо переименовать аргумент и задокументировать эту микро-функцию. Но поскольку такая очевидная функция нуждается в документировании, значит с ней что-то не так.
    Ответ написан
  • Array.length performance in js?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Условие цикла проверяется каждую итерацию. Следовательно, если там будет переменная со статическим значением - это будет слегка быстрее. Но такого рода оптимизация является едва ли не лишней. Уверен, у вас будут просадки более серьёзные.
    Ответ написан
    Комментировать
  • Выбор Macbook Pro: под Front-end разработку?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Чем слабее macbook возьмёте, тем лучшим Front-End'ером будете.
    Ответ написан
  • Сбор файлов js, css в gulp?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Да. /somedir/**/*.js - все джейэсы любой вложенности
    /somedir/**/*.* - ваще все любые поддиректории с любыми файлами
    Ответ написан
    Комментировать
  • Какие есть иностранные сайты что бы работать тестировщиком?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Вот самое глупое, что можно делать на вашем месте - это спрашивать кого-то в интернете. Особенно вебо-ненавистников. Берите и делайте. Изучайте, исследуйте. Что-нибудь. Лёгких денег нет(в общем случае). Тестирование ПО подразумевает некоторое знание языка программирования. Когда в некоторой степени освоите ЯП, вам не захочется идти писать тестики.
    Ответ написан
    Комментировать
  • Как динамически подгружать код html+js и заставить его работать?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    При подгрузки

    Ну как так то?

    На успешный коллбек подгрузки страницы нужно вызвать код, который заставит нерабочее работать. Элементы, которые требуют инициализации некоторых скриптов по-другому не заставишь работать. Если бы дело касалось событий, то можно было бы применить делегирование.
    Ответ написан
    3 комментария
  • Не срабатывает функция JavaScript?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    document.getElementByID("btn").onclick = click; // ссылка на функцию, а не вызов
    Ответ написан
  • Как правильно распределить меню и его подпункты выводом из базы?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    id 2 - Свинина (Пункт)
    parent_id 2 - Живойвес (Подпункт)
    parent_id 3 - Мелковес (Подпункт 3-го уровня)

    Не уверен, что это правильно. Вернее уверен, что ты неправильно это понимаешь: parent_id 2 это подпункт для меню итема с id 2, а не второго уровня(в данном случае он второго уровня, но это просто совпадение). parent_id 3 это подпункт для меню итема с id 3, а не третьего уровня. У тебя же там не будет меню вложенностью в 16 пунктов, верно?)

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

    Update. Держи:

    let ul = '<ul>';
    
    for (let i = 0; i < arr.length; i++) {
      let item = arr[i];
      ul += '<li>' + item.title + '</li>';
      
      for (let j = 0; j < item.children.length; j++) {
        let child = item.children[j];
        if (j === 0) {
          ul += '<ul>';
        }
        ul += '<li>' + child.title + '</li>';
        
        
        if (child.children) {
          for (let k = 0; k < child.children.length; k++) {
            let child2 = child.children[k];
            if (k === 0) {
              ul += '<ul>';
            }
            ul += '<li>' + child2.title + '</li>';
            
            
            if (child2.children) {
              for (let n = 0; n < child2.children.length; n++) {
                let child3 = child2.children[n];
                if (n === 0) {
                  ul += '<ul>';
                }
                ul += '<li>' + child3.title + '</li>';
    
                if (n === child2.children.length - 1) {
                  ul += '</ul>';
                }
              }
            }
          
    
            if (k === child.children.length - 1) {
              ul += '</ul>';
            }
          }
        }
           
        
        if (j === item.children.length - 1) {
          ul += '</ul>';
        }
      }
      
    }
    ul += '</ul>';
    document.body.innerHTML = ul;


    Проверяй уже сам, всё ли правильно.

    Ответ написан
  • Прелоадер на выполнение скрипта?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    1. Нажимаешь поиск
    2. Включаешь прелоадер
    3. Ждёшь ответа, как соловей лета
    4. По пришествию хорошего/плохого ответа, выключаешь прелоадер
    5. Странно, что это нужно объяснять.
    Ответ написан
    1 комментарий
  • Как поставить ограничение на данный позицию X?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Конечно можно.

    $(document.body).on("mousemove", function(event) {
          if ($dragging) {
              var left = $('#panor-move').css('left')
              left = parseFloat(left);
              var leftPos = event.pageX > 370 ? 370 : event.pageX < 10 ? 10 : event.pageX;
              $dragging.offset({
                  left: leftPos
              });
              
          }
      });
    
    
      $(document.body).on("mousedown", "#panor-move", function (event) {
          $dragging = $(event.target);
      });
    
      $(document.body).on("mouseup", function (event) {
          $dragging = null;
      });
    Ответ написан
    2 комментария
  • Профессионально ли отказывать клиентам дорабатывать чужие проекты?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Ну скажет один: "Профессионально", другой: "Не профессионально". Почему это должно оказывать влияние на вашу точку зрения?
    Если у вас нет собственной точки зрения, копать нужно глубже.
    Ответ написан
    3 комментария
  • Как убрать белое пространство в англ. версии сайта?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Тэги где-то криво закрыты.
    И, очевидно, что как раз таки на английской версии у вас, как должно быть, а русская свёрстана неправильно.

    EN:
    5dd9f87224466165021546.png

    RU:
    5dd9f8816a6dd448399907.png
    Ответ написан
    Комментировать
  • Вернуть программу в исходное состояние методом reset?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    .reset() сбрасывает форму, поскольку у вас не форма, то незачем и пытаться его прикрутить.
    Отметил + изменения. Я не стал их впихивать в метод, сами воткнёте куда надо.

    'use strict';
    let start = document.getElementById('start'), 
        cancel = document.getElementById('cancel'),
        btnPlus = document.getElementsByTagName('button'), 
        incomePlus = btnPlus[0],
        expensesPlus = btnPlus[1], 
        depositCheck = document.querySelector('#deposit-check'), 
        additionalIncomeItem = document.querySelectorAll('.additional_income-item'), 
        budgetDayValue = document.getElementsByClassName('budget_day-value')[0],
        budgetMonthValue = document.getElementsByClassName('budget_month-value')[0],
        expensesMonthValue = document.getElementsByClassName('expenses_month-value')[0],
        accumulatedMonthValue = document.getElementsByClassName('accumulated_month-value')[0],
        additionalIncomeValue = document.getElementsByClassName('additional_income-value')[0],
        additionalExpensesValue = document.getElementsByClassName('additional_expenses-value')[0],
        incomePeriodValue = document.getElementsByClassName('income_period-value')[0],
        targetMonthValue = document.getElementsByClassName('target_month-value')[0],
        salaryAmount = document.querySelector('.salary-amount'),
        incomeTitle = document.querySelector('.income-title'),
        expensesTitle = document.querySelector('.expenses-title'),
        expensesItems = document.querySelectorAll('.expenses-items'),
        additionalExpenses = document.querySelector('.additional_expenses'),
        additionalExpensesItem = document.querySelector('.additional_expenses-item'),
        periodSelect = document.querySelector('.period-select'),
        periodAmount = document.querySelector('.period-amount'),
        targetAmount = document.querySelector('.target-amount'),
        incomeItems = document.querySelectorAll('.income-items'),
        main = document.querySelector('.main'); // +
             
    
    let appData = {
        budget: 0,
        budgetDay: 0,
        budgetMonth: 0,
        income: {},
        incomeMonth: 0,
        addIncome: [],
        expenses: {},
        expensesMonth: 0,
        addExpenses: [],
        deposit: false,
        persentDeposit: 0,
        momeyDeposit: 0,
        start: function(){
    
            appData.budget = +salaryAmount.value;
            
            appData.getExpenses();
            appData.getIncome();
            appData.getExpensesMonth();
            appData.getIncomeMonth();
            appData.getAddExpenses();
            appData.getAddIncome();
            appData.getBudget();
            appData.changeRange();
            appData.blocking();
    
            appData.showResult();
    
            
    
        },
        activBtn: function() {
            if (salaryAmount.value !== '') {
                start.removeAttribute('disabled');
                //start.disablede('disabled');
            }
          },
    
       
    
        showResult:function(){
            budgetMonthValue.value = appData.budgetMonth;
            budgetDayValue.value = Math.ceil(appData.budgetDay);
            expensesMonthValue.value = appData.expensesMonth;
            additionalExpensesValue.value = appData.addExpenses.join(', ');
            additionalIncomeValue.value = appData.addIncome.join(', ');
            targetMonthValue.value = Math.ceil(appData.getTargetMonth()); //округление в большую сторону
            periodSelect.addEventListener('change', function(){
                incomePeriodValue.value = appData.calcPeriod();
            });
    
        }, 
    
        blocking: function(){
            document.querySelectorAll('input[type=text]').forEach(function(item){
                item.disabled = true;
            });
            start.style.display = 'none';
            cancel.style.display = 'block';
        },
    
        addExpensesBlock: function(){
            let cloneExpensesItem = expensesItems[0].cloneNode(true);
            expensesItems[0].parentNode.insertBefore(cloneExpensesItem, expensesPlus);
            expensesItems = document.querySelectorAll('.expenses-items');
            if(expensesItems.length === 3){
                expensesPlus.style.display = 'none';
            }
        },
        addIncomeBlock: function(){
            let cloneIncomeItem = incomeItems[0].cloneNode(true);
            incomeItems[0].parentNode.insertBefore(cloneIncomeItem, incomePlus);
            incomeItems = document.querySelectorAll('.income-items');
            if(incomeItems.length === 3){
                incomePlus.style.display = 'none';
            }
        },
        getExpenses: function(){
            expensesItems.forEach(function(item){
                let itemExpenses = item.querySelector('.expenses-title').value;
                let cachExpenses = item.querySelector('.expenses-amount').value;
                if(itemExpenses !== '' && cachExpenses !== ''){
                    appData.expenses[itemExpenses] = cachExpenses;
                }
            });
        },
        getIncome: function(){
            incomeItems.forEach(function(item){
                let itemIncome = item.querySelector('.income-title').value;
                let cachIncome = item.querySelector('.income-amount').value;
                if(itemIncome !== '' && cachIncome !== ''){
                    appData.income[itemIncome] = cachIncome;
                }
            });
    
    
            /*if(confirm('Есть ли у Вас дополнительный источник заработка?')){
                let itemIncome = prompt('Какой?', 'Репетитор');
                let cachIncome = prompt('Сумма дополнительного дохода?', '10000');
                appData.income[itemIncome] = cachIncome;
            }
            for(let key in appData.income){
                appData.incomeMonth += +appData.income[key];
            }*/
        },
        
        changeRange: function(){
            periodAmount.textContent = periodSelect.value;
        },
    
        getAddExpenses: function(){
            let addExpenses = additionalExpensesItem.value.split(',');
            addExpenses.forEach(function(item){
                item = item.trim(); //убирает пробелы в начале и в конце
                if (item !== ''){
                    appData.addExpenses.push(item); 
                }
            });
        },
        getAddIncome: function(){
            additionalIncomeItem.forEach(function(item){
                let itemValue = item.value.trim();
                if (itemValue !== ''){
                    appData.addIncome.push(itemValue);
                }
            });
        },
    
        getExpensesMonth: function(){ //Сумма всех расходов за месяц
            for (let key in appData.expenses){
                appData.expensesMonth += +appData.expenses[key];
            }
        },
        getIncomeMonth: function(){ //Сумма всех расходов за месяц
            for (let key in appData.income){
                appData.incomeMonth += +appData.income[key];
            }
        },
        
        getBudget: function(){
            //Месячный бюджет (доход - сумма расходов)
            appData.budgetMonth = appData.budget + appData.incomeMonth - appData.expensesMonth;  
            //Дневной бюдже (Месячный бюджет разделенный на 30 дней)
            appData.budgetDay = appData.budgetMonth/30; 
        },
    
        getTargetMonth: function(){
            return targetAmount.value / appData.budgetMonth;
        },
        getStatusIncome: function(){
            if (appData.budgetDay >= 800){
                console.log('Высокий уровень дохода');
            } else if(appData.budgetDay < 800 && appData.budgetDay >= 300){
                console.log('Средний уровень дохода');
            } else if(appData.budgetDay < 300 && appData.budgetDay >= 0){
                console.log('Низкий уровень дохода');
            } else {console.log('Что-то пошло не так');
            }
        },
        calcPeriod: function(){
            return appData.budgetMonth * periodSelect.value;
        }
    
    };
    
    salaryAmount.addEventListener('keyup', appData.activBtn);
      
    salaryAmount.addEventListener('keyup', appData.checkLength);
    
    start.addEventListener('click', appData.start);
    
    expensesPlus.addEventListener('click', appData.addExpensesBlock);
    
    incomePlus.addEventListener('click', appData.addIncomeBlock);
    
    periodSelect.addEventListener('change', appData.changeRange);
    
    cancel.onclick = function() { // +
      var inputs = main.querySelectorAll('input');
          for (var i = 0; i < inputs.length; i++) {
            inputs[i].value = '';
          }
    }
    Ответ написан
  • Как заставить проц постоянно работать на turbo boost?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Зачем? От этого он быстрее не станет.
    Ответ написан
    Комментировать
  • Как добавить класс в код js?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    $('.product-layout_one, .product-layout_two').each(function (e) {
    	e +=1;
    	
    	var $productThumb = $(this).find('.product-thumb'),
        	img_url = $productThumb.find('.img-responsive').attr('src'),
            item_name = $productThumb.find('h4 a').text(),
            item_price = $productThumb.find('.price').html(),
            admin = $('#callback [name=admin_email]').val();
    
    
    	$productThumb.find('.button-group').append('<a class="button toclick" href="#pp-item-' + e + '">Заказать звонок</a>');
    	$(this).addClass('col-lg-4 col-md-3 col-sm-6 col-xs-12'); //почему это не изначально в разметке?
    
    });
    Ответ написан
    Комментировать
  • Как отключить все ОСТАЛЬНЫЕ обработчики на элементе js/битрикс?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Чтобы обработчик можно было снять, нужно передавать ссылку на функцию при его установке
    function f(event) {..}
    
    $(document).on('click', f); // установили
    
    $(document).off('click', f); // сняли
    Ответ написан
  • Как сделать на jquery копирование из одного input в другой textarea по нажатию кнопки?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Ну изи же.

    в самые нижние строки поля textarea

    Если мои телепатические способности не подводят.
    document.getElementById('btn').onclick = function() {
        textarea.value += '\n' + input.value; // textarea & input replace to target elements
    }
    Ответ написан
  • Как правильно писать id тоже по БЭМ?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Главное придерживаться н̶е̶к̶о̶т̶о̶р̶о̶г̶о̶ ̶п̶л̶а̶н̶а̶ единого правила. Я использую БЭМ, id пишу в camelCase. Хочешь быть как я, тоже пиши так.

    2 минуты спустя: *посмотрел свой код* У меня своя методология: в камелКейсе я, оказывается, пишу id для всяких submit'ов, в иных случаях id совпадают с классом чаще всего для простоты ориентирования. Не будь как я. Придерживайся единого правила.
    Ответ написан
    Комментировать