Ответы пользователя по тегу JavaScript
  • Динамическое добавление ссылок на js скрипты в заголовок?

    @alexalexes
    Хватит и нативной составляющей, чтобы в документ добавить любой head.
    А вообще, смотрите скрипты счетчиков Яндекс или Гугл -метрики, там есть более компактные трюки с модификацией head.
    (function()
    {
      var src = 'https://cdn.jsdelivr.net/npm/suggestions-jquery@17.12.0/dist/css/suggestions.min.css';
      var link = document.createElement('link');
      link.setAttribute('src', src);
      link.setAttribute('type', 'text/css');
      link.setAttribute('rel', 'stylesheet');
     document.head.appendChild(link);
    
      src = 'https://cdn.jsdelivr.net/npm/suggestions-jquery@17.12.0/dist/js/jquery.suggestions.min.js';
      var scrt = document.createElement('script');
       scrt.setAttribute('src', src);
      document.head.appendChild(scrt);
    }
    )();
    Ответ написан
    Комментировать
  • Javascript. Как вернуть несколько значений через запятую?

    @alexalexes
    scheduler.attachEvent("onEventSave",function(id,ev,is_new)
    {    
      var checked_users = ev.username.split(','); // переводим строку в список отмеченных id пользователей
      var new_text = ''; // сюда будем писать строку с именами пользователей
      var checked_users_count = checked_users.length; // кол-во отмеченных пользователей
      for (var i = 0; i < checked_users_count; i++)
      {
        var check_user_id = checked_users[i]; // текущий отмеченный id
        var ch_users = users.filter(usr => usr.key == check_user_id); // получаем человека из списка users по отмеченному id (на выходе тоже список, но не более 1 элемента)
        if (ch_users.length > 0)
          new_text += (new_text != '' ? ', ' : '') + ch_users[0].label; // вписываем в строку найденного пользователя
      }
      ev.text = new_text == '' ? 'Nobody' : new_text; // если никого не нашли, то как-то обозначаем эту ситуацию (Nobody)
      return true;
    })
    Ответ написан
    Комментировать
  • Как безопасно загрузить изображение на сервер?

    @alexalexes
    На стороне PHP пропустить полученный файл через GD библиотеку.
    При необходимости, уменьшить качество выходного файла, и попутно сгенерировать preview, отправив его обратно клиентку (+ подтвердив получение сервером).
    Учтите, придется увеличить доступный объем оперативной памяти для одного процесса PHP.
    На моем опыте, чтобы GD проглотила 16 Мпикс картинку, нужно 128 Мб ОЗУ.
    Перед скармливаем GD взвешиваем картинку с помощью getimagesize().
    Если это не сделать, и с превышением лимита отдать на обработку библиотеке, то скрипт тихо-мирно заглохнет, не сообщив клиенту ничего, а так можно сгенерировать сообщение, что файл большой.
    Ответ написан
  • Как сделать, чтобы все нечекнутые и чекнутые чекбоксы отправлялись на бэк?

    @alexalexes
    Сталкивался с такой особенностью, решал как раз через дополнительное поле hidden:
    <label>
    <input type="hidden" id="field_0_1" name ="param_list[0][field_1]" value="off"/>
    <input type="checkbox" onchange="set_hidden_checkbox(this, 'field_0_1')"/>
    </label>

    function set_hidden_checkbox(target, id)
    {
      var hidden = document.getElementById(id);
      if(hidden !== undefined)
         hidden.value = target.checked ? 'on' : 'off';
    }

    Атрибут value в hidden нужно инициализировать значением по умолчанию.
    Ответ написан
    Комментировать
  • Как сделать вывод на JS?

    @alexalexes
    Вот вам в div.
    В input-е используется свойство value для отображения значения.
    А div надо набивать содержимым.
    Вот и вся разница.
    Пример элемента вывода:
    <div id="i4"></div>
    Код вывода:
    document.getElementById('i4').innerHTML = Number(n1)*0.5;
    Ответ написан
    Комментировать
  • Почему возникает "неровная прокрутка"?

    @alexalexes
    Анимация прокрутки происходит всегда за фиксированное время (сейчас 500 мс).
    Если top получается 100 пикселей, то промотка будет казаться медленней, а если 1000 пикселей - то быстро.
    А нужно сделать так, чтобы время анимации было пропорционально длине "прыжка".
    var anim_speed = 300; // пикселей в секунду
    var anim_time = (top * 1000) / anim_speed; // 1000 - поправка на милисекунды
    //анимируем переход на расстояние 
    $('body,html').animate({scrollTop: top}, anim_time);

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

    @alexalexes
    Измените структуру документа:
    <div class="info_block one">
    <div class="one_1"></div>
     <div class="one_2"></div>
    </div>
    <div class="info_block two">
    <div class="two_1"> </div>
    <div class="two_2"> </div>
     </div>
    <div class="info_block three"> 
    <div class="three_1"> </div>
    <div class="three_2"> </div>
    </div>
    <div class="info_block four">
    <div class="four_1"> </div>
    <div class="four_2"> </div>
     </div>

    Определите стили для инф. блоков.
    По умолчанию, все инф. блоки скрыты, нескрытым может быть блок, имеющий в себе класс active:
    <style>
    div.info_block
    {
      display: none;
    }
    div.info_block.active
    {
      display: block;
    }
    </style>

    Подключаете JQuery:
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>

    Определяете функцию, которая будет устанавливать убирать и устанавливать класс active на инф. блоках.
    <script>
    function display_div(class_name)
    {
      $('div.info_block').removeClass('active');
      $('div.info_block.' + class_name).addClass('active');
    }
    </script>

    Делаете видимым первый блок:
    <script>
    display_div('one');
    </script>

    Вставляете в пункты меню обработчик onclick для вызова функции отображения текущего инф. блока:
    <ul>
      <li onclick="display_div('one')">Первый блок</li>
      <li onclick="display_div('two')">Второй блок</li>
      <li onclick="display_div('three')">Третий блок</li>
      <li onclick="display_div('four')">Четвертый блок</li>
    </ul>
    Ответ написан
    1 комментарий
  • Как заставить срабатывать скрипт js, в самом подгружаемом файле?

    @alexalexes
    Ajax.php - серверный скрипт, он ни в коем образе не подгружается в браузер.
    Он просто отвечает на запросы. Ответ может содержать текст, html, json или любой формат потока данных, определяемый http-заголовком ответа.
    Если ответ приходит в виде текста скрипта, то его можно подключить так:
    var script_elem = document.createElement('script'); // создаем DOM-элемент
    script_elem.innerHTML = 'alert(123456)';                 // помещаем в него код скрипта
    document.body.appendChild(script_elem);               // добавляем в документ
    Ответ написан
  • Как получить индекс массива внутри массива во Vue.js?

    @alexalexes
    Когда перебирать начнешь массив, тогда и получишь индексы.
    https://learn.javascript.ru/array-iteration

    У вас задача на знание голого JavaScript.
    var my_array =
    [
      {
        data: 123
      },
      {
        data: 845
      },
      {
        data: 'dsdsd'
      }
    ];
    
    my_array.forEach(function(item, i, arr)
    {
      switch(i)
      {
        case 0:
          item.operation = item.data * 5;
          break;
        case 1:
          item.operation = item.data * 2;
          break;    
        default:
          item.operation = item.data + 'qwqwqw';
      } 
    });


    PS: Про то, как нужно положить внутрь foreach this, читайте тут.
    Ответ написан
  • Что можно создать на чистом JS без знаний верстки( HTML5/CSS3)?

    @alexalexes
    JS создан как обслуживающий язык программирования для DOM-модели документа HTML.
    Его прямая обязанность манипулировать объектами документа и поддерживать обмен запросами с сервером. Для локальной машины, где он выполняется, среда ограничена, никаких вам доступа к файловой системе, процессам ОС. JS ограничен своей средой выполнения внутри браузера.
    Хотите писать на JS с полноценным окружением, то вам нужно обратиться к node.js. Но это уже backend-разработка.
    Ответ написан
    Комментировать
  • Запись звука JS с микрофона компьютера И телефона в браузере?

    @alexalexes
    Библиотеки используют для этих целей Web Audio API.
    Если только нужно два действия: записать и проиграть, то достаточно изучить вот это руководство, чтобы написать свой велосипед.
    Полной совместимости со смартфонами добиться не получится, где-то браузер - это полноценное медийное приложение, а где-то просто просмотрщик HTML, а медийный функционал доступен только через сторонние приложения, установленные непосредственно на смартфоне.
    Ответ написан
    Комментировать
  • Как запустить jQuery анимацию (плагин) при доскролле?

    @alexalexes
    Написал общее решение для вашей задачи, когда необходимо обработать доскроллинг.
    Запускайте плагин, когда наступает ситуация "выполнения действия", или выполняйте метод плагина, который перезапускает анимацию.

    <style>
    #div1
    {
      display: block;
      width: 400px;
      height: 1400px;
      background-color: green;
    }
    #div2
    {
      display: block;
      width: 400px;
      height: 400px;
      background-color: red;
    }
    </style>
    <div id="div1">
    </div>
    <div id="div2">
    </div>
    <script>
      //Функция для определения необходимости выполнения действия,
    //связанное с появлением элемента elem_id в видимой части документа
      function SomethingToDoElem(e, elem_id)
      {
        var elem = document.getElementById(elem_id);
        if(elem === null)
          return;
        //определение размера видимой части документа без JQuery
        var opera = (navigator.userAgent.toLowerCase().indexOf('opera') > -1),
        html = document.documentElement,
        body = document.body,
        w = document.compatMode=='CSS1Compat' && !opera ? html.clientWidth : body.clientWidth,
        h = document.compatMode=='CSS1Compat' && !opera ? html.clientHeight : body.clientHeight;
        // если величина прокрутки по вертикали + видимая высота документа
    //превышает расстояние от верха документа до элемента,
        // для которого требуется действие доскроллинга, то выполняем это действие
        if(e.currentTarget.scrollY + h > elem.offsetTop)
        {
          var is_did_something = elem.getAttribute('is_did_something'); // если действие однократного применения,
    //то получаем данные о том, что оно не выполнялось ранее, например, с помощью атрибута тега.
          if(is_did_something === null) // атрибут не создан, значит действия не было
          {
            setTimeout(function(){elem.style.backgroundColor = 'blue'; }, 1000); // выполняем действие
            elem.setAttribute('is_did_something', 1); // записываем, что действие выполнили
    // для проверки однократности его выполнения
          }
        }
      }
      // Ловим события, для которых возможно понадобиться действие доскроллинга
      
      // на загрузку документа, лучше использовать JQuery аналог
      window.onload = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
      
      // на прокрутку документа
      window.onscroll = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
      
    // на изменение размера окна документа, если дизайн резиновый
    // и интересуемый элемент div2 может изменять в этом случае свое положение
    // при ресайзе окна браузера.
     
    
    // !!!: лучше не привязывать через $().on('resize', ...) криво срабатывает вызов,
    // использовать только нативные способы подписки на событие.
      window.onresize = function(e)
      {
        SomethingToDoElem(e, "div2");
      }
    
    // Также нужно вызывать  SomethingToDoElem(e, "div2"); при любом динамическом изменении
    // контента страницы или блока, где этот контент расположен.
    </script>
    Ответ написан
    Комментировать
  • Как создать скрипт для проверки содержимого на изменения и вывода текста?

    @alexalexes
    Там выводятся записи за последние 24 часа.

    И надпись убирается через 24 часа если изменений нет.


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

    Если вам нужно понять, что появилось новое между сеансами просмотра списка (с интервалом менее 24 часа), то вам просто нужно решить задачу (с помощью cookies), как сохранить отметку времени, когда список был просмотрен, и какое действие считать за просмотр списка.
    При повторном выведении списка смотреть дату каждой записи, если запись свежее чем дата предыдущего просмотра, то это new.
    Если нет возможности получать дату записи, то придется как-то идентифицировать каждую запись и хранить флаг "просмотрено". Что не будет иметь флага "просмотрено" при повторном анализе списка, то и будет new.
    Ответ написан
    Комментировать
  • Не добавляется в базу данных?

    @alexalexes
    $query = 'INSERT INTO `users`(`email`, `password`) VALUES ('.$login.', '.$password.')';

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

    Адекватная подстановка параметров происходит только при правильной подготовке запроса функциями
    mysqli_prepare() и mysqli_stmt_bind_param().

    Для получения данных из БД нужна "правильная культура" общения с ней.
    Правильная культура подразумевает:
    1. После попытки подключения нужно проверить, а состоялось ли оно.
    2. Прежде чем выполнить запрос, его текст нужно подготовить prepare-функцией.
    3. Если есть входные параметры, то привязать их к запросу bind-функцией.
    4. Запустить выполнение execute-функцией;
    5. Получить результат запроса fetch-функцией;
    6. Закрыть statement или вовсе закрыть соединение.

    В этих пунктах еще нет шагов работы с транзакциями, но если присутствует вот этот минимум, то вы уже адекватно осуществляете процесс общения с СУБД.

    В ваше случае нужно проверить, а состоялось ли подключение. Иначе нет смысла слать запросы.

    Вот пример, где более-менее верно описан процесс взаимодействия с СУБД (взят с www.php.su/mysqli_stmt_bind_param):

    <?php
    $link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
    
    /* check connection */
    if (!$link) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    $stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
    
    $code = 'DEU';
    $language = 'Bavarian';
    $official = "F";
    $percent = 11.2;
    
    /* execute prepared statement */
    mysqi_stmt_execute($stmt);
    
    printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));
    
    /* close statement and connection */
    mysqli_stmt_close($stmt);
    
    /* Clean up table CountryLanguage */
    mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
    printf("%d Row deleted.\n", mysqli_affected_rows($link));
    
    /* close connection */
    mysqli_close($link);
    ?>
    Ответ написан
  • Как сделать чтобы при повторном нажатии элемент переворачивался?

    @alexalexes
    Как вариант, с помощью JS добавляете обработчик событий onmouseout и touchend, который меняет класс у элемента div с классом flipper. Попеременно, когда мышь покидает блок или касание прекращается, его состояние изменять с class="flipper right-rotate" на "flipper left-rotate" и обратно.
    Соответственно, вращения будут обозначены двумя различными правилами, под каждое состояние "триггера":
    .flip-container.hover .flipper.right-rotate {}
    .flip-container.hover .flipper.left-rotate {}

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