JavaScript - Buscador letra por letra

 
Vista:
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 02/06/2020 03:07:54
Hola a todos! he de hacer un ejercicio y llevo ya 4 días in poder hacerlo...
Consiste en lo siguiente:
Escribir en un campo de texto los nombres de las fotos y que el buscador las vaya filtrando por orden de letra:

Por ejemplo tengo una imagen que se llama felino, en el buscador con poner una 'f' ya tiene que salir (junto con las otras que empiezan por f). Si después pongo la letra 'e' (fe) tienen que salirme las fotos que empiezan por 'fe' y el resto tienen que desaparecer. No encuentro la forma, lo estoy haciendo con keyup en el input. Si alguien me pudiera ayudar estaría súper agradecido!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 03/06/2020 03:28:16
Sii! Exacto! muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 03/06/2020 04:30:50
El caso es que tengo algo parecido en cuanto la funcionalidad. la cuestión es que no se como decirle que al borrar las el contenido del input vayan apareciendo o desapareciendo las imágenes, eso y que a medida que vaya escribiendo no se repita.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const array_paraules = [
  "flor",
  "manta",
  "fleca",
  "ment",
  "feli",
  "menta",
  "fletxa",
];
 
const array_imatges = [
  "flor.jpg",
  "manta.jpg",
  "fleca.jpg",
  "ment.webp",
  "feli.jpg",
  "menta.jpg",
  "fletxa.jpg",
];
 
 
 
window.onload = function () {
  let paraula = document.getElementById("paraula");
  paraula.addEventListener("keyup",buscar);
  paraula.addEventListener('keydown', function(e) {
    let borrar = e.key;
    let txt = paraula.value;
    if (borrar == "Backspace") {
        txt.length -= 1;
    }
});
}
 
 
 
