Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.03.2017, 17:05
Новичок на форуме
Отправить личное сообщение для Zamay Посмотреть профиль Найти все сообщения от Zamay
 
Регистрация: 01.03.2017
Сообщений: 9

Помогите онайти ошибку в бновлении данных
Данные приходят с сервера (пользователи). Если такой пользователь уже есть ( выведен), то ничего не делать , если нету , то добавить в конец ( а лучше в начало ) списка. И обновлять через 2-3 секунды.

У меня после обновления , все добавляется в конец списка( списка пользователи) и выходи так , что пользователи одинаковые - повторяются ... и опять и опять ...
Помогите это исправить ) Спасибо

Вот онлайн - раскомментировать // setInterval(users, 4000);
http://codepen.io/Zamay/pen/egbONw?editors=1010

function users() {
    $.ajax({
        type: 'GET',
        url: 'https://main-workspace-juggerr.c9users.io:8081/user',
        success: function (data) {  // Обработчик успешного ответа

            $.parseJSON(JSON.stringify(data)).forEach(
                function (obj) {
                    console.log(obj)
                    if (obj.username != "" || obj.user_id != "" ) {
                        var users = document.querySelector('.list_user');
                        var userId = obj.user_id;

                        if ($('.list_user a').attr('href').replace('#', '') == userId) {
                            console.log("1");
                            //не выводить 

                        } else {
                            console.log("2");
                            var ul = document.querySelector(".list_user");
                            ul.lastElementChild.innerHTML += `<li><a href = #${obj.user_id} class="user">${obj.username} </a></li>`;
                        }
                    }
                }
            )
            setInterval(users, 4000);
            console.log("3");
        },
        error: function (data, status) {  // Обработчик ответа в случае ошибки
            console.error(data, status);
        }
    });
}
 users();
Ответить с цитированием
  #2 (permalink)  
Старый 01.03.2017, 17:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zamay,
var userAll = {};
   function users() {
    $.ajax({
        type: 'GET',
        url: 'https://main-workspace-juggerr.c9users.io:8081/user',
        success: function (data) {  // Обработчик успешного ответа

            $.parseJSON(JSON.stringify(data)).forEach(
                function (obj) {
                    console.log(obj)
                    if (obj.username != "" || obj.user_id != "" ) {
                        var users = document.querySelector('.list_user');
                        var userId = obj.user_id;

                        if (!userAll[userId]){
                            userAll[userId] = true
                            var ul = document.querySelector(".list_user");
                            ul.lastElementChild.innerHTML += `<li><a href = #${obj.user_id} class="user">${obj.username} </a></li>`;
                        }
                    }
                }
            )
            setInterval(users, 4000);
            console.log("3");
        },
        error: function (data, status) {  // Обработчик ответа в случае ошибки
            console.error(data, status);
        }
    });
}
 users();
Ответить с цитированием
  #3 (permalink)  
Старый 01.03.2017, 20:04
Новичок на форуме
Отправить личное сообщение для Zamay Посмотреть профиль Найти все сообщения от Zamay
 
Регистрация: 01.03.2017
Сообщений: 9

рони, спасибо.
Теперь понятно ! Надо было в массив записывать ( как я понял )
Но такой вопрос - в консоле , после каждого обновление запроса - вывод console.log("3") увеличивается в 2 раза .
3
(2) 3
(4) 3
(8) 3
(16) 3
...
И через 30 сек сайт лежит. Приходиться вкладку закрывать и заново открывать ! Почему так ?
Ответить с цитированием
  #4 (permalink)  
Старый 01.03.2017, 20:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zamay,
потому что вы умножаите интервалы setInterval замените на setTimeout или уберите из функции
Ответить с цитированием
  #5 (permalink)  
Старый 01.03.2017, 20:49
Новичок на форуме
Отправить личное сообщение для Zamay Посмотреть профиль Найти все сообщения от Zamay
 
Регистрация: 01.03.2017
Сообщений: 9

Спасибо еще раз )
А можешь еще посмотреть ... Я делаю как ты , но вот на innerHTML ругается . не знаю ,на что можно заменить (
https://codepen.io/Zamay/pen/egbONw?editors=1010

var messagesAll = {};
function messages() {
  $.ajax({
    type: 'GET',
    url: 'https://main-workspace-juggerr.c9users.io:8081/messages',
    success: function (data) {  // Обработчик успещного ответа

      $.parseJSON(JSON.stringify(data)).forEach(
        function (obj) {
          if (obj.user_id != undefined) {
            var messages = document.querySelector('.wrap-tab-content');
            var userId = obj.user_id;
            var message = messages.querySelector('#' + userId);

            if (messagesAll[message]) {
              messagesAll[message] = false;
              messages.querySelector('#' + userId).innerHTML += `<p><b>${obj.user_id}:</b> ${obj.message}</p>`;
            } else {
              messagesAll[message] = true;
              var newDiv = document.createElement('div');
              newDiv.id = obj.user_id;
              newDiv.innerHTML = `<p><b>${obj.user_id}:</b> ${obj.message}</p>`;
              messages.appendChild(newDiv);
            }
          }
        }
      )
    },
    error: function (data, status) {  // Обработчик ответа в случае ошибки
      console.error(data, status);
    }
  });
}
setInterval(messages, 1000);
Ответить с цитированием
  #6 (permalink)  
Старый 01.03.2017, 21:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zamay,
может на новый формат замены ругается а не на innerHTML не все поддерживают ещё
а так insertAdjacentHTML
Ответить с цитированием
  #7 (permalink)  
Старый 01.03.2017, 21:06
Новичок на форуме
Отправить личное сообщение для Zamay Посмотреть профиль Найти все сообщения от Zamay
 
Регистрация: 01.03.2017
Сообщений: 9

рони,

"Cannot read property 'innerHTML' of null "
"Cannot read property 'insertAdjacentHTML' of null "
Ответить с цитированием
  #8 (permalink)  
Старый 01.03.2017, 21:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zamay,
messagesAll[message] каков был смысл менять предложенный вам вариант с userId ?
Ответить с цитированием
  #9 (permalink)  
Старый 01.03.2017, 21:39
Новичок на форуме
Отправить личное сообщение для Zamay Посмотреть профиль Найти все сообщения от Zamay
 
Регистрация: 01.03.2017
Сообщений: 9

рони, если я правильно понял ваш вопрос - то у меня 2 функции: одна получает пользователь , а вторая сообщения !
У меня изначально была такая функция, но она тоже не правильно обновляется( как и users () ). Решил переделать как вы скинули. Но не получилось. Прошу помощь еще разок )
function messages() {
    $.ajax({
        type: 'GET',
        url: 'http://192.168.1.169:8081/messages',
        success: function (data) {  // Обработчик успещного ответа

            $.parseJSON(JSON.stringify(data)).forEach(
                function (obj) {
                    if (obj.user_id != undefined) {
                        var messages = document.querySelector('.wrap-tab-content');
                        var userId = obj.user_id;
                        var message = messages.querySelector('#' + userId);

                        if (message) {
                            messages.querySelector('#' + userId).innerHTML += `<p><b>${obj.user_id}:</b> ${obj.message}</p>`;
                        } else {
                            var newDiv = document.createElement('div');
                            newDiv.id = obj.user_id;
                            newDiv.innerHTML = `<p><b>${obj.user_id}:</b> ${obj.message}</p>`;
                            messages.appendChild(newDiv);
                        }
                    }
                }
            )
        },
        error: function (data, status) {  // Обработчик ответа в случае ошибки
            console.error(data, status);
        }
    });
}
//setInterval(messages, 4000);
Ответить с цитированием
  #10 (permalink)  
Старый 01.03.2017, 21:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Zamay,
пост 5 -- надо не messagesAll[message] везде а messagesAll[userId]
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите организовать поиск по текстовой базе данных Янковиц Элементы интерфейса 23 18.11.2014 18:14
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41
Помогите разбить строку входящих данных на 2 переменные freefly Общие вопросы Javascript 3 18.01.2010 01:56
Помогите исправить скрипт по поиску в базе данных dok_sj2 Internet Explorer 2 29.06.2009 20:04