Замена данных с помощью JS, помогите с логикой - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

  • 2 Страниц +
  • 1
  • 2

Замена данных с помощью JS, помогите с логикой

#1 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 25 Февраль 2019 - 21:40

Здравствуйте.

Заходит игрок на сервер на слот 0, чтобы вставились данные необходимо, в html указать этот идентификатор - 0, оно выглядит у меня так:

							{{foreach $game['players'] as $player}}
									<li class='usercolor usercolor-{{if isset($player['color'])}}{$player['color']}{{endif}}'></li>
							{{endforeach}}


где 0:

$player['color']


Ну и происходит замена через JS, здесь никаких проблем нет.

Вопрос в следующем, как идентифицировать слот 0 - если игрок еще не зашел и li еще нет в HTML.

Я вижу тут два варианта:
1. Изначально вывести пустые массивы слотов (оно существует стандартно, но я просил помочь убрать это тут: http://ipbskins.ru/f...post__p__106070), выглядит оно так: http://prntscr.com/mq0g6n
2. При входе игрока заменять полностью строку а не самого игрока.

Какие мысли?
0

#2 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 347
  • Регистрация: 20-Март 09
  • Репутация: 2 513
  • IPB version:3.1.x
 

Отправлено 26 Февраль 2019 - 12:49

С нуллем в качестве значения чего либо лучше конечно не работать. Ну а так проверяйте на соответствие типа ===
0

#3 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 01:49

Можно чуток подробней про соответствие типа?
0

#4 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 676
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 448
  • IPB version:I have no IPB
 

Отправлено 27 Февраль 2019 - 07:06

Вообще ничего не понятно.
Какие-то запятые.

Что мешает убрать их с помощью css?
Данные появились -> добавили -> убрали скрытность
0

#5 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 08:22

Вопрос не в запятых, вот еще раз:

Мне нужно добавить игрока в список, когда о его входе сообщает Websocket. Чтобы правильно разместить игрока на его слоте и сделать замену, необходимо иметь вот этот код стандартно:

Массив слотов:

[players] => Array
(
    [0] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 0
        )

    [1] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 1
        )

    [2] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 2
        )

    [3] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 3
        )

    [4] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 4
        )

    [5] => Array
        (
            [name] => 
            [realm] => 
            [ping] => 
            [color] => 5
        )

)


В html это выглядит так:

<ul class="ipsDataItem_subList ipsList_inline userColorType-hellhalt">
    <li class="usercolor usercolor-0">
        
    </li>

    <li class="usercolor usercolor-1">
        
    </li>

    <li class="usercolor usercolor-2">
        
    </li>

    <li class="usercolor usercolor-3">
        
    </li>

    <li class="usercolor usercolor-4">
        
    </li>

    <li class="usercolor usercolor-5">
        
    </li>
</ul>


Мне это не нравится, и я попросил помощи убрать пустые массивы: http://ipbskins.ru/f...post__p__106070 всё стало как надо.

Теперь массив выглядит так:

Массив:

[players] => Array
    (
    )


HTML:

<ul class="ipsDataItem_subList ipsList_inline userColorType-hellhalt">
</ul>


Вот это правильный вариант, когда пустые слоты не выводятся нигде, а выводятся только тогда, когда зашел игрок.

Теперь вопрос, КАК вставить игрока на нужный слот через JS, если изначально в HTML слота нет.

Т.е сейчас метод следующий:

// Вход игрока
var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');
var rows = rowElem.find('> li.usercolor.usercolor-'+ data.sid +'');
var playerElement = '<a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a>';
rows.html(playerElement);


1. Находим именно ту игру, в которую зашел игрок.
2. Находим именно тот слот, на который зашел игрок.
3. Вставляем данные игрока в li именно этого слота.

Т.е, если изаначально слота нет в HTML структуре, то JS их не найдет.

-------------------------

Пока писал, пришла мысль, что можно полностью вставить li вместе со слотом, когда заходит игрок, ведь нам известен слот на который он зашел и имя игры изанчально. Сейчас попробую.
0

#6 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 08:31

Вроде получилось:

			var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');
			var playerElement = '<li class="usercolor usercolor-'+ data.sid +'"><a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a></li>';
			rowElem.html(playerElement);


Ладно, буду пробовать еще, есть глюки небольшие.

Посмотрите пожалуйста этот JS код, может его функции можно оптимизировать или урезать как-то? Если да, напишите пожалуйста новый, и я буду его использовать в других методах, с JS почти совсем не знаком.

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 08:56)

0

#7 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 09:02

Не получается, добавляется только один игрок, т.е игрок заходит на слот 1 - отображается, заходит второй игрок на слот 2 - первый игрок исчезает, второй отображается, без слотов никак?
0

#8 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 09:09

Вот что-то вроде такого надо, только rowElem.length размер какого элемента бы указать? Можно количество текущих игроков, но там пока тоже проблемы, не смог сделать.

			// Вход игрока
            var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');

				for( var i = 0; i < rowElem.length; i++ ){
					var playerElement = '<li class="usercolor usercolor-'+ data.sid +'"><a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a></li>';

					if( playerElement.length ){
						rowElem.html(playerElement);
					}
				}

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 09:10)

0

#9 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 09:36

Получилось, всё проще чем казалось.

// Вход игрока
var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');
var playerElement = $('<li class="usercolor usercolor-'+ data.sid +'"><a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a></li>');
rowElem.append(playerElement);


Еще вот это нужно упорядочить как-то: http://prntscr.com/mqp7va

бред выше бы удалить, не позориться.

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 09:37)

0

#10 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 676
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 448
  • IPB version:I have no IPB
 

Отправлено 27 Февраль 2019 - 09:54

Стоит начать с прочтения того, что делает метод html() http://api.jquery.com/html/#html2
Сперва у Вас
<ul class="ipsDataItem_subList ipsList_inline userColorType-hellhalt">
</ul>


Затем
<ul class="ipsDataItem_subList ipsList_inline userColorType-hellhalt">
    <li class="usercolor usercolor-1"></li>
</ul>


Затем
<ul class="ipsDataItem_subList ipsList_inline userColorType-hellhalt">
    <li class="usercolor usercolor-2"></li>
</ul>


Все внутри тегов <ul> будет заменяться на новый html.

Вам нужно искать элемент, после которого / перед которым вставлять код.

Примерный код
var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');
var playerElement = '<li class="usercolor usercolor-'+ data.sid +'"><a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a></li>';

var uColor,
	insertAfter = 0,
	insertBefore = 0,
	sid = parseInt(data.sid),
	skip = false;

rowElem.find('.usercolor').each(function( i ) {
	uColor = parseInt($(this).attr('class').replace('usercolor usercolor-', ''));
	if (uColor == sid)
	{
		skip = true;
		return false;
	}

	if (uColor > sid)
	{
		insertBefore = uColor;
		return false;
	}

	if (uColor < sid)
	{
		insertAfter = uColor;
	}
});

if (skip == false) {
	if (insertAfter > 0) {
		rowElem.find('.usercolor-' + insertAfter).after(playerElement);
	} else if (insertBefore > 0) {
		rowElem.find('.usercolor-' + insertBefore).before(playerElement);
	} else {
		rowElem.html(playerElement);
	}
}

1

#11 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 10:10

Спасибо, всё понял.
0

#12 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 13:01

Блин, не могу разобраться, я попробовал со значениями в ручную - вроде вставляется, т.е я оставил игрока в игре с цветом 4, указал в ручную в JS для себя цвет 2 - встал перед ним, всё норм. Но автоматическая вставка не работает, наверно потому что у меня SID - 0 это реальный идентификатор в html, т.е слота идут с 0 1 2 3 .... Щас копаю еще...

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 13:24)

0

#13 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 676
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 448
  • IPB version:I have no IPB
 

Отправлено 27 Февраль 2019 - 14:39

Копайте-копайте.

Не понял в чем проблема. Вижу, что есть дубли, которые можно удрать, проверяя есть ли элемент уже в списке.
Изменил код. Проверьте
0

#14 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 15:33

Спасибо большое, всё супер. Сейчас буду разбираться что к чему )))

Хотя нет, есть баг. Я стоял на sid 2, зашел чел на sid 3 и заменил меня, но это из-за этого, буду еще копать. rowElem.html(playerElement);

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 15:52)

0

#15 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 464
  • Регистрация: 16-Январь 18
  • Репутация: 6
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 27 Февраль 2019 - 21:15

Так, я разобрался, в итоге получился следующий код:

var rowElem = this.scope.find('[data-gamename="'+gamename+'"] > .ipsDataItem_main > ul.ipsDataItem_subList');
var playerElement = '<li class="usercolor usercolor-'+ data.sid +'"><a href="#" data-player="'+data.name+'" data-ipsHover data-ipsHover-width="225" data-ipsHover-target="'+ips.getSetting('baseURL')+'index.php?app=wc3&module=activegames&controller=ActiveGames&player='+data.name+'&server='+data.realm+'&ping='+data.ping+'&do=hovercard" data-ipsHover-timeout="0">'+data.name+'</a></li>';

var insertAfter, insertBefore, uColor;
var sid = parseInt(data.sid);
var skip = false;

rowElem.find('.usercolor').each(function( i ) {
    uColor = parseInt($(this).attr('class').replace('usercolor usercolor-', ''));
    if (uColor == sid) {
        skip = true;
        return false;
    }

    if (uColor > sid) {
        insertBefore = $(this);
    }

    if (uColor < sid) {
        insertAfter = $(this);
    }

});

if (skip == false) {
    if (insertAfter) {
    	Debug.log("Если uColor " + uColor + " < " + sid + " sid вставить после");
        insertAfter.after(playerElement);
    } else if (insertBefore) {
    	Debug.log("Если uColor " + uColor + " > " + sid + " sid вставить до");
        insertBefore.before(playerElement);
    } else {
		rowElem.html(playerElement);
	}
}


С After всё работает отлично, а вот с before есть глюк. Дело в том, что, uColor выбирает максимальный текущий цвет, в случае с before это не подойдет, так как произойдет вставка ДО максимального слота, как на этом примере:

http://prntscr.com/mr05so

TemKa_SD я - захожу с SID 0.
Марихуана - последний максимальный слот SID 5.

Я встаю до этого слота, т.е всё работает как надо, код рабочий.

Единственное, мне нужно встать не до максимального слота, а до минимального, если я встаю ДО. Как пофиксить? )))) Я тут точно не разберусь, щас буду пробовать.

Сообщение изменено: TemKa_SD (27 Февраль 2019 - 21:16)

0

Сообщить об этой теме:


  • 2 Страниц +
  • 1
  • 2


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2019 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна