17 - Autocompletar un control de tipo text


Simulador (Cuando presiona el botón "ejecutar el programa" se graban todos los cuadros de texto y se ejecuta el primero de la lista mostrando en una página el resultado)

Problema:

<html>
<head>
<title>Problema</title>
<script languaje="javascript" src="funciones.js" type="text/javascript"></script>
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<form action="#">
Ingrese una palabra que comience con a:<br>
<input type="text" id="palabra" autocomplete="off"><br>
<div id="resultados"></div>
<input type="submit" value="buscar">
</form>
</body>
</html>
#resultados {
  position:absolute;
  background:#ff0;
}

#menu {
  font-family: Arial;
  margin:0px;
  padding:0px;
}

#menu ul {
  margin:0px;
  padding:0px;
  list-style-type:none;
}

#menu a {
  display: block;
  padding: 3px;
  background-color: #f7f8e8;
  border-bottom: 1px solid #eee;
  text-align:center;
}

#menu a:link, #menu a:visited {
  color: #f00;
  text-decoration: none;
}

#menu a:hover {
  background-color: #369;
  color: #fff;
}
#menu a:hover {
  background-color: #369;
  color: #fff;
}
addEvent(window,'load',inicializarEventos,false);

function inicializarEventos()
{
  var ob=document.getElementById('palabra');
  addEvent(ob,'keyup',presionTecla,false);
}

var conexion1;
function presionTecla(e)
{
  conexion1=crearXMLHttpRequest();
  conexion1.onreadystatechange = procesarEventos;
  palabra=document.getElementById('palabra').value;
  conexion1.open('GET','pagina1.php?palabra='+palabra, true);
  conexion1.send(null);
}

function procesarEventos()
{
  var resultados = document.getElementById("resultados");
  if(conexion1.readyState == 4)
  {
    if (conexion1.status==200)
    {
      var xml = conexion1.responseXML;
      var pals=xml.getElementsByTagName('palabra');
      cadena='<div id="menu"><ul>';      
      for(f=0;f<pals.length;f++)
      {
        cadena = cadena + '<li><a>' + pals[f].firstChild.nodeValue + '</a></li>';  
      } 
      cadena = cadena + '</ul></div>';
      resultados.innerHTML = cadena; 
      var obj=document.getElementById("menu");
      var lista=obj.getElementsByTagName('a');
      for(f=0;f<lista.length;f++)
      {
        addEvent(lista[f],'click',seleccionPalabra,false);
      }
    }
    else
      alert(conexion1.statusText);
  } 
  else 
  {
    resultados.innerHTML = '<img src="../cargando.gif">';
  }
}

function seleccionPalabra(e)
{
  var enlace;
  if (window.event)
    enlace=window.event.srcElement;
  else
    enlace=e.target;
  document.getElementById('palabra').value=enlace.firstChild.nodeValue;
  document.getElementById('menu').style.display='none';
}

//***************************************
//Funciones comunes a todos los problemas
//***************************************
function addEvent(elemento,nomevento,funcion,captura)
{
  if (elemento.attachEvent)
  {
    elemento.attachEvent('on'+nomevento,funcion);
    return true;
  }
  else  
    if (elemento.addEventListener)
    {
      elemento.addEventListener(nomevento,funcion,captura);
      return true;
    }
    else
      return false;
}

function crearXMLHttpRequest() 
{
  var xmlHttp=null;
  if (window.ActiveXObject) 
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  else 
    if (window.XMLHttpRequest) 
      xmlHttp = new XMLHttpRequest();
  return xmlHttp;
}
<?php
$pal=$_REQUEST['palabra'];
$vec=array('alma','algo','amo','aro','animo','arbol','abrir');
if (strlen($pal)>0)
{
  for($f=0;$f<count($vec);$f++)
  {
    if ($pal==substr($vec[$f],0,strlen($pal)))
      $veciguales[]=$vec[$f];
  }
}
$xml="<?xml version=\"1.0\"?>\n";
$xml.="<palabras>\n";
if (isset($veciguales))
{
  for($f=0;$f<count($veciguales);$f++)
  {
    $xml.="<palabra>".$veciguales[$f]."</palabra>\n";
  }
}
$xml.="</palabras>\n";
header('Content-Type: text/xml');
echo $xml;
?>

Modificar el problema resuelto para permitir seleccionar con el mouse entre las palabras propuesta. Hacer que aparezca dentro del control text la que hacemos clic con el mouse.


Ver solución

pagina1.html







estilos.css




funciones.js




pagina1.php