Ответы пользователя по тегу JavaScript
  • Почему не останавливается таймер?

    Можно так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function(self) {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	self.stop();
          }
        }.bind(null, this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };


    Или так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function() {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	this.stop();
          }
        }.bind(this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };

    Во всех этих интервалах контекстом по умолчанию идет переменная window.
    Ответ написан
    Комментировать
  • Push уведомления на сайте?

    rpe4a
    @rpe4a Автор вопроса
    Вообщем всем спасибо за советы, но ближе всего оказался amf1k. Посмотрев и изучив документацию на
    ASP.NET SignalR у меня криво косо получилось сделать то, что я хочу. Хотел бы описать инструкцию, может кому пригодится:
    1. Вы должны работать на платформе .NET;
    2. Ознакомиться с документацией по ASP.NET Identity
    3. Ознакомиться с документацией по SignalR
    4. Дальше добавляем через Nuget собственно сам SignalR в ваш проект;
    5. Прицепляем его к проекту;
    6. Создаем клиентский скрипт (я вынес его в отдельный файл и сделал ссылку на него на странице):
      $(function () {
         //определяем наш хаб
          var hub = $.connection.notificationHub;
          //метод хаба на клиенте, который будет вызван у всех подключенных клиентов, когда ему будет дана команда с сервера
          hub.client.sendNotification = function (message) {
              //выводим сообщение подключенным клиентам(в моем случае это будут только админы)
              $("#hubMessageConteiner")
                  .append("<li>" + message + "<i title='Закрыть' class='fa fa-close fa-lg cursor-pointer'></i></li>")
                  .find("li").show(200);
          };
          //создаем подключение к хабу, это метод start, если пользователь смог подключится к хабу, то вызывается функция done, если нет то будет вызываться функция fail
          $.connection.hub.start().done(function () {
              $('#Hub').click(function () {
                  hub.server.send("Это push уведомление");
              });
          });
      });


    7. Создаем на бэкенд собственно наш Hub-class который будет обрабатывать эти уведомления, для хранения информации о подключивщихся к хабу, я использовал подход Хранение в памяти:
      public class NotificationHub:Hub
          {
      //хранилище подключений(тут я храню только администраторов)
              private readonly static ConnectionMapping<string> _connections = new ConnectionMapping<string>();
      
      //сейчас я вызываю этот метод с клиента, но его легко можно и вызвать на сервере, 
      //допустим в каком-нибудь методе контроллера, что я в последствии и собираюсь сделать,
      //потому что мне надо, чтобы при добавлении новости уведомления получал только администратор или модератор
              public void Send(string message)
              {
      
                  var user = Context.User;
      //получаем всех подключенных админов и каждому отправляем уведомление
                  foreach (var connectionId in _connections.GetConnections())
                  {
      //если это сам админ то не надо отправлять
                      if (!user.IsAdmin())
                      {
      //тут мы вызываем метод на клиенте, который и отобразит наше уведомление
                          Clients.Client(connectionId).sendNotification(message);
                      }
                  }
              }
      
              public override Task OnConnected()
              {
      //Хаб имеет доступ к контексту + я использую Identity (ссылку дал выше читайте), следовательно могу получить доступ к информации о подключенном пользователе:
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = Context.User.GetUserId();
      //запихиваем нашего подключенного пользователя если он админ в хранилище подключений, кстати каждому подключившемуся выдается ConnectionId, который можно получить из контекста и да он уникален и выдается каждый раз новый при подключении
                      _connections.Add(userId, Context.ConnectionId);
                  }
                  return base.OnConnected();
              }
      
              public override Task OnDisconnected(bool stopCalled)
              {
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = user.GetUserId();
      //если пользователь(админ) отключился, то убираем его из хранилища
                      _connections.Remove(userId, Context.ConnectionId);
                  }
      
                  return base.OnDisconnected(stopCalled);
              }
      
              public override Task OnReconnected()
              {
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = user.GetUserId();
      
                      if (!_connections.GetConnections(userId).Contains(Context.ConnectionId))
                      {
                          _connections.Add(userId, Context.ConnectionId);
                      }
                  }
      
                  return base.OnReconnected();
              }
          }
      
      //на всякий случай добавлю класс хранилища подключений, но он такой же как в документации
      public class ConnectionMapping<T>
          {
              private readonly Dictionary<T, HashSet<string>> _connections = new Dictionary<T, HashSet<string>>();
      
              public int Count
              {
                  get
                  {
                      return _connections.Count;
                  }
              }
      
              public void Add(T key, string connectionId)
              {
                  lock (_connections)
                  {
                      HashSet<string> connections;
                      if (!_connections.TryGetValue(key, out connections))
                      {
                          connections = new HashSet<string>();
                          _connections.Add(key, connections);
                      }
      
                      lock (connections)
                      {
                          connections.Add(connectionId);
                      }
                  }
              }
      
              public IEnumerable<string> GetConnections(T key)
              {
                  HashSet<string> connections;
                  if (_connections.TryGetValue(key, out connections))
                  {
                      return connections;
                  }
      
                  return Enumerable.Empty<string>();
              }
      //добавил только вот этот метод для получения всех подключивщихся администраторов
              public IEnumerable<string> GetConnections()
              {
                  HashSet<string> connections = new HashSet<string>();
      
                  if (_connections.Any())
                  {
                      foreach (var connection in _connections)
                      {
                          foreach (var connectionId in connection.Value)
                          {
                              connections.Add(connectionId);
                          }
                      }
                  }
      
                  return connections;
              }
      
              public void Remove(T key, string connectionId)
              {
                  lock (_connections)
                  {
                      HashSet<string> connections;
                      if (!_connections.TryGetValue(key, out connections))
                      {
                          return;
                      }
      
                      lock (connections)
                      {
                          connections.Remove(connectionId);
      
                          if (connections.Count == 0)
                          {
                              _connections.Remove(key);
                          }
                      }
                  }
              }
          }


    8. Ну и собственно все. У меня работает, при клике на тестовую кнопку всем админам высылается уведомление. Всем добра и хорошего дня;
    Ответ написан
    Комментировать
  • Как спрятать элемент, при нажатии на другой, с помощью jQuery?

    $("#show_phone").click(function(){
          $('#show_phone_cont').show(function(){
            $('#show_geo_cont').hide();
          });
        });
    
        $("#show_geo").click(function(){
          $('#show_geo_cont').show(function(){
            $('#show_phone_cont').hide(function(){
            });
          });
        });
    Ответ написан