Ответы пользователя по тегу JavaScript
  • Как запустить 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, увы, подсказать реализацию не смогу, но уверен, что такие метаморфозы с запоминанием состояний объектов - это в порядке вещей там.
    Ответ написан
    Комментировать