Не могу понять, помогите, 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);}
}
}
|
SergoMorello,
4 и 8 строки лишние. 17 условие не выполниться ни разу, т.к. массив пустой и в него ничего не добавляется. |
Цитата:
как раз на той же 17 строке, проблема только только одна в поиске id в массиве, больше нет проблем |
SergoMorello,
Цитата:
Должен удаляться 13 элемент (индекс 1) из массива и картинка objimg_13, но первый остается нетронутым. |
Клик на элемент с 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]; |
Цитата:
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;
}
|
Попробуйте так:
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);
}
|
Цитата:
|
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]; */ |
Можете объяснить зачем вообще нужен массив созданных элементов?
Зачем при клике на obj_id=1 удалять obj_id=13 и наоборот? |
| Часовой пояс GMT +3, время: 12:34. |