我在我的一个申请中使用Ajax Autocomplete for Jquery
(http://www.devbridge.com/projects/autocomplete/jquery/)。搜索表单看起来像这样:
<form id="topsearch" method="POST" action="/searchAll"><input type="text" class="searchform" name="q" id="q" value="Country, City, Hotel or a Tourist Attraction" o nfocus="clearInput(this);" onblur="defaultInput(this);" />
<select id="top_search_select" name="entity_type">
<option value="country">Countries</option>
<option value="city">Cities</option>
<option value="place" selected="selected">Tourist Attractions</option>
<option value="hotel">Hotels</option>
</select>
<input type="submit" name="topsearch" class="submit" value="SEARCH" title="SEARCH"/>
</form>
,自动完成配置如下所示:
<script type="text/javascript">
//<![CDATA[
var a = $('#q').autocomplete({
serviceUrl:'/search',
delimiter: /(,|;)\s*/, // regex or character
maxHeight:400,
width:325,
zIndex: 9999,
params: {entity_type:$('#top_search_select').val()},
deferRequestBy: 0, //miliseconds
noCache: false, //default is false, set to true to disable caching
onSelect: function(value, data){window.location.replace(data);},
});
//]]>
</script>
现在问题出现在后端,我有不同的处理程序,可以为用户通过表单中的选择选项选择的不同类型的实体生成结果。
默认情况下entity_type
是place
,它正好被传递给后端的处理程序。但是,我想要的是当一个人从脚本配置中params: {entity_type:$('#top_search_select').val()}
形式的选择框中选择一个不同的实体时,也会更新。
非常感谢任何帮助或想法。感谢。
答案 0 :(得分:6)
或者,您可以使用在发送ajax请求之前评估的函数来指定参数。
$('#q').autocomplete({
...
params: {
'entity_type': function() {
return $('#top_search_select').val();
}
}
...
});
答案 1 :(得分:3)
可能是一个老问题,但我觉得这是最好的方法:
$('#q').autocomplete({
...
onSearchStart: function(q) {
q.entity_type = $('#top_search_select').val();
}
...
});
答案 2 :(得分:1)
以上所有答案均不适用于我(我怀疑是因为我正在通过ajaxSettings变量传递“ POST”数据,这可能会影响“ params”,但我没有仔细检查)。
无论如何,所有评论都给出了很好的提示,我提出了以下建议:
var data={
'phrase': function() {
return $('#ajax_post').val();
},
'activity_id': function() {
return $('#activity_id').val();
}
}
var options = {
noCache: true,
transformResult: function(response) {
//whatever
},
onSelect: function(suggestion) {
//whatever
},
serviceUrl: "MyPHP.php",
ajaxSettings: {
dataType: "json",
method: "POST",
data: data
}
};
$("#ajax_post").autocomplete(options);
因此,我能够将ajax_post和activity_id输入字段的内容都传递给PHP脚本。
请注意,这还不够:
'phrase': $('#ajax_post').val()
由于其他答案中所述,该值变为静态。
答案 3 :(得分:0)
正如您的插件网站在此处使用http://www.devbridge.com/projects/autocomplete/jquery/中指定的那样,它返回的对象上有setOptions
方法,您可以稍后使用该方法动态更改选项。
在select元素上添加onchange
处理程序,并在每次用户选择其他值时更改params
选项,例如
$(function(){
var ac = $('#q').autocomplete({
serviceUrl:'/search',
delimiter: /(,|;)\s*/, // regex or character
maxHeight:400,
width:325,
zIndex: 9999,
params: {entity_type:$('#top_search_select').val()},
deferRequestBy: 0, //miliseconds
noCache: false, //default is false, set to true to disable caching
onSelect: function(value, data){window.location.replace(data);},
});
$("#top_search_select").change(function() {
ac.setOptions({params:{entity_type:$(this).val()}});
});
});
您应该将所有代码放在document ready
内。
答案 4 :(得分:0)
setOptions方法有效,但我们需要在choose change方法上调用它。所以将脚本更改为:
<script type="text/javascript">
//<![CDATA[
var a = $('#q').autocomplete({
serviceUrl:'/search',
delimiter: /(,|;)\s*/, // regex or character
maxHeight:400,
width:325,
zIndex: 9999,
params: {entity_type:$('#top_search_select').val()},
deferRequestBy: 0, //miliseconds
noCache: false, //default is false, set to true to disable caching
onSelect: function(value, data){window.location.replace(data);},
});
a.setOptions({params:{entity_type:$('#top_search_select').val()}});
//]]>
</script>
和On document ready函数添加:
$("#top_search_select").change(function() {
a.setOptions({params:{entity_type:$('#top_search_select').val()}});
});
答案 5 :(得分:0)
Pez的答案对我来说只是与'extraParams'略有不同。这使得参数动态而不是在页面加载时设置...
$("#field").autocomplete('pageurl.php', {
width: 240,
matchContains: true,
mustMatch: false,
selectFirst: false,
extraParams: {
start:function () {
return $("#start_date").val();
},
end: function () {
return $("#end_date").val() ;
}
}
});