Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.11.2017, 16:22
Интересующийся
Отправить личное сообщение для SergoMorello Посмотреть профиль Найти все сообщения от SergoMorello
 
Регистрация: 06.05.2011
Сообщений: 21

Не могу понять, помогите, indexOf
Ребят всем привет, долблюсь в эту функцию уже 2 часа, не могу понять почему не работает поиск значения в массиве,

задача функции проста, при нажатии на нужный обьект добавлять в определённое место страницы нужную картинку, к тому же с записью id этой картинки в массив чтобы при повторном нажатии удалить картинку и запись в массиве,

вроде бы всё работает отлично сделал условия для каждой картинки, проверку на наличие id в массиве, всё работает, но есть одно но - для определённых нажимаемых обьектов нужны пары, и вот с этим то и возникли проблемы,

добавил условий в финкцию для того чтобы запустить функцию ещё раз для нужных парных картинок,
всё вроде работает выбираю например обьект 1 добавляется соответственно картинка 1 и картинка из обьекта 13, если повторно нажать на обьект 1 то обе картинки удаляются и стераются их записи из массива,
но если опять же выбрать обьект 1 - снова появятся картинки и после этого нажать на обьект 13 то удаления не происходит, по причине того что indexof не находит id в массиве, хотя и 1 и 13 id там есть,

вроде всё обьяснил, сорри если как то запутанно, заранее спс за помощь, код функции прикладываю

var s_obj=new Array();
			
				$("div#set_obj").on("click", function(e){
					
				  if ( e.target.id === "set_obj" ) {
				  
				  set_car_obj($(this).attr("obj_id"),1);
				  }
				});
			
			
			function set_car_obj(obj,type) {
			
			alert(s_obj+"< "+type+" >"+s_obj.indexOf(obj));

                   
					if (s_obj.indexOf(obj)!=-1) {$("#objimg_"+obj).remove();s_obj.splice(s_obj.indexOf(obj),1);}else{s_obj[s_obj.length]=obj;
						if (obj==1) {$("#objblock").append("<img src='/img/zak_book/p_bamper_l.png' style='z-index:79;position:absolute;margin-left:5px;margin-top:46px;' id='objimg_1'>");}
						if (obj==2) {$("#objblock").append("<img src='/img/zak_book/p_krilo_l.png' style='z-index:79;position:absolute;margin-left:21px;margin-top:38px;' id='objimg_2'>");}
						if (obj==3) {$("#objblock").append("<img src='/img/zak_book/p_dver_l.png' style='z-index:79;position:absolute;margin-left:86px;margin-top:31px;' id='objimg_3'>");}
						if (obj==4) {$("#objblock").append("<img src='/img/zak_book/z_dver_l.png' style='z-index:79;position:absolute;margin-left:148px;margin-top:29px;' id='objimg_4'>");}
						if (obj==5) {$("#objblock").append("<img src='/img/zak_book/z_krilo_l.png' style='z-index:79;position:absolute;margin-left:89px;margin-top:6px;' id='objimg_5'>");}
						if (obj==6) {$("#objblock").append("<img src='/img/zak_book/z_bamper_l.png' style='z-index:79;position:absolute;margin-left:223px;margin-top:42px;' id='objimg_6'>");}
						if (obj==7) {$("#objblock").append("<img src='/img/zak_book/porog_l.png' style='z-index:79;position:absolute;margin-left:70px;margin-top:66px;' id='objimg_7'>");}
						
						if (obj==8) {$("#objblock").append("<img src='/img/zak_book/z_bamper_p.png' style='z-index:79;position:absolute;margin-left:7px;margin-top:171px;' id='objimg_8'>");}
						if (obj==9) {$("#objblock").append("<img src='/img/zak_book/z_krilo_p.png' style='z-index:79;position:absolute;margin-left:23px;margin-top:133px;' id='objimg_9'>");}
						if (obj==10) {$("#objblock").append("<img src='/img/zak_book/z_dver_p.png' style='z-index:79;position:absolute;margin-left:55px;margin-top:157px;' id='objimg_10'>");}
						if (obj==11) {$("#objblock").append("<img src='/img/zak_book/p_dver_p.png' style='z-index:79;position:absolute;margin-left:114px;margin-top:159px;' id='objimg_11'>");}
						if (obj==12) {$("#objblock").append("<img src='/img/zak_book/p_krilo_p.png' style='z-index:79;position:absolute;margin-left:179px;margin-top:166px;' id='objimg_12'>");}
						if (obj==13) {$("#objblock").append("<img src='/img/zak_book/p_bamper_p.png' style='z-index:79;position:absolute;margin-left:228px;margin-top:175px;' id='objimg_13'>");}
						if (obj==14) {$("#objblock").append("<img src='/img/zak_book/porog_p.png' style='z-index:79;position:absolute;margin-left:78px;margin-top:194px;' id='objimg_14'>");}
						
						
					}
                     if (type==1) {
						 if (obj==1) {set_car_obj(13,0);}
						 if (obj==13) {set_car_obj(1,0);}
						 
						 if (obj==6) {set_car_obj(8,0);}
						 if (obj==8) {set_car_obj(6,0);}
						 
					 }
			}
Ответить с цитированием
  #2 (permalink)  
Старый 02.11.2017, 16:38
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.
Ответить с цитированием
  #3 (permalink)  
Старый 02.11.2017, 16:52
Интересующийся
Отправить личное сообщение для SergoMorello Посмотреть профиль Найти все сообщения от SergoMorello
 
Регистрация: 06.05.2011
Сообщений: 21

