Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не получается забрать src тега img (https://javascript.ru/forum/misc/73277-ne-poluchaetsya-zabrat-src-tega-img.html)

Javany11 03.04.2018 10:14

Не получается забрать src тега img
 
Добрый день! Ребята, подскажите пожалуйста как забрать src="" тега <img>. Есть игровой автомат, в котором крутятся три барабана, изменение картинок организовано путем замены src, значения которых хранятся в массиве. Вращение барабана организовано через setInterval, который в свою очередь останавливается через clearInterval и Math.random(). Думаю что для подсчета очков мне нужно забрать src в переменную после остановки барабана и далее я пропишу в условной конструкции выигрышные комбинации. Только вот не получается src забрать. Пробовал document.getElementById(',,,').src, забирает но не меняется динамически. Подскажите как быть.

Старался код комментировать.

var pics=['images/1.gif', 'images/2.gif', 'images/3.gif', 'images/4.gif', 'images/5.gif', 'images/6.gif', 'images/7.gif', 'images/8.gif', 'images/9.gif', 'images/10.gif'];//храним src картинок

var imgs_1 = document.querySelectorAll('.carousel_1 img');//забираем картинки из карусели №1

var imgs_2 = document.querySelectorAll('.carousel_2 img');//забираем картинки из карусели №2

var imgs_3 = document.querySelectorAll('.carousel_3 img');//забираем картинки из карусели №3

var count = 0;

var a = 0;//здесь храним результат от setInterval
var b; // тут храним округленные рандомные числа
var c; // тут храним округленные рандомные числа
var d;	// тут храним округленные рандомные числа
		
lever.addEventListener('click',function(){
b = Math.random()*10//рандомим от 0 до 10	
b = Math.trunc(b)   //округляем до целого

c = Math.random()*10//рандомим от 0 до 10	
c = Math.trunc(c)  //округляем до целого

d = Math.random()*10//рандомим от 0 до 10	
d = Math.trunc(d)   //округляем до целого

//console.log(b);//тестим рандом
//console.log(c);//тестим рандом
//console.log(d);//тестим рандом

    var setInt1 = setInterval(slider1,100);//запускаем интервал
    var setInt2 = setInterval(slider2,120);//запускаем интервал
    var setInt3 = setInterval(slider3,140);//запускаем интервал

function slider1(){//запускаем барабан
a++;//добавляем к переменной 1 с каждым интервалом
if(a>=10){a=0} //ограничиваем переменную до 10
count--;
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_1.length;i++) imgs_1[i].src = pics[(i+count)%pics.length];
if(a==b)clearInterval(setInt1);	//останавливаем интервал 
}

function slider2(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;	
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_2.length;i++) imgs_2[i].src = pics[(i+count)%pics.length];
if(a==c)clearInterval(setInt2)//останавливаем интервал

}

function slider3(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;		
if(count<0) count = pics.length-1;	
for(let i =0; i<imgs_3.length;i++) imgs_3[i].src = pics[(i+count)%pics.length];
if(a==d)clearInterval(setInt3)//останавливаем интервал
}})

laimas 03.04.2018 10:24

Цитата:

Сообщение от Javany11
var imgs_1 = document.querySelectorAll('.carousel_1 img');

.carousel_1 - это общий элемент изображений автомата, так?

Javany11 03.04.2018 10:47

Да, .carousel_1 это див с тремя img

laimas 03.04.2018 10:55

Тогда, по идее, на каждом по три изображения, средние - выигрыш? Не проще ли иметь одну сетку 3х3 управляемую одним таймером. А если всего три изображения в окне, то еще проще.
А у вас три раздельных таймера работающих асинхронно.

Javany11 03.04.2018 11:09

Да, всё верно, на каждом по три изображения, средние - выигрыш. Безусловно, наверное проще. Я не волшебник, я только учусь. Я вообще хотел каждый барабан останавливать кнопкой под ним. Но нужно обязательно использовать рандом. А вот теперь уперся в условную конструкцию, вернее в src для неё.

laimas 03.04.2018 11:14

Я не любитель азартных игр, а тем более компьютерных, вообще не увлекаюсь играми компьютерными, но чтобы барабан останавливался тремя кнопками (как и запускался) впервые слышу. Наверное же останавливается сразу все, после чего остается получить в каждом списке document.querySelectorAll() среднее изображение.

PS. Кстати, для расчета выигрыша, не обязательно document.querySelectorAll(), хватит и document.querySelector() с соответствующим селектором. И учтите, то что возвращает document.querySelectorAll() до запуска таймеров у вас, не будет равно тому, что имеется на момент их остановки.

Javany11 03.04.2018 11:57

Не получается так. Прописал:
var aa = document.querySelectorAll('.carousel_1 :nth-child(2)')
console.log(aa)

Получил в консоли:
NodeList [img]
0:imglength: 1
__proto__: NodeList
script.js:36 NodeList [img]
script.js:36 NodeList [img]
script.js:36 NodeList [img]

Получаю элементы пока работает счетчик, от одного до десяти и более. Причем src в консоли не обнаружил.

laimas 03.04.2018 12:45

document.querySelectorAll('.carousel_1 :nth-child(2)')

Javany11 03.04.2018 13:01

Вот что я получил. Причем я получил теги, а мне нужно получить src последнего тега.

script.js:38 <img src=​"images/​8.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​5.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​3.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​10.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​8.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​6.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​5.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​3.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​1.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​10.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​8.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​6.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​4.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​3.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​1.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​9.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​8.gif" alt=​"pearl">​
script.js:38 <img src=​"images/​7.gif" alt=​"pearl">​

А когда прописываю document.querySelector('.carousel_1 :nth-child(2)').src получаю

file:///D:/Downloads/dz_kazino/dz_kazino/images/1.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/8.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/6.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/5.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/3.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/1.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/9.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/7.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/4.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/2.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/1.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/9.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/7.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/6.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/5.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/4.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/3.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/2.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/1.gif
script.js:38 file:///D:/Downloads/dz_kazino/dz_kazino/images/10.gif

Может я не по тому пути иду?

Когда пишем document.querySelectorAll, мы получаем массив? Или я ошибаюсь?

Nexus 03.04.2018 13:17

Цитата:

Сообщение от Javany11
Когда пишем document.querySelectorAll, мы получаем массив?

Экземпляр класса NodeList, не массив.
NodeList к массиву можно так привести:
var array=[].slice.call(document.querySelectorAll('a'));

laimas 03.04.2018 13:19

У вас три блока родительские для изображений, при этом каждый блок имеет по три изображения. Должен иметь, то есть ранее в них загруженные должны удаляться при запуске барабана, иначе вы и будете получать кучу всякого. Получая из каждого блока второе изображение вы получите всего три. А значение src, это document.querySelector(...).src.

Цитата:

Сообщение от Javany11
Когда пишем document.querySelectorAll, мы получаем массив?

Нет, это не массив, это NodeList, коллекция DOM узлов, и вам он не нужен.

Nexus 03.04.2018 13:22

Цитата:

Сообщение от Javany11
мне нужно получить src последнего тега.

var list=document.querySelectorAll('.carousel_1 img'),
item=list[list.length-1];
alert(item.src);

laimas 03.04.2018 13:26

Nexus,
зачем для querySelectorAll :nth-child(2)?

Nexus 03.04.2018 13:38

laimas, не знаю, скопипастил у тс :)
Поправил селектор.

laimas 03.04.2018 13:47

Nexus,
ему надо избавиться от геморроя вначале - трех кнопок и трех таймеров.
Тут либо анимируем движение постоянных изображений в каждом барабане, а random нужен только для задания разных скоростей анимации каждого барабана и ее направления. Либо изменяем через Nms каждое из трех изображений каждого барабана имитируя движение.

