• Как сделать валидацию селектора через свой декоративный селект?

    @dmitriu256 Автор вопроса
    Александр, а если через свой алгоритм валидации или так как у меня вообще никто не делает?

    На будущее, если используем чистый javascript - использовать стандартное Api,
    Если использую сторонние фреймворки (Angular) то валидация при помощи реактивных форм, средствами Angular.
  • Как правильно свертстать блок карточек?

    @dmitriu256 Автор вопроса
    hzzzzl Спасибо, это без Bootstrap на обычном flex а если относительно сетки Bootstrap?
  • Как сверстать правильно?

    @dmitriu256 Автор вопроса
    Арсений Матыцин, просто не дополнил верстку данными классами(верстку исправил), я имел ввиду другое
    как убрать margin-bottom у последней колонки на расширениях (col-12)
    Когда карточки идут она под другой занимая все 12 колонок, но у последней остается заданный margin-bottom
    Как пытался решить:
    Вариант 1 (где schema-block лежит в col-12 col-sm-6...)
    .schema-block:last-child{margin-bottom: 0}
    Применяется в окружении колонки col-12 col-sm-6, но не распространяется на все классы .schema-block *(только в рамках одной колонки)- проблема последней колонки остается.

    Вариант 2, когда schema-block (находиться на уровне col-12 col-sm-6...) срабатывает свойство
    .schema-block:last-child{margin-bottom: 0} - успешно срабатывает

    Естественно свойство .schema-block:last-child записываю в медиа запросах media (max-width: 576px)
    Интересует именно как лучше со стороны верстки семантически 1 или 2 вариант карточки.
  • Как сверстать правильно?

    @dmitriu256 Автор вопроса
    iBird Rose, а какой вариант верстки лучше выбрать 1 или 2? Как правильнее?
  • Почему в классе es6 получаю ошибку this.method is not a function?

    @dmitriu256 Автор вопроса
    Спасибо огромное за объяснение!
  • Почему в классе es6 получаю ошибку this.method is not a function?

    @dmitriu256 Автор вопроса
    Максим Зайцев,

    Код проекта
    Выложил участок кода а также версию, до того как стал переводить весь код на классы.
    В таком виде полностью работает, а вот на классах выдает описанные ошибки. Буду благодарен за помощь!
  • Почему в классе es6 получаю ошибку this.method is not a function?

    @dmitriu256 Автор вопроса
    Максим Зайцев, пробовал результат негативный.
    В main.js
    form.elements[i].addEventListener('blur', validation.formValidate);


    В классе в методе formValidate()
    case 'phone':
                    console.log(this); //попадает нужный input
                    check =  this.validatePhone(this);//ошибка
                    break;
  • Почему в классе es6 получаю ошибку this.method is not a function?

    @dmitriu256 Автор вопроса
    Привязал контекст явно к элементам формы form.elements[i]
    form.elements[i].addEventListener('blur', validation.formValidate.bind(form.elements[i]));

    В this получаю
    <input type="tel" class="form__input" id="contacts-phone" name="phone" placeholder="Введите номер телефона" required="required">


    Фрагмент метода validatePhone(val)
    //v1
     case 'phone':
                    console.log(this); //попадает нужный input
                    check =  this.validatePhone.bind(this.value);//ошибка
                    break;
    //v2
     case 'phone':
                    console.log(this);  //попадает нужный input
                    check =  this.validatePhone.bind(this.value); //ошибка
                    break;
    //v3
     case 'phone':
                    console.log(this); //попадает нужный input
                    check =  this.validatePhone(this.value);//ошибка
                    break;


    Все остальные case метода formValidate() отрабатывают отлично (кроме case:phone)
    (//v1-3 что пытался менять) результат не изменился.
  • Как вернуть объект данных из обработчика событий blur во внешнюю функцию?

    @dmitriu256 Автор вопроса
    Kovalsky, Спасибо за комментарий. Исправил ошибки.
    Валидация отдельно
    В поле валидация для телефона использую маску ввода от JQuery
    отправка формы отдельно
    Тк форм на сайте около 5 шт сделал единую функцию обработки (processForm)

    Прошу указать на недочеты в моем коде, на что обратить внимание.
    Как на сегодня лучше делать валидацию?
    1) jQuery Validation Plugin - (считаю не очень актуальным решением, тк все стараются уходить от JQuery)
    2) Использование фреймворков (Angular -- reactive forms) и других
    3) Написать свой велосипед под конкретную задачу
    4) Другой вариант
    Буду благодарен за Ваш ответ.
    Выкладываю полный код
    /*SEND FORMS*/
    
        //Описание состояния AJAX запроса
        let messageBox = document.createElement('div');
        messageBox.classList.add('form__message');
    
        //Статус AJAX запроса
        let message = {
            loading: 'Загрузка...',
            success: 'Спасибо! Скоро мы с вами свяжемся',
            error: 'Что-то пошло не так',
            phone: 'Введите телефон!'
        };
    
        //Подсказка
        let info = document.createElement('div');
        info.classList.add('info');
    
        //Форма
        let mainForm = document.forms.headerForms;
    
        processForm(mainForm);
    
        //Обработка форм (более 5 форм с одинаковой логикой работы)
        function processForm(form) {
    
            //Обход всех элементов формы
            for (let i = 0; i < form.elements.length; i++) {
                form.elements[i].addEventListener('blur', formValidate);
            }
    
            //Показать количество символов в сообщении
            form.elements.textarea.addEventListener('input', textAreaEdit);
    
            //Подсказка количество символов в сообщении
            form.elements.textarea.parentNode.append(info);
    
            //Отправка формы на сервер
            form.addEventListener('submit', sendForm);
        }
    
        //END Обработка форм (более 5 форм с одинаковой логикой работы)
    
        //Отправка формы на сервер AJAX
        function sendForm() {
            event.preventDefault();
    
            this.append(messageBox);
    
            let xhr = new XMLHttpRequest();
            xhr.open('POST', 'http://localhost:3010/clients');
    
            xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
    
            let data = {
                name: this.elements.name.value,
                email: this.elements.email.value,
                phone: this.elements.phone.value,
                message: this.elements.textarea.value
            };
    
            console.log(data);
            xhr.send(JSON.stringify(data));
    
            xhr.addEventListener('readystatechange', function () {
                if (xhr.readyState < 4) {
                    messageBox.textContent = message.loading;
                } else if (xhr.readyState === 4 && xhr.status === 200) {
                    messageBox.textContent = message.success;
                } else {
                    messageBox.textContent = message.error;
                }
            });
    
            //Очищаем поля формы
            clearInputs(this);
        }
    
        //END Отправка формы на сервер AJAX
    
        //Validation Form
        function formValidate() {
    
            let names = this.name;
            let check;
            switch (names) {
                case 'name':
                    check = /^[А-Яа-яЁёA-Za-z]{3,11}$/.test(this.value);
                    break;
    
                case 'email':
                    check = /^[a-zA-Z._-]+\d*@[a-z]+?\.[a-z]{2,3}$/.test(this.value);
                    break;
    
                case 'phone':
                    check = validatePhone(this.value);
                    break;
    
                //Необязательное поле, может оставаться пустым
                case 'textarea':
                    check = true;
                    break;
    
                default:
                    check = false;
            }
    
            //Проверка валидации
            if (check) {
                console.log('Ура вы прошли проверку');
                this.style.border = '2px solid green';
    
            } else {
                console.log('Что то пошло не так!');
                this.style.border = '2px solid red';
                this.value = '';
            }
        }
    
        //END Validation Form
    
        //Очищаем поля формы
        function clearInputs(form) {
            for(let i = 0; i < form.elements.length; i++) {
                form.elements[i].value = '';
                form.elements[i].style.border = '1px solid #dddddd';
            }
        }
        //END Очищаем поля формы
    
        //TextAreaEdit
        function textAreaEdit() {
            //Количество символов в textarea
            let num = 50;
            if (this.value.length <= num) {
                this.maxLength = num;
                console.log(this.value);
                console.log(this.value.length);
                console.log(`Осталось символов ${num - this.value.length}`);
    
                info.innerText = `Осталось символов ${num - this.value.length}`;
            }
        }
    
        //END TextAreaEdit
    
        //Phone Validation
        function validatePhone(val) {
    
            let massCode = [67, 96, 97, 98, 50, 66, 95, 99, 63, 73, 93, 91, 92, 94];
    
            let resCode = massCode.map(function (i) {
                return '0' + i;
            });
    
            let str = resCode.join('|');
    
            let reg = new RegExp("/\\+38\\(" + str + "\\)\\-(\d{3})\\-(\d{2})\\-(\d{2})/");
    
            if (reg.test(val)) {
                return true;
            } else {
                return false;
            }
        }
    
        //END Phone Validation
    
        /*END SEND FORMS*/
  • Как правильно выровнять блоки по высоте в Bootstrap, правильная ли реализация?

    @dmitriu256 Автор вопроса
    Андрей Гуртовой, в теме было описано схематически.
    А вот то что сверстал для реального проекта
    Выравнивание колонок по высоте
    1) С использованием встроенного класса от бутстрапа d-flex (применяю именно ко всей колонке)

    <div class="row">
                <div class="col-12 col-lg-3 d-flex">
                    <div class="schema-block">
                        <div class="schema-block__img">
                            <img src="img/schema/order.png" alt="Заявка">
                        </div>
    
                        <h3 class="schema-block__title">Заявка</h3>
    
                        <p class="schema-block__descr">
                            Оставляете онлайн заявку или звоните +7 495 771 05 08
                        </p>
                    </div>
                    <!-- /.schema-block -->
                </div>
                <!-- /.col-3 -->
    
                <div class="col-12 col-lg-3 offset-lg-1 d-flex">
                    <div class="schema-block">
                        <div class="schema-block__img">
                            <img src="img/schema/delivery.png" alt="Выезд специалиста">
                        </div>
    
                        <h3 class="schema-block__title">Выезд специалиста</h3>
    
                        <p class="schema-block__descr">
                            В течение 1 рабочего дня к Вам приезжает специалист, который выполнит замеры для точной стоимости работ
                        </p>
                    </div>
                    <!-- /.schema-block -->
                </div>
                <!-- /.col-3 -->
    
                <div class="col-12 col-lg-3 offset-lg-1 d-flex">
                    <div class="schema-block">
                        <div class="schema-block__img">
                            <img src="img/schema/agreem.png" alt="Составление договора">
                        </div>
    
                        <h3 class="schema-block__title">Составление договора</h3>
    
                        <p class="schema-block__descr">
                            Готовим договор и согласовываем с Вами
                        </p>
                    </div>
                    <!-- /.schema-block -->
                </div>
                <!-- /.col-3 -->
    
                <div class="col-12 col-lg-3 d-flex">
                    <div class="schema-block">
                        <div class="schema-block__img">
                            <img src="img/schema/startwork.png" alt="Начало работ">
                        </div>
    
                        <h3 class="schema-block__title">Начало работ</h3>
    
                        <p class="schema-block__descr">
                            Доставляем материалы, оборудование, подписываем договор и начинаем работы
                        </p>
                    </div>
                    <!-- /.schema-block -->
                </div>
                <!-- /.col-3 -->
    
                <div class="col-12 col-lg-3 offset-lg-1 d-flex">
                    <div class="schema-block">
                        <div class="schema-block__img">
                            <img src="img/schema/finish.png" alt="Завершение работ">
                        </div>
    
                        <h3 class="schema-block__title">Завершение работ</h3>
    
                        <p class="schema-block__descr">
                            После окончания работ Вы проверяете качество и подписываете акт сдачи, производите оплату.
                        </p>
                    </div>
                    <!-- /.schema-block -->
                </div>
                <!-- /.col-3 -->
            </div>

    Стили
    .schema
      background: #ffffff
      &-subtitle
        margin-bottom: 50px
    
      &-block
        display: flex
        flex-direction: column
        color: $text-color
        margin-bottom: 30px
        text-align: left
        border: 1px solid red
        &__img
          margin-bottom: 25px
          max-width: 146px
          height: 105px
        &__title
          margin-bottom: 25px
          font-size: 19px
          font-weight: 700
        &__descr
          font-size: 17px

    5e53ec1d68cd6613223643.png

    2) Без класса d-flex имею следующую картину
    5e53ec82a4757137833353.png

    Как правильнее?
    Я склоняюсь к первому варианту.
    Упс. Ошибочка. Избавляться нужно от div.block и от p

    И еще один вопрос насколько семантически правильно заверстал данный блок
    Буду благодарен за Ваш ответ
  • Как правильно выровнять блоки по высоте в Bootstrap, правильная ли реализация?

    @dmitriu256 Автор вопроса
    Anton Litvinenko, необходимо чтобы содержимое колонки (в данном случае содержимое .block)
    было одной высоты.
    Скрин (без класса .d-flex у колонок .col-4)
    5e526a94049cf944039365.png
  • Как динамически скрывать элементы списка js?

    @dmitriu256 Автор вопроса
    Спасибо! Действительно намного проще.
    Сам придумал такую реализацию
    function clerarList(){
        let list = document.querySelectorAll('#list li');
        list.forEach(function (elem) {
            elem.remove();
        });
    }
  • Как передать ключ авторизации в get запросе?

    @dmitriu256 Автор вопроса
    Спасибо большое! Совсем не заметил данный параметр. Это решило мою проблему.
  • Как обойти cors ограничение ajax method POST?

    @dmitriu256 Автор вопроса
    Спасибо за наводку, задание решил.
  • Как обратиться к высоте родительского компонента?

    @dmitriu256 Автор вопроса
    если main задать position:relative, а вложенному контенту абсолют, тогда выпадение из потока при переполнении
  • Как отослать несколько запросов к БД MySql в одном get-запросе?

    @dmitriu256 Автор вопроса
    Спасибо за замечания!
    Категории остаются не изменяемые, а вот рейтинг в дальнейшем будет изменяться.
    (Изначально новости публикуются с рейтингом = 1), аналог "лайков" в соц сетях , далее хочу осуществить фильтр по рейтингу, максимальный вверх списка, минимальный вниз. По этому и разделил на две таблицы.
    По поводу importants - аналог "важная новость" и ответ да(id=1) - нет(id=2).
    Совершенно с Вами согласен некорректно использовать таблицу с двумя значениями да/нет.
    Пересмотрел замену бессмысленной таблицы на использование столбца типа tinyInt(размер = 1) в таблице Articles.
  • Дублирование записей, ограничение по вторичному ключу Как избавиться?

    @dmitriu256 Автор вопроса
    Спасибо за объяснение, а как у вас отображается подобное связывание,
    в ваших проектах? Постараюсь выложить полноценную базу, интересно ваше мнение.
  • Как вставить переменную js в sql запрос?

    @dmitriu256 Автор вопроса
    Не запятая, а AND, все так просто. Спасибо большое!
  • Как реализовать новости через вертикальный слайдер?

    @dmitriu256 Автор вопроса
    Макет взял от HTML академии и пытаюсь реализовать через Bootstrap.
  • Как реализовать новости через вертикальный слайдер?

    @dmitriu256 Автор вопроса
    Карусель только на мобильном, насколько верно мое решение? Немного не там написал ответ.