| 
	| 
	
	| 
		
	| 
			
			 
			
				24.06.2017, 05:56
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| 
				Событие input, проверка значения
			 Появляется тот блок с классом, которое передаётся через input. 
Проблема в том, что, когда число стираешь, то в консоле появляется ошибка Uncaught TypeError: Cannot read property 'classList' of undefined
 
Не понимаю почему, я же написал условие, если такого элемента в массиве нет, то ничего делать не надо
 
<style>
.hidden {
  display: none;
}
.img {
  width: 200px;
  height: 200px;
}
.img1 {background: green;}
.img2 {background: blue;}
.img3 {background: red;}
</style>
<input type="text" class="input">
<div class="img img1 hidden"></div>
<div class="img img2 hidden"></div>
<div class="img img3 hidden"></div>
<script>
var input =  document.querySelector('.input');
var img = document.querySelectorAll('.img');
var arr = [];
img.forEach(function(el, i) {
  arr.push(i);
 })
 
input.oninput = function() {
	img.forEach(function(element, i) {
  
  	if(arr.indexOf(Number(input.value)) != -1) {
    	img[input.value - 1].classList.remove('hidden');
    }
  	else{
    	img[i].classList.add('hidden');
    }
    
  })
}
</script>
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 09:35
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| DivMan,Number(input.value) равен нулю если  value = "", img[input.value - 1] будет img[-1] - такого элемента нет
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 14:01
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 01.12.2016 
						Сообщений: 3,650
					 
		
 |  |  
	| 
<html>
<head>
	<meta charset="utf-8">
	<style>
		.hidden {
			display: none;
		}
		.img {
			width: 200px;
			height: 200px;
		}
		.img1 {background: green;}
		.img2 {background: blue;}
		.img3 {background: red;}
	</style>
</head>
<body>
	<input type="text" class="input">
	<div class="img img1 hidden"></div>
	<div class="img img2 hidden"></div>
	<div class="img img3 hidden"></div>
	<script>
		var input =  document.querySelector('.input');
		input.oninput = function() {
			var img = document.querySelectorAll('.img'), i = img.length, v = input.value-1;
			while (i--) img[i].classList.add('hidden');
			if (v>=0 && v <3) img[v].classList.remove('hidden');
		};
	</script>
</body>
</html>
так?			 Последний раз редактировалось j0hnik, 24.06.2017 в 14:05.
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 22:17
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| Ну вот, я изменил, теперь по идеи должно правильно работать, но почему-то не работает, и не понятно, почему не добавляет класс hidden, если в input пусто? 
var input =  document.querySelector('.input');
var img = document.querySelectorAll('.img');
var arr = [];
img.forEach(function(el, i) {
  arr.push(i);
 })
 
 console.log(arr)
 
input.oninput = function() {
console.log(input.value);
	img.forEach(function(element, i) {
  	if(arr.indexOf(Number(input.value)) != -1) {
    	img[input.value].classList.remove('hidden');
    }
    
     if(input.value == '') {
    	img[i].classList.add('hidden');
      console.log('Пусто');
    }
 
  })
}
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 22:18
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| Вот так ошибок не выдаёт, но почему-то если стереть поле, то элемент не удаляется, я же для этого, аж 2 условия сделал. 
var input =  document.querySelector('.input');
var img = document.querySelectorAll('.img');
var arr = [];
img.forEach(function(el, i) {
  arr.push(i);
 })
 
 console.log(arr)
 
input.oninput = function() {
console.log(input.value);
	img.forEach(function(element, i) {
  	if(input.value == '') { 
    	img[i].classList.add('hidden'); 
     } 
    if(arr.indexOf(Number(input.value)) != -1) {      img[Number(input.value)].classList.remove('hidden');
    } 
    else {
    		img[i].classList.add('hidden'); 
    }
 
  })
}
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 22:41
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| А вот так, скрывает все элементы, но почему-то самый первый не скрывает 
<style>
.hidden {
  display: none;
}
.img {
  width: 200px;
  height: 200px;
}
.img1 {background: green;}
.img2 {background: blue;}
.img3 {background: red;}
</style>
<input type="text" class="input">
<div class="img img1 hidden"></div>
<div class="img img2 hidden"></div>
<div class="img img3 hidden"></div>
<script>
var input =  document.querySelector('.input');
var img = document.querySelectorAll('.img');
var arr = [];
img.forEach(function(el, i) {
  arr.push(i);
 })
 
 console.log(arr)
 
input.oninput = function() {
 console.log(img[Number(input.value)])
	img.forEach(function(element, i) {
  
  if(arr.indexOf(Number(input.value)) != -1) {      	      img[Number(input.value)].classList.remove('hidden');
    } 
  	if(input.value === '') { 
    	element.classList.add('hidden'); 
      
     } 
    
 
  })
}
</script>
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 22:50
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| DivMan,
    
<html>
<head>
  <meta charset="utf-8">
  <style>
    .hidden {
      display: none;
    }
    .img {
      width: 200px;
      height: 200px;
    }
    .img1 {background: green;}
    .img2 {background: blue;}
    .img3 {background: red;}
  </style>
</head>
<body>
  <input type="text" class="input">
  <div class="img img1 hidden"></div>
  <div class="img img2 hidden"></div>
  <div class="img img3 hidden"></div>
  <script>
var input = document.querySelector(".input");
var img = document.querySelectorAll(".img");
var arr = [];
img.forEach(function(el, i) {
    arr.push(i)
});
console.log(arr);
input.oninput = function() {
    console.log(input.value);
    img.forEach(function(element, i) {
        if (input.value - 1 == i) img[i].classList.remove("hidden");
        else img[i].classList.add("hidden")
    })
};
  </script>
</body>
</html>
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 22:59
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| Спасибо |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 23:04
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| DivMan,arr лишний ... строки 27 - 31
 |  |  
	| 
		
	| 
			
			 
			
				24.06.2017, 23:05
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 08.03.2016 
						Сообщений: 429
					 
		
 |  |  
	| Но я всё равно не понимаю, почему, если написать так 
if (input.value == i) img[i].classList.remove("hidden");
     else {
       img[i].classList.add("hidden");
       }
то первый элемент не удаляется?
 
Вот я допустим ввожу 1 и появился второй блок, потом я его стираю и получается должно сработать условие else, потому что в инпуте нету такого значение, которое в i, там сейчас пусто и не понятно, почему в таком случае, не удаляется первый блок? |  |  |  |