Не спец в игрушках, не интересуют, но мне кажется так.

Javany11 03.04.2018 14:27

Спасибо. Но я получил 17 алертов :)

Javany11 03.04.2018 14:44

Там нет трех кнопок. Есть три счетчика, каждый на свой барабан. Если я сделаю один счетчик на три барабана, разве я смогу эти барабаны остановить рандомно?

laimas 03.04.2018 15:08

Цитата:

Сообщение от Javany11
Там нет трех кнопок.

Я решил по этому.

Цитата:

Сообщение от laimas
Я вообще хотел каждый барабан останавливать кнопкой под ним.

А что такое счетчик и для чего он нужен в этой игре для меня темный лес, я же не игрок. Я знаю только одно - рычаг однорукого бандита, запустили, закрутилось. Значит можно курить крутить барабаны с постоянными картинками, но с разной скоростью, только для этого и нужен random.

PS. Да, если бы можно было "курить барабаны", то какая бы интересная игра была. :)

Javany11 03.04.2018 15:42

Крутить барабаны с постоянными картинками было бы намного проще. Но в задании сказано что src картинок необходимо хранить в массиве, картинки менять путем изменения src используя рандом. Я посчитал что выбранный мною способ относительно простой. Ох как я ошибался... Сегодня у препода спрошу, может она скажет как быть. Вам спасибо за помощь, плюсики уже у Вас в карме.:) Если будет решение, выложу.

Dilettante_Pro 03.04.2018 16:06

Читал, смотрел - ничего не понял.

Собрал макет.
Таки вроде все работает

<div class = "carousel_1">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<div class = "carousel_2">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<div class = "carousel_3">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<button id='lever'>click</button>
<div id="result"></div>
<script>
var pics=['https://javascript.ru/cat/list/dom.gif', 'https://javascript.ru/cat/list/event.gif', 'https://javascript.ru/cat/list/integr.jpg', 'https://javascript.ru/cat/list/donkey.gif', 'https://javascript.ru/cat/list/firefox.gif', 'https://javascript.ru/cat/list/opera.gif', 'https://javascript.ru/cat/list/libs.jpg', 'https://javascript.ru/cat/list/scriptaculous_54.png', 'https://javascript.ru/cat/list/dojo_54.png', 'https://javascript.ru/cat/list/jquery_54.png'];//храним src картинок

var imgs_1 = document.querySelectorAll('.carousel_1 img');//забираем картинки из карусели №1

var imgs_2 = document.querySelectorAll('.carousel_2 img');//забираем картинки из карусели №2

var imgs_3 = document.querySelectorAll('.carousel_3 img');//забираем картинки из карусели №3

var count = 0;

var a = 0;//здесь храним результат от setInterval
var b; // тут храним округленные рандомные числа
var c; // тут храним округленные рандомные числа
var d;	// тут храним округленные рандомные числа
		
lever.addEventListener('click',function(){
b = Math.random()*10//рандомим от 0 до 10	
b = Math.trunc(b)   //округляем до целого

c = Math.random()*10//рандомим от 0 до 10	
c = Math.trunc(c)  //округляем до целого

d = Math.random()*10//рандомим от 0 до 10	
d = Math.trunc(d)   //округляем до целого

//console.log(b);//тестим рандом
//console.log(c);//тестим рандом
//console.log(d);//тестим рандом
    var res1 = "", res2 = "", res3 = "";
    var setInt1 = setInterval(slider1,100);//запускаем интервал
    var setInt2 = setInterval(slider2,120);//запускаем интервал
    var setInt3 = setInterval(slider3,140);//запускаем интервал

function slider1(){//запускаем барабан
a++;//добавляем к переменной 1 с каждым интервалом
if(a>=10){a=0} //ограничиваем переменную до 10
count--;
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_1.length;i++) imgs_1[i].src = pics[(i+count)%pics.length];
if(a==b) { clearInterval(setInt1);	//останавливаем интервал 
      res1 = "Барабан 1 " + document.querySelectorAll('.carousel_1 img')[1].src;
  if(res2 != "" && res3 != "") result.innerHTML = res1 + "<br>" + res2 + "<br>" + res3;
 }
}

function slider2(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;	
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_2.length;i++) imgs_2[i].src = pics[(i+count)%pics.length];
if(a==c) { clearInterval(setInt2); //останавливаем интервал
   res2 = "Барабан 2 " + document.querySelectorAll('.carousel_2 img')[1].src;
   if(res1 != "" && res3 != "") result.innerHTML =res1 + "<br>" + res2 + "<br>" + res3;
  }
}