Сообщение от Rasy Посмотреть сообщение
SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.
там же после условия с поиском в массиве написано }else{s_obj[s_obj.length]=obj;
как раз на той же 17 строке,

проблема только только одна в поиске id в массиве, больше нет проблем
Ответить с цитированием
  #4 (permalink)  
Старый 02.11.2017, 17:33
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

SergoMorello,
Сообщение от SergoMorello
но если опять же выбрать обьект 1 - снова появятся картинки и после этого нажать на обьект 13 то удаления не происходит, по причине того что indexof не находит id в массиве, хотя и 1 и 13 id там есть,
При клике на объект 13 в массиве есть элементы: 1 под индексом 0 и 13 под индексом 1.
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым.
Ответить с цитированием
  #5 (permalink)  
Старый 02.11.2017, 17:40
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

Клик на элемент с obj_id=1 получим массив s_obj = [1, 13]; Повторный клик на obj_id=1 s_obj = [];
Клик на obj_id=1 - s_obj = [1, 13], клик на obj_id=13 - s_obj = [1];
Ответить с цитированием
  #6 (permalink)  
Старый 02.11.2017, 17:46
Интересующийся
Отправить личное сообщение для SergoMorello Посмотреть профиль Найти все сообщения от SergoMorello
 
Регистрация: 06.05.2011
Сообщений: 21

Сообщение от Rasy Посмотреть сообщение
SergoMorello,

При клике на объект 13 в массиве есть элементы: 1 под индексом 0 и 13 под индексом 1.
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым.
почему? есть же 2 условия, если нажимаем на 13 то и снова выполнится set_car_obj(1,0); и удалит первый элемент так как в массиве есть его id

if (obj==1) {set_car_obj(13,0);}
 if (obj==13) {set_car_obj(1,0);}


я тут психанул и просто взял готовую функцию для поиска элементов в массиве и на удивление с ней всё отлично работает, но почему такие траблы с indexof я так и не понял

function find(array, value) {

 for (var i = 0; i < array.length; i++) {
	if (array[i] == value) return i;
 }

return -1;
}
Ответить с цитированием
  #7 (permalink)  
Старый 02.11.2017, 17:49
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Попробуйте так:
var imgs={//Список данных изображений
		1:{
			src:'p_bamper_l.png',
			left:5,
			top:46
		},
		2:{
			src:'p_krilo_l.png',
			left:21,
			top:38
		}
	};

$("div#set_obj").on("click",function(e){
    set_car_obj($(this).attr("obj_id"),1);
});


function set_car_obj(id, type){
    var node=document.getElementById('objimg_'+id);
	if(!!node)
        $(node).remove();
	else{
		if(!imgs[id])
			throw new Error('Element not found');
		
		var item=imgs[id];
		$('<img/>').attr({
			src:'/img/zak_book/'+item.src,
			id:'objimg_'+id
		}).css({
			'z-index':79,
			'position':'absolute',
			'margin-left':item.left,
			'margin-top':item.top
		}).appendTo('#objblock');
    }
	
    if (type!=1)
		return;
	
	if(id==1 || id==13)
		set_car_obj(id==1?13:1,0);
	else if(id==6 || id==8)
		set_car_obj(id==6?8:6,0);
}

Последний раз редактировалось Nexus, 02.11.2017 в 18:02.
Ответить с цитированием
  #8 (permalink)  
Старый 02.11.2017, 17:55
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

Сообщение от SergoMorello
почему? есть же 2 условия, если нажимаем на 13 то и снова выполнится set_car_obj(1,0); и удалит первый элемент так как в массиве есть его id
Нет, выполнится функция с такими аргументами set_car_obj(13, 1);
Ответить с цитированием
  #9 (permalink)  
Старый 02.11.2017, 17:58
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

SergoMorello,
Алгоритм функции
/**

TODO:
- Определение пустого массива
- Клик на элемент set_obj. Получить число из дата-атрибута. Вызвать функцию с числом (obj_id) и флагом 1 (псевдоистинной).
- Условие. Если в массиве первый параметр (число) найден, т.е результат >= нулю, то удалить картинку с id (objimg_+первый параметр). Вырезать элемент в массиве.
- Иначе если (число) не найдено в массиве, добавить в массив первый параметр (число).
- Условие. Вставить в элемент objblock изображение с айди равным первому параметру.
- Условие. Если флаг 1 и первый параметр совпадает, то вызвать функцию с флагом 0 (псевдоложью).
- При втором вызове функции добавить в массив дополнительное число и вставить дополнительно изображение.
Т.е. клик на элемент с obj_id=1 получим массив s_obj = [1, 13]; Повторный клик на obj_id=1 s_obj = [];
- Клик на элемент set_obj с числом 13 из дата-атрибута. Вызвать фунцкию с числом (obj_id) 13 и флагом 1 (псевдоистинной)
Клик на obj_id=1 - s_obj = [1, 13], клик на obj_id=13 - s_obj = [1];
*/
Ответить с цитированием
  #10 (permalink)  
Старый 02.11.2017, 18:03
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Можете объяснить зачем вообще нужен массив созданных элементов?
Зачем при клике на obj_id=1 удалять obj_id=13 и наоборот?

Последний раз редактировалось Nexus, 02.11.2017 в 18:07.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Налажал гдето в коде и не могу понять где. злобная_пипа jQuery 4 24.10.2015 15:31
Люди не могу понять Virby Общие вопросы Javascript 0 08.10.2015 17:15
Помогите пожалуйста не могу вывести информацию из mysql Геворг Серверные языки и технологии 4 01.03.2011 20:24
Помогите не могу справится... Prostenikii Работа 2 18.02.2011 10:46
не могу понять в чём ошибка scuter Общие вопросы Javascript 2 28.08.2008 15:22