Задать вопрос
  • Не приходят формы с сайта на почту?

    @alexalexes
    У вас что клиентский, что серверный скрипт не имеют функционала оповещать пользователя о возникшей ошибке.
    php-скрипт должен отдавать хоть малюсенькое текстовое сообщение, что удалось отправить почту.
    ....
    $send_result = mail($admin_email, adopt($form_subject), $message, $headers );
    echo $send_result ? 'success' : 'fail';

    Клиентский скрипт должен иметь возможность в коллбэк функции done словить это сообщение:
    ...
    ).done(function(e)
    {
        var resp = e.responseText;
        alert(resp === 'success' ? 'Сообщение отправлено!' : 'Ошибка отправки сообщения');
    ....
    }

    Для аякса хорошо бы еще добавить функцию fail(), когда серверный скрипт вообще не отвечает.
    $.ajax({
          type: "POST",
          url: "../js/mail.php", //Change
          data: th.serialize()
        }).done(function(e) {
         .......
        }).fail(function()
        {
          alert('Фатальная ошибка отправки!');
        });

    Немного доработав скрипты, и получив некоторые сообщения, можно будет сориентироваться, какого рода ошибка у вас возникла.
    Ответ написан
    Комментировать
  • Как добавить тег в скрипт?

    @alexalexes
    А что мешает плюсануть текст в нужном месте?

    ......('span').html( '<i class="new"></i>' + $('#form-uploa......


    PS: правда для вывода текста в тег использовать не метод text(), а html().
    Ответ написан
  • Как выполнить нужные условия до и после определенной даты JS?

    @alexalexes
    var now = new Date(); // Текущая дата
           var event_date = new Date ("Jul 17 2018 11:30:00 GMT+0300"); // дата события (+ часовой пояс, крайне обязательно)
           var dif_time = now.getTime() - event_date.getTime(); // разность в милисикундах по UTC (время приведено в один часовой пояс, крайне удачно)
           var duration = 60 * 60 * 1000; // время длительности вебинара в милисекундах
           switch(true)
           {
               case dif_time < 0:
                // действия до события
                break;
              case dif_time >= 0 && dif_time < duration:
                // действия во время события до окончания, (dif_time / 1000) - куда перематывать
                break;
              case dif_time >= duration:
                // действия после окончания события
                break;
           }
    Ответ написан
    4 комментария
  • Почему на MacOS криво работает кнопка наверх?

    @alexalexes
    У вас очень тяжелый файл www.annalev.ru/static/bundle/js/bundle.min.js, в котором лежит функция скроллинга, пока он не загрузиться на клиенте полностью, скроллинг не будет работать.
    Решить проблему можно несколькими путями:
    1) Все легковесные функции, которые не зависят от библиотек поместить в отдельный файл, который будет подключаться выше списком, чем тяжеловесные js.
    2) Написать код легковестных функций прямо в документе (или в общем шаблоне страниц, где описывается head или footer, в случае если у вас CMS);
    3) Написать обработчик скроллинга непосредственно в атрибуте onclick.
    PS: Дополнительно, посмотреть, какой функционал можно "выбросить" в подключенных библиотеках.
    Например, на JQuery можно опционально отключать некоторые возможности и скачивать js-файл значительно меньших размеров, чем в полной комплектации.
    Ответ написан
    4 комментария
  • Почему некорректно скачивается pdf в firefox?

    @alexalexes
    Приведенный код напрямую не связан с технологией ajax. Он всего лишь подставляет в элемент с id-шником lp-download-pdf свойства href (по наличию этого свойства можно догадаться, что это элемент-ссылка) и download, затем, принудительно программно запускает событие клика, словно по элементу нажал пользователь.
    Как браузер отреагирует на двойное "роботизированное" нажатие на ссылку с одним и тем же href можно только догадываться. Можно попытаться сделать ссылку при каждом нажатии уникальной.
    Подставьте на этом этапе какой-нибудь рандомный параметр к ссылке:
    .attr('href', string.trim() + "?random_param=" + Math.round(Math.random() * 1000))
    Ответ написан
    Комментировать
  • Почему не срабатывает аякс запрос?

    @alexalexes
    $("#form")
    У вас на странице формы имеют атрибут id="form" или id="form1"?
    Нет.
    А на что будут вешаться обработчики submit в этом случае? Ни на что.
    Решение:
    Для отладки JS-кода в любом непонятном месте, пока вы новичок, проверяйте, что вылавливает JQuery селектор:
    var form_elem = $("#form"); // тут должны словить DOM-объект формы в JQuery обертке
    form_elem.submit(function(.......... // а тут цепляем обработчик.

    Чтобы приведенный выше код поставил обработчики submit, на странице должны существовать элементы с такими атрибутами:
    <form id="form"></from>
    или такой:
    <form id="form1"></from>
    Атрибуты action и method, конечно, должен быть определены.
    Ответ написан
  • Можно ли задать соотношение сторон изображения?

    @alexalexes
    У меня самый колхозный вариант был: создать png картинку с прозрачным цветом с нужным соотношением сторон (и самых гигантских размеров, каким может быть монитор) и поместить ее в виде img в контейнер на самом глубоком z-значении.
    Пропорции контейнера выравнивались по содержимому и одновременно он мог быть любых не фиксированных стилем размеров.
    Ответ написан
    Комментировать
  • Почему параметр функции undefined?

    @alexalexes
    Проследите за тем, что значит this, там где работает функция.
    Контекст this теряется, если функция вызвана обработчиком какого-нибудь события.
    PS: если нужно обратиться с собственному классу, то обычно обращаются либо к глобальному экземпляру объекта, либо делают обвязку функции с помощью передачи this через переменную замыкания.
    Ответ написан
    Комментировать
  • Как избавиться от бага на IOS?

    @alexalexes
    Скорее всего нужен svg формат для гарнитуры шрифта.
    PS: по стопам вопроса Как подключить шрифт для iOS?
    Ответ написан
  • Как убрать белое пространство после футера?

    @alexalexes
    Наведите порядок в этом контейнере, из-за него распирает страницу:
    <div id="container">
    <div id="wb_bs1" style="position:absolute;left:0px;top:616px;width:85px;height:85px;z-index:753;">
    <a id="bs1" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs3" style="position:absolute;left:0px;top:1670px;width:85px;height:85px;z-index:754;">
    <a id="bs3" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs4" style="position:absolute;left:0px;top:2984px;width:85px;height:85px;z-index:755;">
    <a id="bs4" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs6" style="position:absolute;left:3px;top:6143px;width:85px;height:85px;z-index:756;">
    <a id="bs6" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs7" style="position:absolute;left:0px;top:6713px;width:85px;height:85px;z-index:757;">
    <a id="bs7" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs8" style="position:absolute;left:0px;top:7372px;width:85px;height:85px;z-index:758;">
    <a id="bs8" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs9" style="position:absolute;left:0px;top:8586px;width:85px;height:85px;z-index:759;">
    <a id="bs9" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs10" style="position:absolute;left:0px;top:9129px;width:85px;height:85px;z-index: 10000;">
    <a id="bs10" style="visibility:hidden;">&nbsp;</a>
    </div>
    </div>

    PS: Похоже на какой-то костыль, благодаря чему поддерживается необходимая высота страницы.
    Ответ написан
    2 комментария
  • Как переместить ось x, в Chart.js, в точку 0 оси координат x-y?

    @alexalexes
    https://code.tutsplus.com/ru/tutorials/getting-sta...
    Обратите внимание на этот пример:
    var chartOptions = {
      scales: {
        yAxes: [{
          barPercentage: 0.5,
          gridLines: {
            display: false
          }
        }],
        xAxes: [{
          gridLines: {
            zeroLineColor: "black",
            zeroLineWidth: 2
          },
          ticks: {
            min: 0,
            max: 6500,
            stepSize: 1300
          },
          scaleLabel: {
            display: true,
            labelString: "Density in kg/m3"
          }
        }]
      },
      elements: {
        rectangle: {
          borderSkipped: 'left',
        }
      }
    };

    В особенности, на свойства gridLines и ticks у xAxes.
    Прописывая данные свойства у себя в примере и отрегулировав числовые параметры, вы сможете добиться желаемого положения и отображения осей.
    Ответ написан
    4 комментария
  • Как называется такой взлом сайта?

    @alexalexes
    Сайт пережил внедрение вредоносного кода.
    Устранение последствий:
    1) Приостановление работы сайта;
    2) Изучение логов посещений и ошибок сервера, установление точки и время заражения (если возможно);
    3) Сохранение состояния каталогов сайта и дампа БД для изучения;
    4) Восстановление скриптов сайта из изолированного репозитория разработчика;
    5) Восстановление БД сайта из бекапа до времени заражения;
    Устранение причин:
    6) Анализ и исправление прав доступа к FTP-каталогам, пользователей CMS;
    7) Анализ и исправление кода на уязвимость к инъекциям в запросах и шаблонах.
    8) Анализ данных в БД на предмет содержания инъекций в записях таблиц.
    9) Возобновление работы сайта с тщательным мониторингом логов.
    Ответ написан
    1 комментарий
  • Js и Pdf как что и почему?

    @alexalexes
    Если вам нужно сделать таблицу с автозаполнением полей для печати, то в случае веб-реализации вам нужно не начальные, а уверенные знания JavaScript.
    Вот примерно так можно это сделать.
    <html>
      <head>
        <meta http-equiv="Content-Type" content='text/html; charset=utf-8'>
      </head>
      <body>
        <style>
          html, body
          {
            margin: 0;
            padding: 0;
          }
          table
          {
            border-collapse: collapse;
            background-color: #fff;
          }
          table,
          table td,
          table th
          {
            border: 1px solid #333;
          }
        </style>
        <table id="job_briefing">
          <tr><th>Работник</th><th>Должность</th><th>Дата инструктажа</th><th>Инструкция</th><th>Подпись</th></tr>
        </table>
        <script>
          (function()
          {
            var row_count = 30; // количество строк таблицы
            var inctruct_info = '№18 от 01.07.2015'; // номер инструкции, которая будет заполнятся автоматически
            // справочник работников
            var workers =
            [
              {                   
                name: 'Иванов И.А.',
                post: 'Водитель'
              },
              {
                name: 'Петров И.А.',
                post: 'Техник'
              },
              {
                name: 'Сидоров И.А.',
                post: 'Инженер'
              },
            ];
            var job_briefing_table = document.getElementById('job_briefing'); // получаем DOM-элемент со страницы
            for(var i = 0; i < row_count; i++)
              job_briefing_table.appendChild(create_table_row()); // наполняем строками
            
            // функция создания строки
            function create_table_row()
            {
              var tr_elem = document.createElement('tr'); // создаем элемент tr
              var td_elem = document.createElement('td'); // создаем элемент td
              td_elem.appendChild(create_select(workers)); // создаем элемент select и вставялем его в td
              tr_elem.appendChild(td_elem); // вставляем td в tr
              for(var i = 0; i < 4; i++) // создаем и вставляем остальные td
              {
                td_elem = document.createElement('td');
                tr_elem.appendChild(td_elem);
              }
              return tr_elem;
            }
            // функция создания выпадающего списка с работниками
            function create_select(workers /* - список работников*/)
            {
              var select_elem = document.createElement('select'); // содаем элемент select
              var worker_count = workers.length; // определяем кол-во работников в списке
              var option_elem = document.createElement('option'); // создаем элемент option
              option_elem.setAttribute('value', -1); // добавляем в option атрибут value для пустого элемента
              select_elem.appendChild(option_elem); // вставляем option в select
              for(var i = 0; i < worker_count; i++) // перебираем список работников
              {
                var worker = workers[i]; // текущий элемент списка работников
                option_elem = document.createElement('option');
                option_elem.setAttribute('value', i); // добавляем в option атрибут value = порядковый номер работника в списке 
                option_elem.innerHTML = worker.name; // имя работника в option
                select_elem.appendChild(option_elem); // вставляем option в select
              }
              select_elem.onchange = worker_select_onchange; // добавляем обработчик события выбора элемента в выпадающем списке работников
              return select_elem; // возвращаем готовый элемент выпадающего списка
            }
            // обработчик события выбора элемента в выпадающем списке работников
            function worker_select_onchange(e)
            {
              var target = e.target; // получаем то элемент select, на котором произошло событие выбора работника
              var select_value = target.value; // получаем выбранное value - порядковый номер работника
              var tr_elem = target.parentNode.parentNode; // получаем строку, на котором располагается select (второй родительский элемент)
              var td_elems = tr_elem.getElementsByTagName('td'); // получаем все ячейки этой строки
              td_elems[1].innerHTML = select_value == -1 ? '' : workers[select_value].post; // задаем должность для 2-ой ячейки
              td_elems[2].innerHTML = select_value == -1 ? '' : get_current_date(); // задаем текущую дату для 3-ей ячейки
              td_elems[3].innerHTML = select_value == -1 ? '' : inctruct_info; // задаем сведения об инструкции для 4-ой строки
            }
            // функция получения текущей даты по формату DD.MM.YYYY
            function get_current_date()
            {
              var date = new Date();
              var day = date.getDate();
              var month = date.getMonth() + 1;   
              return  (day < 10 ? '0' : '') + day + '.'  + (month < 10 ? '0' : '') + month + '.' + date.getFullYear();
            }
          })();
        </script>
      </body>
    </html>
    Ответ написан
    1 комментарий
  • Как изменить стиль командой строки?

    @alexalexes
    Изменить стиль можно, но очень ограниченно:
    Прав. кнопка мыши по заголовку окна -> свойства.
    Ответ написан
    3 комментария
  • Как удалить нужную запись из БД?

    @alexalexes
    Если заняться изучением основ SQL, то можно понять, что в данной ситуации самым оптимальным решением будет - выполнить запрос с параметром:
    DELETE FROM videos WHERE id = ?
    Естественно, на странице браузера надо обеспечить, чтобы при нажатии кнопки "Удалить" серверу передавался id удаляемой записи, помимо того, какое действие мы хотим совершить.
    Серверный скрипт, также должен принимать не только параметр вида действия (delete), но параметр id, на какую запись необходимо направить действие. Далее, структура SQL-запроса должна иметь в себе возможность подставить параметр.
    PS:
    $ids = R::getAssoc('SELECT id FROM videos');
        $videos = R::find( 'videos', 'id = ?', $ids );

    Самое не оптимальное решение - выгребать все записи из таблицы, а потом на стороне серверного приложения искать ту единственную, которая удовлетворяет условию. Эта медвежья услуга нагружает тракт обмена данных между веб-сервером и СУБД-сервером.
    Ответ написан
    Комментировать
  • Как вывести текстовое содержимое элемента в консоль браузера?

    @alexalexes
    Чтобы получить решение, изучите материал:
    1. Вывод в консоль;
    2. Поиск элементов в документе;
    3. Получение содержимого элемента.
    Ответ написан
    Комментировать
  • Какой оптимальный объем ОЗУ будет оптимален в ноутбуке ASUS X555LB?

    @alexalexes
    Вариант А:
    заменить планку на 8 ГБ той же частоты

    с поправкой: "с пониженным напряжением питания". У вас DDR3L распаяна на матери.
    Почему не Б?
    заменить планку на 16 ГБ той же частоты

    Спецификация на ваш ноут говорит, что 12 Гб - это максимум (4 + 8 опциональных).
    Почему не В?
    заменить планку на 8 ГБ частотой выше

    Тандем из двух планок будет работать на самой минимальной частоте среди максимумов каждой планки, поддерживаемой материнкой.
    PS: Покупая ноуты с распаяной оперативкой, вы теряете возможность заменить планку на первом слоте на планку с макс. параметрами. Так, что от теоретического макс. в 16 Гб на практике останется 12 Гб.
    Ответ написан
  • Стоимость ремонта материнской платы ноутбука?

    @alexalexes
    Сгорела группа входных транзисторов.
    Если только этот компонент вышел из строя, то вам повезло.
    Сдавайте в мастерскую, желательно, конечно, в сервис центр самого производителя.
    Диагностика покажет, каковы масштабы бедствия.
    Ответ написан
  • Как сделать вывод значений из одинаковых полей формы?

    @alexalexes
    Обработчик селекта js который и меняет блоки с помощью display:none, display:block.

    Вариант А. Переписать этот обработчик так, чтобы наверняка удалял неиспользуемый вариант и создавал блок с нужным вариантом полей, тогда у вас в форме не будут лишних полей.
    Вариант A2. Переписать этот обработчик так, чтобы в скрытых блоках имена полей были с префиксами, а не в скрытых префиксы убирались, тогда сервер будет обрабатывать только те поля, у которых нормальные имена (без префиксов).
    Вариант A3. К дополнению к display: none, нужно вырубать поля атрибутом disable.
    Вариант Б. Поля с именами, которые будут обрабатываться на сервере вынести в отдельные поля hidden (на форме будут поля с теме же именами, но с префиксами, чтобы они не пересекались и не брались в учет сервером), и по submit сделать обработчик, чтобы он переносил в них значения по текущему состоянию формы.
    PS: Самый нетрудозатратный для разработчика - вариант А3.
    /* 
      Функция вкл и выкл полей формы в различных контейнерах
      @param str enable_id - id-контейнера, в котором нужно вкл. поля ввода
      @param arr disable_ids - массив id контейнеров, в которых нужно выкл. поля ввода
    */
    function fields_enable_and_disable(enable_id, disable_ids)
    {
      var enable_container = document.getElementById(enable_id); // получаем контейнер, в котором нужно "включить" поля ввода
      var field_types = ['input', 'select', 'textarea']; // все виды полей ввода с которыми нужно проделать манипуляцию вкл/выкл.
      var count_i = field_types.length; // кол-во типов полей
      for(var i = 0; i < count_i; i++) // перебираем типы полей
      {
        var field_type = field_types[i]; // текущий тип поля
        var enable_fields = enable_container.getElementsByTagName(field_type); // получаем коллекцию полей ввода, которые нужно вкл.
        var count_j = enable_fields.length; // кол-во полей текущего типа
        for(var j = 0; j < count_j; j++) // перебираем поля этого типа
          enable_fields[j].disabled = false; // включаем
        var count_k = disable_ids.length; // кол-во контейнеров, в которых нужно выкл. поля
        for(k = 0; k < count_k; k++) // перебираем неактивные контейнеры
        {
          var disable_id = disable_ids[k]; // id - текущего неактивного контейнера
          var disable_container = document.getElementById(disable_id); // получаем неактивный контейнер
          var disable_fields = disable_container.getElementsByTagName(field_type); // получаем поля текущего типа неактивного контейнера
          var count_n = disable_fields.length; // кол-во этих полей по текущ. типу
          for(var n = 0; l < count_n; n++)
            disable_fields[n].disabled = true; // выкл. эти поля
        }
      }
    }
    Ответ написан