Crea un buscador de imágenes (json) con Fuse.js - para principiantes

Buscador de imágenes con Json

Este buscador está basado en Fuse.js el cual es un poco complicado de entender si eres principiante, así que vamos a agregar el ejemplo completo para que funcione si o si a la primera.

Así que solo deberás copiar este código en un archivo html, puedes llamarlo como desees.

Ver demo



<!doctype html>
<html lang="es">
<head>
<title>Buscar imágenes</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
</head>
<body>
<body class="bg-light">

	<nav class="navbar navbar-dark bg-success">
	  <div class="container-fluid">
	    <a class="navbar-brand" href="https://www.guiaplaza.com">
	      <img src="https://www.guiaplaza.com/assets/guiaplaza.png" alt="guiaplaza" width="150" height="24" class="d-inline-block align-text-top">
	    </a>
	  </div>
	</nav>

<section style="background: #ffffff url('https://www.guiaplaza.com/imagenes/wim-van-t-einde-uj7eb7CgqRk-unsplash.jpg') no-repeat center/100%;" class="text-light">
	<div class="container">
		<div class="row justify-content-center pt-5 mb-3">
		<div class="col-auto text-center">
		<h1 class="display-4">Banco de imágenes</h1>
		</div>

		</div>

		<div class="row justify-content-center pb-3">
		 <div class="col-12 col-md-10 col-lg-8">
		<form class="card mb-3">
		<div class="card-body">
		<input class="form-control border-0 fs-2 search" type="text" id="search" value="" />
		</div>
		</form>
		<span class="text-bg-dark"> Ingrese una palabra </span>
		</div>
		</div>
	</div>

</section>

<div class="container-fluid px-5">
	<hr class="m-3">
	<p class="info" id="info"></p>
	<div class="row visual" id="visual"></div>
</div>

<footer class="container">
	<hr>
	<p>GuiaPlaza.com - Banco de Imágenes</p>
	<hr>
	<div class="my-3">
	  <label class="form-label text-muted">Palabras registradas que puedes usar</label>
	  <textarea class="form-control" rows="3" disabled>
	Barcelona, ciudades, Madrid, Bilbao, Valencia, cajas, regalos, obsequio, caja, regalo, canasta, navidad, madrileños, metro, lugares, estadio, madriguera
	  </textarea>
	</div>
</footer>

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8" crossorigin="anonymous"></script>

<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>

<script>
var searchEle = document.getElementById("search");
var visual = document.getElementById("visual");

var dataset = [
{"nombre":"Barcelona","largo":1280,"alto":720,"categoria":"ciudades","url":"https://www.guiaplaza.com/imagenes/benjamin-voros-oJsRqwMHWHI-unsplash.jpg"},
{"nombre":"Madrid","largo":1280,"alto":720,"categoria":"ciudades","url":"https://www.guiaplaza.com/imagenes/florian-wehde-WBGjg0DsO_g-unsplash.jpg"},
{"nombre":"Bilbao","largo":1280,"alto":720,"categoria":"ciudades","url":"https://www.guiaplaza.com/imagenes/sebastian-staines-8z1seJUwg2A-unsplash.jpg"},
{"nombre":"Valencia","largo":1280,"alto":720,"categoria":"ciudades","url":"https://www.guiaplaza.com/imagenes/juan-gomez-bLBrjMXw-5k-unsplash.jpg"},
{"nombre":"cajas regalos","largo":1280,"alto":720,"categoria":"obsequio","url":"https://imgs.deperu.com/navidad/regalos.jpg"},
{"nombre":"caja regalo","largo":720,"alto":1280,"categoria":"obsequio","url":"https://imgs.deperu.com/navidad/regalo_caja_verde.jpg"},
{"nombre":"canasta navidad","largo":720,"alto":1280,"categoria":"obsequio","url":"https://imgs.deperu.com/alimentacion/canasta_navidad.jpg"},
{"nombre":"madrileños","largo":720,"alto":1280,"categoria":"obsequio","url":"https://phantom-marca.unidadeditorial.es/9d5e10f324e29fcadb01086fd6f0bd15/resize/1320/f/webp/assets/multimedia/imagenes/2022/05/13/16524550918680.jpg"},
{"nombre":"metro Madrid","largo":720,"alto":1280,"categoria":"lugares","url":"https://www.autofacil.es/wp-content/uploads/2021/05/istock-1-4.jpg"},
{"nombre":"estadio Barcelona","largo":854,"alto":1280,"categoria":"lugares","url":"https://www.fcbarcelona.com/photo-resources/2021/08/09/d4236e65-4502-4cca-816d-a97c441abdac/Camp-nou-1.jpg?width=1200&height=750"},
{"nombre":"madriguera","largo":720,"alto":1280,"categoria":"lugares","url":"https://www.deperu.com/diccionario/imagenes/palabra-madriguera.jpg"}];

const options = {
	shouldSort: true,
	findAllMatches: true,
	threshold: 0.3,
	location: 0,
	distance: 100,
	minMatchCharLength: 1,
	keys: ["nombre", "categoria"]
};

const myIndex = Fuse.createIndex(options.keys, dataset);
const fuse = new Fuse(dataset, options, myIndex);

// BUSCA
function iniciaBusqueda() {

	var resultJSON = fuse.search(searchEle.value);
	document.title = searchEle.value + ' - Buscando...';

	document.getElementById("info").innerHTML = `Encontradas <strong>${resultJSON.length} imágenes</strong> de ${dataset.length} con su texto de consulta.`;
	
	tarjeta = '';
		resultJSON.forEach(imagen => {

			tarjeta += '<div class="col-3 mb-3"><div class="card"><img class="card-img-top fondo" src="' + imagen.item.url + '"><div class="card-body"><p><input class="form-control" onClick="this.select();" value="' + imagen.item.url + '"></p><h5 class="card-title">' + imagen.item.nombre + '</h5><span class="badge bg-primary">' + imagen.item.categoria + '</span> <span class="badge bg-success">' + imagen.item.largo + ' x ' + imagen.item.alto + '</span></div></div></div>';
		});

		visual.innerHTML = tarjeta;
		resultJSON.length = 0;
}

var delayedSearch;

searchEle.addEventListener("input", () => {
	if (delayedSearch) {
		clearTimeout(delayedSearch);
	}
	delayedSearch = setTimeout(iniciaBusqueda, 750);
});

iniciaBusqueda();

</script>



</body>
</html>

La lista de imágenes (dataset) es un objeto en Json, la estructura puede cambiar.

Gracias a Derek por la explicación de cómo funciona Fuse.js

Comentarios

Entradas populares de este blog

Superponer una imagen sobre otra con CSS

¿Ganas dinero en Facebook con Página, Grupo, Comunidad, etc?

Script para buscar palabras o textos en una página (html) con Jquery