Не могу понять, помогите, 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, время: 06:35. |