Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не могу понять, помогите, indexOf (https://javascript.ru/forum/misc/71217-ne-mogu-ponyat-pomogite-indexof.html)

Rasy 02.11.2017 18:08

Цитата:

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

Вот такой алгоритм придумал SergoMorello.
При клике на 1 добавляется 13 как зависимость к 1, как я понял. При повторном клике две картинки под этими айдишниками удаляются, и массив соответственно.

SergoMorello 02.11.2017 18:17

Цитата:

Сообщение от Rasy (Сообщение 468960)
Вот такой алгоритм придумал SergoMorello.
При клике на 1 добавляется 13 как зависимость к 1, как я понял. При повторном клике две картинки под этими айдишниками удаляются, и массив соответственно.

да, так и есть, по другому я не могу представить как это можно сделать, надо дать возможность юзеру выделять и снимать выделение)

а по поводу моей проблемы, я видимо тупой, несколько раз перечитал ваш ответ, ну никак не могу понять почему условие if (obj==13) {set_car_obj(1,0);} не удалит 1 айди, ну реально, вот чувствую что истина гдето рядом но никак не могу её увидеть, да и к тому же на сторонней функции поиска по массиву почему всё работает тогда?

SergoMorello 02.11.2017 18:29

Цитата:

Сообщение от Nexus (Сообщение 468955)
Попробуйте так:
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);
}

большое спасибо, ваша функция отлично работает, и занимает значительно меньше места

Rasy 02.11.2017 18:32

Цитата:

Сообщение от SergoMorello
if (obj==13) {set_car_obj(1,0);}

Пересмотрел. Да, должен удалиться сразу элемент со значением 13, а потом элемент со значением 1.

SergoMorello 02.11.2017 18:51

Цитата:

Сообщение от Rasy (Сообщение 468964)
Пересмотрел. Да, должен удалиться сразу элемент со значением 13, а потом элемент со значением 1.

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

Ладно, огромное спс за помощь вам и Nexus, конечно хотелось бы разобраться но чувствую не получится

Rasy 02.11.2017 18:58

Цитата:

Сообщение от SergoMorello
конечно хотелось бы разобраться но чувствую не получится

Я бы и сам написал быстрее другую реализацию, но интересно было разобраться в чем проблема. А проблема оказалась элементарная.
Написал html чтобы разобраться. В первом аргументе передается строка, а не число, поэтому проблемы с индексацией.

В строку 13 нужно добавить
obj = +obj

var arr = ["13", 1];
alert(arr.indexOf(13));

SergoMorello 02.11.2017 19:29

Цитата:

Сообщение от Rasy (Сообщение 468967)
Я бы и сам написал быстрее другую реализацию, но интересно было разобраться в чем проблема. А проблема оказалась элементарная.
Написал html чтобы разобраться. В первом аргументе передается строка, а не число, поэтому проблемы с индексацией.

В строку 13 нужно добавить
obj = +obj

var arr = ["13", 1];
alert(arr.indexOf(13));

вау, действительно, работает! Но интересно почему это происходило, почучается когда эти условия с зависимостями срабатывали они вместо числа в функцию передавали строку, но указано же конкретно число, кавычек никаких нет, если бы было написано так set_car_obj("13",0); то тут понятно 13 передаётся строкой, ещё одна загадка?)
if (obj==1) {set_car_obj(13,0);}
if (obj==13) {set_car_obj(1,0);}

Rasy 02.11.2017 19:50

Цитата:

Сообщение от SergoMorello
ещё одна загадка

К счастью нет:)

Клик на 1. Передаем в функции строку 1, потом второй вызов функции с числом 13.
Массив ["1", 13];
Второй клик на 1. Cнова передаем строку 1, удаляем "1" из массива, потом программа передает 13 и удаляет число 13.

При клике на 13 аналогично, только наоборот ["13", 1].

Если кликнуть на 1, потом на 13 получим массив - ["1", 13, "13", 1].
Т.е теперь при клике на 13 передается строка "13" а в массиве число 13, повторный вызов функции передает число один а в массиве строка "1". Поэтому добавляются две новые картинки, а не удаляются. Вот третий клик уже находит элементы в массиве и удаляет две последние картинки.

Когда кликаем при первом вызове передается строка из атрибута, а не число. Второй вызов передает всегда число.


Часовой пояс GMT +3, время: 07:40.