【问题标题】:Make Ajax Get Request when a key is typed into a search box在搜索框中输入键时发出 Ajax 获取请求
【发布时间】:2016-10-30 04:50:16
【问题描述】:

我正在尝试在我的 Django 应用程序中创建一个实时搜索框。一般的想法是,当在搜索字段中按下一个键时,它应该将获取请求发送到我的服务器,并且在成功时,数据应该附加到我的搜索结果 p 标记。但是,出于某种原因,我要附加我的整个 HTML 内容。我只想附加在搜索框中发送的信息。

这是我目前所拥有的。

HTML

 <form method="get" action="{% url 'sell' %}" class="search_form center-block">
                    <!--{% csrf_token %}-->
                    <div class="input-group search_option">
                      <input type="text" id="searchBox" class="search_field form-control" name="q" placeholder="Search for...">
                        <span class="input-group-btn">
                            <input id="search" class="search_submit btn btn-default" onclick="myFunction()" type="submit" value="Search">
                        </span>
           </div><!-- /input-group -->
</form>

脚本

$(document).ready(function(){
          $('.search_field').keyup(function(){
              $.ajax({
                  url: "{% url 'sell' %}",
                  type: "GET",
                  cache: false,
                  data: { 'search_text' : $('.search_field').val() },
                  success: function(data){
                    $('#search-results').append(data);
                  }
              });
          });
        });

我相信数据是我试图从 search_field 输入中获取值的地方,但出于某种原因。这是行不通的。

提前感谢您的帮助

【问题讨论】:

  • > 但是,出于某种原因,我要附加整个 HTML 内容。我只想附加在搜索框中发送的信息。你的意思是你在收到回复后发送太多或附加太多?如果是后者,响应是什么样的?如果服务器使用 html 回复,那么您可能希望将其更改为使用 JSON 回复,或者解析 HTML 以仅找到您想要的内容。 (编辑:对不起,这个格式有点乱!希望我的问题/评论是有道理的。)
  • 发送过多。是的,我想解析 HTML 以只找到我想要的内容,但我不知道该怎么做。
  • 如果您能够向我们提供一个有帮助的示例回复。您可能需要执行类似 $('#search-results').append($(data).find("body").text());
  • 所以,我有一个搜索框,您可以在其中输入字符。每次按下键时,我希望响应是用户输入的字符

标签: jquery ajax django


【解决方案1】:

刚刚呢:

``` $(document).ready(function(){

      $('.search_field').keyup(function(){
          var data = $('.search_field').val(); 
          $.ajax({
              url: "{% url 'sell' %}",
              type: "GET",
              cache: false,
              data: data,
              success: function(data){
                $('#search-results').append(data);
              }
          });
      });
    });

```

【讨论】:

  • 不起作用,它给了我 (index):132 Uncaught ReferenceError: data is not defined(...)
  • @J_LIU 我很困惑。我不知道为什么我要继续与您讨论其他人的答案。是他们的解决方案奏效了,还是我的解决方案奏效了?
  • 请说明您尝试了什么,结果如何。
  • 成功:function(data){ $("p").append($(data).find(".search_field").text());警报();我将此添加到我的成功中,它给我的响应为 ?search_text=,这就是我想要的。但是,它会将其附加到我的#search_results 区域
  • 我在上面的 html 中没有看到

    标签。为什么不给它一个类名,以便更具体地定位它?如:

【解决方案2】:

您可以尝试对搜索框使用 select2 控件 https://select2.github.io/

使用 CDN 参考

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>

html:

<select id="searchBox"></select>

js:

$("#searchBox").select2({
    ajax: {
        url: "{% url 'sell' %}",
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        delay: 250,
        method: "GET",
        data: function (params) {
          return {
            q: params.term, // search term
            page: params.page
          };
        },
        processResults: function (data, params) {
            // parse the results into the format expected by Select2
            // since we are using custom formatting functions we do not need to
            // alter the remote JSON data, except to indicate that infinite
            // scrolling can be used
            //params.page = params.page || 1;
            params.page = params.page || 1;

              return {
                results: data.items,
                pagination: {
                  more: (params.page * 30) < data.total_count
                }
              };
            },
            cache: true
    },
    escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
    minimumInputLength: 1,
    templateResult: function (data) { return data.text; }, // omitted for brevity, see the source of this page
    templateSelection: function (data, container) { return data.text; } // omitted for brevity, see the source of this page
});

【讨论】:

    【解决方案3】:
    $(document).ready(function(){
              $('.search_field').keyup(function(event){
                  $.ajax({
                      url: "{% url 'sell' %}",
                      type: "GET",
                      cache: false,
                      data: { 'search_text' : event.target.value },
                      success: function(data){
                        $('#search-results').append(data);
                      }
                  });
              });
            });
    

    【讨论】:

    • 这也不起作用,它仍在将整个 HTML 内容附加到搜索结果中
    • 也许你的回复中有整个 HTML ?
    • event.target.value 将为您提供输入字段值 $('#search-results').append(data);在这个地方,您可以放置​​从服务器获得的所有内容。你能显示来自服务器的响应吗?
    【解决方案4】:
    data: { 'search_text' : $('#searchBox').val() },
    

    【讨论】:

    • 这样有效,并且得到了正确的响应,但我似乎无法检索成功的数据。有什么想法吗?
    • 看看返回成功回调的对象。您可能需要在该对象中指定一个键。 ``` 成功:function(data){ console.log('data', data); $('#search-results').append(data); } ```
    【解决方案5】:

    您可以使用 jQuery 自动完成功能来代替 ajax。 Autocomplete

        $("#searchBox").autocomplete({
        source: function (request, response) {
           $.ajax({
               url: "your action",
               type: "GET",
               data: request,
               success: function (data) {
                 response($.map(data.listName, function (element,index) { // return a list of map
                   return {
                         label: element.Name, // dropdown text
                         value: element.Value,// dropdown value
                         id   : element.nameId // you can declare n number of variable based on your need
    
                     };
                 });
             }
         });
       },
       select: function (event, ui) {
        // you can set the value other element if needed
        var value= ui.item.value;
        var id = ui.item.id;       
    }
    

    });

    你也可以设置其他选项delay、minLength等

    【讨论】:

    • 你能给我一个例子,说明如何在这种情况下使用自动完成功能。我尝试使用它,但对我来说效果不佳。
    【解决方案6】:

    我会使用 id #searchBox 而不是 class。对于 URL,您应该输入它,例如“/items” 希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2021-05-29
      • 2015-07-08
      相关资源
      最近更新 更多