Estoy creando una tabla filtrada en JavaScript. Todo está bien. Sin embargo, la única línea que no parece funcionar es inputValue = ''. No estoy seguro de por qué no quiere borrar el campo después de finalizar el filtrado.

Si reemplaza eso con document.querySelector('.form__input').value las cosas parecen funcionar, pero no quiero repetir el mismo código. Ya lo he declarado arriba como inputValue.

const initValues = [
	'Walmart',
	'State Grid',
	'Sinopec Group',
	'China National Petrolium',
	'Royal Dutch Shell',
	'Toyota Motor',
	'Volkswagen',
	'BP',
	'Exxon Mobil',
	'Berkshire Hathaway'
];

const tableCreation = array => {
	const tableBody = document.querySelector('.table__body');
	document.querySelectorAll('tr').forEach(el => el.parentNode.removeChild(el));
	array.forEach(el => {
		const row = document.createElement('tr');
		const cell = document.createElement('td');
		const cellText = document.createTextNode(el);
		cell.appendChild(cellText);
		row.appendChild(cell);
		tableBody.appendChild(row);
	});
};

tableCreation(initValues);

const filterTable = event => {
	event.preventDefault();
	let inputValue = document.querySelector('.form__input').value;
	const filtered = initValues.filter(el => el.toLowerCase().includes(inputValue.toLowerCase()));
	if (filtered) {
		inputValue ? tableCreation(filtered) : tableCreation(initValues);
	}
	inputValue = '';
};

document.querySelector('.form__button').addEventListener('click', filterTable);
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<link rel="stylesheet" href="./css/3.css">
	<title>Filtered list</title>
</head>
<body>
	<form class="form" id="form">
		<label for="filter">Filtered: </label>
		<input class="form__input" type="text" id="filter" name="input" placeholder="Insert phrase...">
		<button class="form__button" form="form" type="submit">Filter</button>
	</form>

	<table class="table">
		<tbody class="table__body"></tbody>
	</table>

	<script src="./js/3.js"></script>
</body>
</html>
0
Bart 10 may. 2019 a las 12:05

3 respuestas

La mejor respuesta

La variable inputValue contiene solo el valor real del campo, está separado de él.

Puede guardar una referencia al campo como una variable y limpiar el valor de la siguiente manera:

const inp = document.querySelector('.form__input');
inp.value = '';
1
ttulka 10 may. 2019 a las 09:15

Ya obtienes valor solo de inputvalue., Pero no puedes cambiar ese valor, por lo que get instancia dom también cambia amablemente este código a

const filterTable = event => {
    event.preventDefault();
    let inputElement = document.querySelector('.form__input'),
        inputValue = inputElement.value;
    const filtered = initValues.filter(el => el.toLowerCase().includes(inputValue.toLowerCase()));
    if (filtered) {
        inputValue ? tableCreation(filtered) : tableCreation(initValues);
    }
    inputElement.value = '';
};

1
sarvon ks 10 may. 2019 a las 09:11
let inputValue = document.querySelector('.form__input').value;

Esta línea devuelve el valor de cadena de la entrada. Cuando intenta inputValue = ''; solo está cambiando el valor de la variable 'inputValue' pero no del campo de entrada.

Para hacer esto, solo guarde su campo como una variable en lugar de su valor y luego cambie su valor:

let inputField = document.querySelector('.form__input');
const filtered = initValues.filter(el => el.toLowerCase().includes(inputValue.toLowerCase()));
if (filtered) {
    inputValue ? tableCreation(filtered) : tableCreation(initValues);
}
inputField.value = '';
1
colin renaud 10 may. 2019 a las 09:10