搜索框中的Ajax / jQuery自动填充(Shopify)

时间:2017-08-03 07:35:04

标签: jquery ajax shopify

我希望在Shopify商店的搜索栏上获得自动完成设置 - 这使用Liquid和ajax

我发现了这个教程,并按照它的说法实现了它,但它没有工作,没有任何东西在网站上的任何搜索栏上自动完成 - 我认为它可能很旧并且在更新/更改为最小/之前编写Shopify搜索功能。

https://help.shopify.com/themes/customization/store/enable-autocomplete-for-search-boxes

我可以使用Chrome开发工具跟进它,看起来它在添加搜索结果列表$('<ul class="search-results"></ul>').appendTo($(this)).hide();时会卡住,在跟踪页面的HTML时不会出现这种情况。这意味着,当它稍后尝试查找此列表var resultsList = form.find('.search-results');时,它无法找到它,因此无法填充项目。

我正在运行Minimal主题。 该网站为testing site,搜索栏位于顶部灰色标题上,也位于/ search

由Shopify构建的用于演示此自动填充功能的测试网站位于[https]://search-autocomplete.myshopify.com/。页面加载时<ul>追加已存在。

修改

进行更多挖掘,我在开发工具中偶然发现了这个错误 -

  

未捕获的ReferenceError:jQuery未定义在(索引):7031

你猜对了,下面是jQuery代码的第一行。 $(function() {知道为什么jQuery未定义?该脚本在</body>之前的索引文件的底部包含,所以jquery.min.js应该已经加载,然后网站上的其余jQuery工作正常。

测试网站上的表单代码

<form action="/search" method="get" class="site-header__search small--hide" role="search">
        {% comment %}<input type="hidden" name="type" value="product">{% endcomment %}
        <div class="site-header__search-inner">
          <label for="SiteNavSearch" class="visually-hidden">{{ 'general.search.placeholder' | t }}</label>
          <input type="search" name="q" id="SiteNavSearch" placeholder="{{ 'general.search.placeholder' | t }}" aria-label="{{ 'general.search.placeholder' | t }}" class="site-header__search-input">
        </div>

        <button type="submit" class="text-link site-header__link site-header__search-submit">
          {% include 'icon-search' %}
          <span class="icon__fallback-text">{{ 'general.search.submit' | t }}</span>
        </button>
      </form>

search.json

{% layout none %}
{% capture results %}
  {% for item in search.results %}
{% assign product = item %}
{ 
  "title"    : {{ product.title | json }},
  "url"      : {{ product.url | within: product.collections.last | json }},
  "thumbnail": {{ product.featured_image.src | product_img_url: 'thumb' | json }}
}
{% unless forloop.last %},{% endunless %}
 {% endfor %}
{% endcapture %}
{
"results_count": {{ search.results_count }},
"results": [{{ results }}]
}

搜索autocomplete.liquid

<script>
$(function() {
  // Current Ajax request.
  var currentAjaxRequest = null;

  // Grabbing all search forms on the page, and adding a .search-results list to each.
   var searchForms = 
 $('form[action="/search"]').css('position','relative').each(function() {

 // Grabbing text input.
   var input = $(this).find('input[name="q"]');

  // Adding a list for showing search results.
    var offSet = input.position().top + input.innerHeight();
    $('<ul class="search-results"></ul>').css( { 'position': 'absolute', 'left': '0px', 'top': offSet } ).appendTo($(this)).hide();    

 // Listening to keyup and change on the text field within these search forms.
   input.attr('autocomplete', 'off').bind('keyup change', function() {

// What's the search term?
  var term = $(this).val();

 // What's the search form?
  var form = $(this).closest('form');

 // What's the search URL?
  var searchURL = '/search?type=product&q=' + term;

 // What's the search results list?
  var resultsList = form.find('.search-results');

  // If that's a new term and it contains at least 3 characters.
  if (term.length > 3 && term != $(this).attr('data-old-term')) {

   // Saving old query.
    $(this).attr('data-old-term', term);

  // Killing any Ajax request that's currently being processed.
    if (currentAjaxRequest != null) currentAjaxRequest.abort();

  // Pulling results.
    currentAjaxRequest = $.getJSON(searchURL + '&view=json', function(data) {
      // Reset results.
      resultsList.empty();

    // If we have no results.
      if(data.results_count == 0) {

     // resultsList.html('<li><span class="title">No results.</span></li>');
        // resultsList.fadeIn(200);
        resultsList.hide();
      } else {

       // If we have results.
        $.each(data.results, function(index, item) {
          var link = $('<a></a>').attr('href', item.url);
          link.append('<span class="thumbnail"><img src="' + item.thumbnail + '" /></span>');
          link.append('<span class="title">' + item.title + '</span>');
          link.wrap('<li></li>');
          resultsList.append(link.parent());
        });

       // The Ajax request will return at the most 10 results.
        // If there are more than 10, let's link to the search results page.
        if(data.results_count > 10) {
          resultsList.append('<li><span class="title"><a href="' + searchURL + '">See all results (' + data.results_count + ')</a></span></li>');
        }
        resultsList.fadeIn(200);
      }        
    });
  }
});
 });

 // Clicking outside makes the results disappear.
 $('body').bind('click', function(){
  $('.search-results').hide();
 });
 });
</script>

1 个答案:

答案 0 :(得分:1)

这是为了后人和完整。

我终于通过一些调整来实现它。

要修复jQuery未定义错误,我将第一行替换为: window.onload = (function() {

由于某种原因,结果列表正在显示:来自某个地方的块,但我找不到它,所以使用jQuery我将其更改为阻止使其显示。同样在这个代码行中,我修改了term.length以在2上启动ajax请求,否则如果你输入了cat / dog,则需要输入另一个字母或空格来开始搜索。

// If that's a new term and it contains at least 2 characters. if (term.length > 2 && term != $(this).attr('data-old-term')) { $('<ul class="search-results"></ul>').css( { 'display': 'block'} )

搜索结果现在显示出来,一切正确!只需要对定位进行一些CSS调整。