02.11.2017, 16:22
|
Интересующийся
|
|
Регистрация: 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);}
}
}
|
|
02.11.2017, 16:38
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.
|
|
02.11.2017, 16:52
|
Интересующийся
|
|
Регистрация: 06.05.2011
Сообщений: 21
|
|
Сообщение от Rasy
|
SergoMorello,
4 и 8 строки лишние.
17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется.
|
там же после условия с поиском в массиве написано }else{s_obj[s_obj.length]=obj;
как раз на той же 17 строке,
проблема только только одна в поиске id в массиве, больше нет проблем
|
|
02.11.2017, 17:33
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
SergoMorello,
Сообщение от SergoMorello
|
но если опять же выбрать обьект 1 - снова появятся картинки и после этого нажать на обьект 13 то удаления не происходит, по причине того что indexof не находит id в массиве, хотя и 1 и 13 id там есть,
|
При клике на объект 13 в массиве есть элементы: 1 под индексом 0 и 13 под индексом 1.
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым.
|
|
02.11.2017, 17:40
|
Профессор
|
|
Регистрация: 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];
|
|
02.11.2017, 17:46
|
Интересующийся
|
|
Регистрация: 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;
}
|
|
02.11.2017, 17:49
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,790
|
|
Попробуйте так:
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.
|
|
02.11.2017, 17:55
|
Профессор
|
|
Регистрация: 17.06.2016
Сообщений: 509
|
|
Сообщение от SergoMorello
|
почему? есть же 2 условия, если нажимаем на 13 то и снова выполнится set_car_obj(1,0); и удалит первый элемент так как в массиве есть его id
|
Нет, выполнится функция с такими аргументами set_car_obj(13, 1);
|
|
02.11.2017, 17:58
|
Профессор
|
|
Регистрация: 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];
*/
|
|
02.11.2017, 18:03
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,790
|
|
Можете объяснить зачем вообще нужен массив созданных элементов?
Зачем при клике на obj_id=1 удалять obj_id=13 и наоборот?
Последний раз редактировалось Nexus, 02.11.2017 в 18:07.
|
|
|
|