我有一个表单,其中包含多个需要具有自动完成功能的字段,并且我使用的是“ multiple”选项,以便每个字段可以选择多个值。我可以使用单个数据源使一切正常工作。
这是问题所在:每个字段都需要一个不同远程数据源(php文件输出JSON数组)。我想使用自定义data-attribute
列出JSON数据源URL。
这是我的输入之一:
<input type="text" name="frr" id="frr" data-searchsource="searchFrr.php" class="autofillme">
这是jQuery的功能-我没有收到任何控制台错误,但它不起作用(自动完成功能根本不再起作用)。如果我为"searchFrr.php"
请求在$.getJSON
中进行了硬编码,则一切正常(使用该单个数据源)。
任何想法如何使它正常工作?非常感谢您的光临! :)
$( 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( $(this).data("searchsource"), {
term: extractLast( request.term )
}, 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;
}
});
});
});
答案 0 :(得分:0)
最后,我无法通过尝试的方法实现想要的目标。我敢肯定,在jQuery中更出色的人将能够弄清楚。
我确实找到了一个解决方案,该解决方案使我可以根据键入的字段使用不同的数据源。这是使用jQuery UI自动完成功能,远程数据源和“多个”选项,因此可以使用多个值每个字段选择。我向要自动完成的表单中的每个输入添加了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";
}
最终这可能不是一个出色的解决方案,也不是特别可扩展的解决方案,但它确实可以满足我的要求-因此可以解决我的问题。希望它对那些正在做类似事情的人有用。