В конце концов, мне не удалось добиться того, что я хотел, с помощью методов, которые я пытался. Я уверен, что кто-то более опытный в jQuery смог бы понять это.
Я нашел решение, которое позволяет мне использовать другой источник данных в зависимости от того, в какое поле вводится текст. Это использует jQuery UI Autocomplete, с удаленным источником данных и опцией «несколько», так что несколько значений могут быть выбрано для каждого поля Я добавляю класс autofillme
к каждому входу в моей форме, который я хочу автозаполнить.
JAVASCRIPT
$( function() {
function split( val ) {
return val.split( /,\s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}
$('.autofillme').each(function() {
$(this)
// don't navigate away from the field on tab when selecting an item
.on( "keydown", function( event ) {
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).autocomplete( "instance" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
source: function( request, response ) {
$.getJSON( "searchDB.php", {
term: extractLast( request.term ),
// adds an extra query string to the URL, sending the ID of the field sending the request
field: $(this).attr('element').attr('id')
}, response );
},
search: function() {
// custom minLength
var term = extractLast( this.value );
if ( term.length < 3 ) {
return false;
}
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
terms.push( "" );
this.value = terms.join( ", " );
return false;
}
});
});
});
PHP - searchDB.php
require "config.php"; // DB credentials stored here
$term = $_GET['term']; // What's been typed so far in the field
$field = $_GET['field']; // The ID of the field that's sending the request
try {
$connection = new PDO($DB, $username, $password, $options);
if ($field == 'field_A') {
$array = $connection->query("SELECT * FROM columnA where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($array);
}
elseif ($field == 'field_B') {
$array = $connection->query("SELECT * FROM columnB where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($array);
}
elseif ($field == 'field_C') {
$array = $connection->query("SELECT * FROM columnC where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($array);
}
else {
// whatever happens if no field sent
}
}
catch(PDOException $error) {
echo "A problem has occurred fetching data";
}
В конечном счете, это может быть не звездное решение, или, в частности, масштабируемое, но оно делает именно то, что я хочу - так что это решает мой вопрос. Надеюсь, это может пригодиться кому-то, кто занимается подобными вещами.