Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как заменить элементы массива? (https://javascript.ru/forum/misc/69415-kak-zamenit-ehlementy-massiva.html)

webxmm 20.06.2017 21:16

Как заменить элементы массива?
 
Такой вопрос (код не надо писать, пока), помогите плиз логикой.

Есть Массив_А (4 картинки) и кнопка СТАРТ.
Нажимаешь на кнопку и в ДИВ отображаются эти 4 элемента (картинки).

Потом есть МАССИВ_Б (2 картинки в нем) и кнопка ДОБАВИТЬ.
Нажимаешь на кнопку первый раз - картинка номер 3 должна пропасть из ДИВа, а вместо нее рандомно вставиться картинка из Массива_Б.
Нажимаешь второй раз - картинка номер 4 пропадает из ДИВа, а вместо нее вставляется вторая картинка из Массива_Б.

Что меня смущает... у меня есть ДИВ с изначально вставленными туда картинками ... как мне сделать поиск по этому диву, чтобы сначала заменить картинку номер 3, а потом номер 4? Мне кажется это нереально, а надо как-то заново перериовывать этот див ... что-то запутался...

j0hnik 20.06.2017 21:41

Ничего тут нереального нет.
поиск
document.querySelectorAll('div  img')

рандомная картинка из массива
Math.random()*arr.length;

заменить или вставить можно функцией
.replaceChild
.appendChild
.insertBefore

webxmm 20.06.2017 22:41

Цитата:

Сообщение от j0hnik (Сообщение 456080)
Ничего тут нереального нет.
поиск
document.querySelectorAll('div  img')

Вот это меня и интересовало... пробую так
var asd = document.body.querySelectorAll('div.imgArr > img');
	alert(asd);

То есть я пытаюсь найти все элементы IMG (которые с массива я вывожу) в диве с классом .imgArr и ради интереса посмотрел, что мне алерт вывел. А вывел он [object nodeList] .. Это что такое?

Хотя в конечно итоге мне надо получить сначала элемент номер 3, а потом 4 ...

j0hnik 20.06.2017 23:09

Цитата:

Сообщение от webxmm (Сообщение 456083)
Вот это меня и интересовало... пробую так
var asd = document.body.querySelectorAll('div.imgArr > img');
	alert(asd);

То есть я пытаюсь найти все элементы IMG (которые с массива я вывожу) в диве с классом .imgArr и ради интереса посмотрел, что мне алерт вывел. А вывел он [object nodeList] .. Это что такое?

Хотя в конечно итоге мне надо получить сначала элемент номер 3, а потом 4 ...

все потому что это коллекция узлов
var asd = document.body.querySelectorAll('div.imgArr > img');
alert(asd[0]); // первый элемент
alert(asd[1]); // второй  элемент

webxmm 20.06.2017 23:18

Цитата:

Сообщение от j0hnik (Сообщение 456085)
все потому что это коллекция узлов
var asd = document.body.querySelectorAll('div.imgArr > img');
alert(asd[0]); // первый элемент
alert(asd[1]); // второй  элемент

Попробовал так. Выводит Undefined

j0hnik 20.06.2017 23:27

<html lang="en">
<head>
	<meta charset="utf-8">
</head>
<body>
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
<div><img src="" alt=""></div>
<script>
var asd = document.querySelectorAll('div > img');
alert(asd[0]); // первый элемент
alert(asd[1]); // второй  элемент

	</script>
</body>
</html>


что-то делаете не так! :blink:

j0hnik 21.06.2017 01:23

Цитата:

Сообщение от webxmm (Сообщение 456087)
Попробовал так. Выводит Undefined

возможно у вас скрипт перед элементами HTML из за этого не работает

или проверьте "div.imgArr > img" есть ли у вас дивы с классом imgArr с прямыми потомками img

webxmm 23.06.2017 13:44

Цитата:

Сообщение от j0hnik (Сообщение 456112)
возможно у вас скрипт перед элементами HTML из за этого не работает

или проверьте "div.imgArr > img" есть ли у вас дивы с классом imgArr с прямыми потомками img

Спасибо, я просто вместо класса ИД прописал.
Попробовал теми функциями, что вы предложили (не совсем получилос, в коде кстати закомментированный код - это как я по-разному пытался).
Сделал так, посмотрите плз, правильно ли так(но там есть одна проблема. У меня заменяется последняя картинка - ОК. Но если я хочу сначала заменить предпоследнюю, а потом последнюю, то не выходит).
Код.

var arr = new Array("img/blue.jpg", "img/bline2.jpg", "img/close.png");
	  var arrRep = new Array("img/site.jpg", "img/x5.jpg");
	  
		function getImg(){
			
			for(var i = 0; i < arr.length; i++){
				document.getElementById("imgArr").innerHTML += "<img src=" + arr[i] + " />";
			}
		}

		function replaceImg(){
			var asd = document.querySelectorAll('div#imgArr > img');
			var willBeReplace = asd[2].parentNode.removeChild(asd[2]); 
			//alert(asd[2]);
			 var addedElemen = arrRep[1];
			document.getElementById("imgArr").innerHTML += "<img src=" + addedElemen + " />";
			
			
			//var  aaa = willBeReplace.replaceChild(addedElemen, willBeReplace.childNodes[0]);
			//alert(willBeReplace);
			
			// Create a new text node called "Water"
			//var textnode = arrRep[1];
			//alert(textnode);

			// Get the first child node of an <ul> element
			//var item = document.getElementById("imgArr").childNodes[2];
			//alert(item);
			//var item = document.querySelectorAll('div#imgArr > img');
			//alert(item[2]);

			// Replace the first child node of <ul> with the newly created text node
			//document.getElementById("imgArr").innerHTML = item.replaceChild(textnode, item.childNodes[2]);
			
			//alert(item);

<div class="animated" id="imgArr">
	</div>
	
	<div>
		<input type="button" value="Start" OnClick="getImg();" />
		<input type="button" value="Replace" OnClick="replaceImg();" />
	</div>
<div>

j0hnik 23.06.2017 16:06

Как советует один мой друг - учитесь сразу добавлять элементы правильно, чтобы в дальнейшем с кодом не было проблем!
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
	<div class="animated" id="imgArr"></div>	
	<div>
		<input type="button" value="Start"  id="id"/>
		<input type="button" value="Replace" id="id2"/>
	</div>
	<div>
		<script>
			var arr = ["img/blue.jpg", "img/bline2.jpg", "img/close.png"];
			var arrRep = ["img/site.jpg", "img/x5.jpg"];

			var el = document.getElementById('imgArr');

			document.getElementById("id").addEventListener('click', function(e) {
				for(var i=0; i<arr.length; i++ ){
					var img = document.createElement('img');
					img.src = arr[i]; 
					el.appendChild(img);
					this.removeEventListener(e.type, arguments.callee);
				}
			}, false);
		</script>
	</body>
	</html>

вот так мы добавляем, дальше пробуйте сами сделать замену

var rand = Math.floor(Math.random()*arrRep.length);
arrRep[rand]; // Это случайный элемент второго массива


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


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