Споменах в коментарите, че Javascript typeahead библиотека може да бъде добър избор за вас. Намерих библиотеката Typeahead на Twitter и двигателя Bloodhound за доста стабилни. За съжаление, документацията е смесена:докато това, от което се нуждаете, е много подобно на техните примери, вие сте златен, но някои подробности (обяснения на токенизаторите, например) липсват.
В един от няколко въпроса относно Typeahead тук в Stack Overflow, @JensAKoch казва:
Честно казано, при кратка проверка документацията на разклонението изглежда малко по-добре, ако не друго. Може да искате да го проверите.
Код от страна на сървъра:
Прилагат се всички предупреждения за използване на стара версия на PHP. Горещо препоръчвам преоборудване за използване на PDO с PHP 5, но този пример използва PHP 4, както е поискано.
Напълно нетестван PHP код. json_encode()
би било по-добре, но не се появява до PHP 5. Вашата крайна точка ще бъде нещо като:
headers("Content-Type: application/json");
$results = mysql_query(
"SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers"
);
$fields = array("ID","StageName","AKA1","AKA2","LegalName","SoundEx");
echo "[";
$first = true;
while ($row = mysql_fetch_array($results)) {
($first) ? $first = false : echo ',';
echo "\n\t,{";
foreach($fields as $f) {
echo "\n\t\t\"{$f}\": \"".$row[$f]."\"";
}
echo "\n\t}";
}
echo "]";
Код от страна на клиента:
Този пример използва статичен JSON файл
като мъниче за всички резултати. Ако очаквате наборът от резултати да надхвърли 1000 записа, трябва да погледнете remote
опция на Bloodhound
. Това ще изисква да напишете някакъв персонализиран PHP код, за да обработите заявката, но ще изглежда до голяма степен подобно на крайната точка, която изхвърля всички (или поне най-често срещаните) данни.
var actors = new Bloodhound({
// Each row is an object, not a single string, so we have to modify the
// default datum tokenizer. Pass in the list of object fields to be
// searchable.
datumTokenizer: Bloodhound.tokenizers.obj.nonword(
'StageName','AKA1','AKA2','LegalName','SoundEx'
),
queryTokenizer: Bloodhound.tokenizers.whitespace,
// URL points to a json file that contains an array of actor JSON objects
// Visit the link to see details
prefetch: 'https://gist.githubusercontent.com/tag/81e4450de8eca805f436b72e6d7d1274/raw/792b3376f63f89d86e10e78d387109f0ad7903fd/dummy_actors.json'
});
// passing in `null` for the `options` arguments will result in the default
// options being used
$('#prefetch .typeahead').typeahead(
{
highlight: true
},
{
name: 'actors',
source: actors,
templates: {
empty: "<div class=\"empty-message\">No matches found.</div>",
// This is simply a function that accepts an object.
// You may wish to consider Handlebars instead.
suggestion: function(obj) {
return '<div class="actorItem">'
+ '<span class="itemStageName">'+obj.StageName+"</span>"
+ ', <em>legally</em> <span class="itemLegalName">'+obj.LegalName+"</span>"
}
//suggestion: Handlebars.compile('<div><strong>{{value}}</strong> – {{year}}</div>')
},
display: "LegalName" // name of object key to display when selected
// Instead of display, you can use the 'displayKey' option too:
// displayKey: function(actor) {
// return actor.LegalName;
// }
});
/* These class names can me specified in the Typeahead options hash. I use the defaults here. */
.tt-suggestion {
border: 1px dotted gray;
padding: 4px;
min-width: 100px;
}
.tt-cursor {
background-color: rgb(255,253,189);
}
/* These classes are used in the suggestion template */
.itemStageName {
font-size: 110%;
}
.itemLegalName {
font-size: 110%;
color: rgb(51,42,206);
}
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>
<p>Type something here. A good search term might be 'C'.</p>
<div id="prefetch">
<input class="typeahead" type="text" placeholder="Name">
</div>
За улеснение ето същността на кода от страна на клиента .