function slider3(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;		
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_3.length;i++) imgs_3[i].src = pics[(i+count)%pics.length];
if(a==d) { clearInterval(setInt3)//останавливаем интервал
    res3 = "Барабан 3 " + document.querySelectorAll('.carousel_3 img')[1].src;
  if(res1 != "" && res2 != "") result.innerHTML =res1 + "<br>" + res2 + "<br>" + res3; 
 }
}})
</script>

laimas 03.04.2018 16:11

Цитата:

Сообщение от Javany11
Крутить барабаны с постоянными картинками было бы намного проще.

Это как сказать еще. Во первых барабанам нужно задать разную скорость и направление. Скорость не может моментально достичь макс. значения, то есть она возрастает по некоему закону, и остановятся барабаны не сразу, то есть скорость замедляется тоже по некоему закону. Причем не зависимо от скорости и направления вращения остановится барабаны должны в определенной позиции все.

Если конечно все по-барабану, то меняйте их случайно как угодно, мне все одинаково, что вам сказал куратор, то и делайте.

PS. В реальных автоматах картинки одни и те же, если только барабаны или наклейки на них не менять.

Dilettante_Pro 03.04.2018 18:54

Javany11,
Смотрели пост 20?
Я его вроде довел до кондиции

Javany11 04.04.2018 09:17

Цитата:

Сообщение от Dilettante_Pro (Сообщение 482202)
Javany11,
Смотрели пост 20?
Я его вроде довел до кондиции

Извините, вчера не посмотрел, на пары убегал. Сегодня посмотрел, все отлично работает. Самое обидное что я пробовал этот метод, но я сделал ошибку и отбросил его не разобравшись. У меня переменные res1, res2, res3 ; были локальными. Буду сегодня после работы писать условные конструкции с выигрышными комбинациями. Вам огромное спасибо :thanks:, хорошо тогда есть люди которые делятся своими знаниями. Спасибо.

Javany11 04.04.2018 14:43

Цитата:

Сообщение от Dilettante_Pro (Сообщение 482194)
Читал, смотрел - ничего не понял.

Собрал макет.
Таки вроде все работает

<div class = "carousel_1">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<div class = "carousel_2">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<div class = "carousel_3">
  <img src= 'https://javascript.ru/cat/list/dom.gif'/>
  <img src= 'https://javascript.ru/cat/list/event.gif'/>
  <img src= 'https://javascript.ru/cat/list/integr.jpg'/>
</div>
<button id='lever'>click</button>
<div id="result"></div>
<script>
var pics=['https://javascript.ru/cat/list/dom.gif', 'https://javascript.ru/cat/list/event.gif', 'https://javascript.ru/cat/list/integr.jpg', 'https://javascript.ru/cat/list/donkey.gif', 'https://javascript.ru/cat/list/firefox.gif', 'https://javascript.ru/cat/list/opera.gif', 'https://javascript.ru/cat/list/libs.jpg', 'https://javascript.ru/cat/list/scriptaculous_54.png', 'https://javascript.ru/cat/list/dojo_54.png', 'https://javascript.ru/cat/list/jquery_54.png'];//храним src картинок

var imgs_1 = document.querySelectorAll('.carousel_1 img');//забираем картинки из карусели №1

var imgs_2 = document.querySelectorAll('.carousel_2 img');//забираем картинки из карусели №2

var imgs_3 = document.querySelectorAll('.carousel_3 img');//забираем картинки из карусели №3

var count = 0;

var a = 0;//здесь храним результат от setInterval
var b; // тут храним округленные рандомные числа
var c; // тут храним округленные рандомные числа
var d;	// тут храним округленные рандомные числа
		
lever.addEventListener('click',function(){
b = Math.random()*10//рандомим от 0 до 10	
b = Math.trunc(b)   //округляем до целого

c = Math.random()*10//рандомим от 0 до 10	
c = Math.trunc(c)  //округляем до целого

d = Math.random()*10//рандомим от 0 до 10	
d = Math.trunc(d)   //округляем до целого

//console.log(b);//тестим рандом
//console.log(c);//тестим рандом
//console.log(d);//тестим рандом
    var res1 = "", res2 = "", res3 = "";
    var setInt1 = setInterval(slider1,100);//запускаем интервал
    var setInt2 = setInterval(slider2,120);//запускаем интервал
    var setInt3 = setInterval(slider3,140);//запускаем интервал

function slider1(){//запускаем барабан
a++;//добавляем к переменной 1 с каждым интервалом
if(a>=10){a=0} //ограничиваем переменную до 10
count--;
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_1.length;i++) imgs_1[i].src = pics[(i+count)%pics.length];
if(a==b) { clearInterval(setInt1);	//останавливаем интервал 
      res1 = "Барабан 1 " + document.querySelectorAll('.carousel_1 img')[1].src;
  if(res2 != "" && res3 != "") result.innerHTML = res1 + "<br>" + res2 + "<br>" + res3;
 }
}

function slider2(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;	
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_2.length;i++) imgs_2[i].src = pics[(i+count)%pics.length];
if(a==c) { clearInterval(setInt2); //останавливаем интервал
   res2 = "Барабан 2 " + document.querySelectorAll('.carousel_2 img')[1].src;
   if(res1 != "" && res3 != "") result.innerHTML =res1 + "<br>" + res2 + "<br>" + res3;
  }
}

function slider3(){//запускаем барабан
a++;
if(a>=10){a=0}//ограничиваем переменную до 10
count--;		
if(count<0) count = pics.length-1;
for(let i =0; i<imgs_3.length;i++) imgs_3[i].src = pics[(i+count)%pics.length];
if(a==d) { clearInterval(setInt3)//останавливаем интервал
    res3 = "Барабан 3 " + document.querySelectorAll('.carousel_3 img')[1].src;
  if(res1 != "" && res2 != "") result.innerHTML =res1 + "<br>" + res2 + "<br>" + res3; 
 }
}})
</script>

Простите, не совсем понял для чего нужна эти условные конструкции
if(res1 != "" && res2 != "")
if(res2 != "" && res3 != "")
if(res1 != "" && res3 != "")
строки 60;72;84;

Dilettante_Pro 04.04.2018 18:28

Цитата:

Сообщение от Javany11
Простите, не совсем понял для чего нужна эти условные конструкции
if(res1 != "" && res2 != "")
if(res2 != "" && res3 != "")
if(res1 != "" && res3 != "")
строки 60;72;84;

Для того, чтобы результат выводился после остановки всех барабанов, когда сформировался результат по каждому - так сказать, окончательный итог.
Вместо result.innerHTML = ... можно подставить вызов функции обработки результата

Javany11 04.04.2018 22:09

Цитата:

Сообщение от Dilettante_Pro (Сообщение 482304)
Для того, чтобы результат выводился после остановки всех барабанов, когда сформировался результат по каждому - так сказать, окончательный итог.
Вместо result.innerHTML = ... можно подставить вызов функции обработки результата

Разобрался. Да, действительно, так удобнее. Спасибо.


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