function buscar(){
  let contenidor = document.getElementById("contenidor");
  let txt = paraula.value;
  let tope = array_paraules.length;
 
 
  for(let i = 0; i<tope; i++){
    let foto = document.createElement("IMG");
    if(txt.length == 0){
      foto.hidden = true;
    }
 
    else if(array_paraules[i].indexOf(txt) > -1){
      foto.setAttribute("src", "img/"+array_imatges[i]);
      foto.setAttribute("width", "200");
      foto.setAttribute("height", "161");
      contenidor.appendChild(foto);
      foto.hidden = false;
    }
  }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Moises
Val: 47
Ha disminuido su posición en 12 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por Moises (19 intervenciones) el 03/06/2020 19:50:11
comenta el codigo, pon una pequeña descripcion a cada bloque de codigo para saber que es lo que hace.... lo que intentas hacer lo puedes realizar con la funcion .filter().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 03/06/2020 21:13:01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//ARRAY CON LAS PALABRAS DEL BUSCADOR
 
const array_paraules = [
  "flor",
  "manta",
  "fleca",
  "ment",
  "feli",
  "menta",
  "fletxa",
];
 
//ARRAY CON EL NOMBRE DE LAS IMÁGENES
 
const array_imatges = [
  "flor.jpg",
  "manta.jpg",
  "fleca.jpg",
  "ment.webp",
  "feli.jpg",
  "menta.jpg",
  "fletxa.jpg",
];
 
 
 
window.onload = function () {
  //Recogemos el ID del campo de texto que se llama "paraula" (está en catalán)
  let paraula = document.getElementById("paraula");
 
  //Hacemos la acción mediante keyup ejecutando la función buscar
  paraula.addEventListener("keyup",buscar);
 
}
 
 
function buscar(){
  //EN EL HTML HAY UN DIV CON ID "contenidor", RECOGEMOS ESE ID.
  let contenidor = document.getElementById("contenidor");
  //GUARDAMOS EN UNA VARIABLE EL VALOR DEL CAMPO DE texto
  let txt = paraula.value;
  //VARIABLE QUE GUARDA LA LONGITUD DEL ARRAY DE LAS PALABRAS
  let tope = array_paraules.length;
 
  //BUCLE FOR QUE RECORRE EL ARRAY DE LAS PALABRAS
  for(let i = 0; i<tope; i++){
    //CREAMOS UN ELEMENTO TIPO IMAGEN (IMG)
    let foto = document.createElement("IMG");
    //Si el texto está vacío, oculta las fotos
    if(txt.length == 0){
      foto.hidden = true;
    }
    //Si el contenido del array es = al texto del input, busca la imagen de su ruta, poniendo el directorio/array_imatges
    //(que es el array del nombre de las imágenes)
    else if(array_paraules[i].substring(0,txt.length) == txt){
      foto.setAttribute("src", "img/"+array_imatges[i]);
      foto.setAttribute("width", "200");
      foto.setAttribute("height", "161");
      //Imprimimos las fotos dentro del DIV.
      contenidor.appendChild(foto);
      //Ponemos las fotos en display block
      foto.style.display = "block";
 
    }
  }
 
}






CÓDIGO HTML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <style>
      input {
        margin: 10px 0px;
      }
    </style>
    <title>DOM Recuperación</title>
  </head>
  <body>
    <div>
      <input
        type="text"
        name="paraula"
        id="paraula"
        placeholder="Indica la paraula a buscar"
        size="50"
        autofocus
      />
      <br />
      <div id="contenidor">
      </div>
    </div>
 
    <script src="index.js"></script>
  </body>
</html>


Ahora, el filtro lo hace bien todo, pero se van repitiendo las fotos y solo tienen que salir una vez. Mi profesor me ha dicho que estoy creando constantemente las fotos y por eso se imprimen todo el rato y me ha dicho que pruebe eliminandolas a la vez, pero no me funciona muy bien.
Captura
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de moises
Val: 47
Ha disminuido su posición en 12 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por moises (19 intervenciones) el 04/06/2020 05:39:34
Puedes agregar dos lineas de codigo:

#1: Esta linea la tienes q poner antes de tu ciclo for.
1
for (const img of document.querySelectorAll('img')) img.style.display = 'none';

Esta linea la tienes q reemplazar por el "if" que esta dentro de tu ciclo for
#2:
1
if (txt.length == 0) continue;

Prueba y ocmenta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 04/06/2020 05:55:42
Sii!!! funciona!!!! Me has salvado la vida, no se como agradecertelo... de verdad no tengo palabras para mostrar mi agradecimiento!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de moises
Val: 47
Ha disminuido su posición en 12 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por moises (19 intervenciones) el 04/06/2020 05:59:20
Solo valora la respuesta!!! jajajajaja

De nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 04/06/2020 06:00:00
Voy!! jajajaja que soy nuevo en esto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 04/06/2020 18:18:47
Esto es lo ultimo: si ahora en el caso que lo que escribas no coincide con nada, me gustaría que salga una foto diciendo que esto no coincide.
Esto es lo que he echo pero ni siquiera imprime la imagen:

1
2
3
4
5
6
7
8
9
10
if(txt.length !== 0 && array_paraules.length = 0){
     let what = document.createElement("IMG");
     console.log("quedius")
     what.setAttribute("src", "img/quedices.jpg");
     what.setAttribute("width", "330");
     what.setAttribute("height", "260");
     contenidor.appendChild(what);
     what.style.display = "block";
 
}

Básicamente es, que si lo que escribes en el texto es diferente a 0 y la longitud del array es 0 (ya que se supone que así no ha encontrado nada) que ponga la foto. Esto está fuera del bucle for pero no hace caso de nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de moises
Val: 47
Ha disminuido su posición en 12 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por moises (19 intervenciones) el 04/06/2020 23:28:44
recuerda poner comentarios en el codigo y poner el codigo completo por que no se en donde va ese condicional
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 05/06/2020 00:27:52
Aquí te lo dejo:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//ARRAY DE LAS PALABRAS PARA EL INPUT
 
const array_paraules = [
  "flor",
  "manta",
  "fleca",
  "ment",
  "feli",
  "menta",
  "fletxa",
];
 
//ARRAY DE LAS IMAGENES PARA COMPARAR CON LAS PALABRAS
 
const array_imatges = [
  "flor.jpg",
  "manta.jpg",
  "fleca.jpg",
  "ment.webp",
  "feli.jpg",
  "menta.jpg",
  "fletxa.jpg",
];
 
//Creamos un elemento IMG específico para la foto que ha de salir cuando ninguna palabra coincide
let what = document.createElement("IMG");
what.setAttribute("src", "img/quedices.jpg"); //Ruta y nombre de dicha foto
what.setAttribute("width", "220");
what.setAttribute("height", "161");
what.setAttribute("id","what"); //Le ponemos un id
what.hidden = true; //Decimos que esté oculta por defecto
document.body.appendChild(what); //Elemento que sea hijo del body
let idWhat = document.getElementById("what"); //Guardamos la id de la foto "quedices.jpg" en una variable
 
 
window.onload = function () {
  let paraula = document.getElementById("paraula");
  paraula.addEventListener("keyup",buscar); //addEventListener del input para sacar las fotos
  paraula.addEventListener("keyup",quedices); //FUNCIÓN NUEVA PARA LA FOTO DE QUEDICES
}
 
 
 
function buscar(){
  let contenidor = document.getElementById("contenidor"); //Recogemos id del div
  let txt = paraula.value; //Recogemos el valor del texto que escribimos en el input
  let tope = array_paraules.length; //Guardamos en una variable la longitud del array
 
  //Bucle que selecciona todos los elementos IMG y luego los borra (para que posteriormente aparezcan
  // y se vayan borrando depende de lo que pongas en el input, para no tener muchisimas fotos en oculto)
  for(let img of contenidor.querySelectorAll('img')){
    img.parentNode.removeChild(img);
  }
  //Bucle que recorre el array_paraules
  for(let i = 0; i<tope; i++){
    //Creamos un elemento IMG para todas las fotos
    let foto = document.createElement("IMG");
    //Si la longitud del texto = 0 continua con el bucle
    if(txt.length == 0){
      continue;
    }
    //Si el contenido del array coincide con el texto, crea las fotos del array_imatges
    else if(array_paraules[i].substring(0,txt.length) == txt){
 
      foto.setAttribute("src", "img/"+array_imatges[i]);
      foto.setAttribute("width", "220");
      foto.setAttribute("height", "161");
      foto.setAttribute("id","imatge"+i); //ID de las imagenes del array
      contenidor.appendChild(foto);
      foto.style.display = "block";
      let idImg = document.getElementById("imatge"+i); //Recogemos la id de las imagenes
 
      //Si el raton se pone encima de las fotos las hace mas grandes
      idImg.addEventListener("mouseover",function(){
        idImg.style.width = "400px";
        idImg.style.height = "300px";
      });
      //Si el raton sale de las fotos las devuelve al tamaño original
      idImg.addEventListener("mouseout",function(){
        idImg.style.width = "220px";
        idImg.style.height = "161px";
      });
 
    }
 
    }
 
}
 
//FUNCIÓN PARA QUE SALGA LA FOTO QUE DICES EN CASO DE QUE NADA COINCIDA
function quedices(){
  let txt = paraula.value; //valor del input
  let tope = array_paraules.length; //longitud del array_paraules
  //bucle que recorre array_paraules
  for(let j = 0; j<tope; j++){
    //Si la longitud del texto NO es 0 y el contenido del array es diferente al texto muestra la foto que dices
    if(txt.length !== 0 && array_paraules[j].substring(0,txt.length) !== txt){
 
      what.hidden = false;
      idWhat.style.display = "block";
      //Si la longitud es diferente a 0 y el contenido del array es igual al texto del input ocultala
    }else if(tope !== 0 && array_paraules[j].substring(0,txt.length) == txt){
      what.hidden = true;
      idWhat.style.display = "none";
    }
  }
}


El problema es que funciona a medias, si que es cierto que cuando pones una letra que no coincide te sale directamente la foto. Cuando pones las que empiezan por "f" no sale en el primer listado, pero a medida que vas escribiendo y vas filtrando las fotos si aparece, pero si pongo las que empiezan por "m" aparece directamente junto con esas fotos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 05/06/2020 00:48:06
Esta parte la hace bien
quedices

Pero por ejemplo esa imagen ya está filtrada y aparece igualemente
feli
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de moises
Val: 47
Ha disminuido su posición en 12 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por moises (19 intervenciones) el 05/06/2020 15:00:55
resolviste?? El problema es que tu profesor no les dijo que la mejor respuesta es la mas sencilla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 24
Ha disminuido su posición en 7 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Buscador letra por letra

Publicado por David (12 intervenciones) el 05/06/2020 23:18:41
Mi profesor me dijo esto, porque me quedé hasta muy tarde y le acabé preguntando. Me respondió esto:

La imagen "que dices" tiene que aparecer cuando haya texto introducido dentro de la caja de texto y este texto NO coincida con ningún elemento del array, por tanto, cuando recorres array_paraules hazte un contador y si cuando acabes es cero pues imprime "que dices". Deja de ocultar imágenes, si tienes 100.000 imágenes ¿le vas ha enviar las 100.00 ocultas para mostrar 2 o 3? No tiene sentido. Elimina primero todos los elementos del DIV y añade sólo las imágenes que coincidan.

No lo he probado mucho porque he estado ocupado haciendo otros trabajos, pero básicamente no me ha resuelto mucho...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar