8

我在我的一个应用程序中使用Ajax Autocomplete for Jqueryhttp://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()}脚本配置中的表单中的选择框中选择不同的实体时也会更新。

任何帮助或想法将不胜感激。谢谢。

4

6 回答 6

7

或者,您可以使用在发送 ajax 请求之前评估的函数指定参数。

$('#q').autocomplete({
    ...
    params: {
        'entity_type': function() {
            return $('#top_search_select').val();
        }
    }
    ...
});
于 2015-02-12T19:38:46.483 回答
2

可能是一个老问题,但我觉得这是最好的方法:

$('#q').autocomplete({
    ...
    onSearchStart: function(q) {
        q.entity_type = $('#top_search_select').val();
    }
    ...
});
于 2014-06-11T13:21:18.003 回答
0

正如您的插件站点在此处的用法中指定的那样http://www.devbridge.com/projects/autocomplete/jquery/它在它返回的对象上有一个setOptions方法,您可以稍后使用它来动态更改选项。

onchange在 select 元素上添加一个处理程序,并在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.

于 2012-06-03T07:18:12.563 回答
0

setOptions 方法有效,尽管我们需要在 selects 更改方法上调用它。所以将脚本更改为:

<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>

并在文档就绪功能上添加以下内容:

$("#top_search_select").change(function() {
  a.setOptions({params:{entity_type:$('#top_search_select').val()}});
});
于 2012-06-03T07:55:01.670 回答
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() ;
      }
  } 
});
于 2015-04-28T13:51:37.923 回答
0

上面的所有答案都对我不起作用(我怀疑是因为我正在通过 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()

因为正如其他答案中提到的那样,值是静态的。

于 2019-01-09T17:21:04.660 回答