【问题标题】:How can I disable automatic selection in one of the suggestion selectize.js?如何在其中一个建议 selectize.js 中禁用自动选择?
【发布时间】:2020-12-24 15:32:05
【问题描述】:

我正在尝试使用 algolia 实现自动完成搜索,一切正常。algolia 自动完成使用 selectize.js 插件来显示表单和下拉列表,但问题是如果我单击输入框,它会显示带有其中之一的建议建议被选中,所以如果我在不输入任何内容的情况下按 Enter 键,它将自动选择第一个建议。我想要的是,如果我输入一个单词或将其留空并按 Enter,它不应该选择任何建议。我怎样才能解决这个问题?任何帮助将不胜感激。

const autocomplete = instantsearch.connectors.connectAutocomplete(
({ indices, refine, widgetParams }, isFirstRendering) => {
const { container, onSelectChange } = widgetParams;

if (isFirstRendering) {
  container.html('<select id="ais-autocomplete"></select>');

  container.find('select').selectize({
    options: [],
    valueField: 'id',
    labelField: 'name',
    highlight: true,
    onType: refine,
    onBlur() {
      refine(this.getValue());
    },
    score() {
      return function() {
        return 1;
      };
    },
    onChange(value) {
      onSelectChange(value);
      refine(value);
    },
  });

  return;
}

const [select] = container.find('select');

indices.forEach(index => {
  select.selectize.clearOptions();
  index.results.hits.forEach(h => select.selectize.addOption(h));
  select.selectize.refreshOptions(select.selectize.isOpen);
});
}
);
]);

【问题讨论】:

    标签: javascript jquery selectize.js


    【解决方案1】:

    您可以添加以下事件处理程序,以便在按下返回时清除所选项目:

     $(document).on('keydown', '[type="select-one"]', function(e) {
            if (e.which == 13) {  // on return clear selections...
                select.selectize.clear(false);
            }
     })
    

    sn-p:

    /* global $ instantsearch algoliasearch */
    
        const searchClient = algoliasearch(
                'B1G2GM9NG0',
                'aadef574be1f9252bb48d4ea09b5cfe5'
        );
    
        const autocomplete = instantsearch.connectors.connectAutocomplete(
                        ({ indices, refine, widgetParams }, isFirstRendering) => {
                    const { container, onSelectChange } = widgetParams;
    
        if (isFirstRendering) {
            container.html('<select id="ais-autocomplete" muliple></select>');
    
            container.find('select').selectize({
                options: [],
                valueField: 'name',
                labelField: 'name',
                highlight: false,
                onType: refine,
                onBlur() {
                refine(this.getValue());
            },
            score() {
                return function() {
                    return 1;
                };
            },
            onChange(value) {
                onSelectChange(value);
                refine(value);
            },
        });
    
        return;
    };
    
    $(document).on('keydown', '[type="select-one"]', function(e) {
        if (e.which == 13) {
            select.selectize.clear(true);
        }
    })
    
    const [select] = container.find('select');
    
    indices.forEach(index => {
        select.selectize.clearOptions();
    index.results.hits.forEach(h => select.selectize.addOption(h));
    select.selectize.refreshOptions(select.selectize.isOpen);
    });
    }
    );
    
    
    
    const search = instantsearch({
        indexName: 'demo_ecommerce',
        searchClient,
    });
    
    search.addWidgets([
        instantsearch.widgets.configure({
            hitsPerPage: 10,
        }),
        instantsearch.widgets.hits({
            container: '#hits',
            templates: {
                item: `
    <div>
    <header class="hit-name">
            {{#helpers.highlight}}{ "attribute": "name" }{{/helpers.highlight}}
    </header>
    <p class="hit-description">
            {{#helpers.highlight}}{ "attribute": "description" }{{/helpers.highlight}}
    </p>
    </div>
    `,
    },
    }),
    ]);
    
    const suggestions = instantsearch({
        indexName: 'demo_ecommerce',
        searchClient,
    });
    
    suggestions.addWidgets([
        instantsearch.widgets.configure({
            hitsPerPage: 5,
        }),
        autocomplete({
            container: $('#autocomplete'),
            onSelectChange(value) {
            search.helper.setQuery(value).search();
    },
    }),
    ]);
    
    suggestions.start();
    search.start();
    h1 {
        margin-bottom: 1rem;
    }
    
    em {
        background: cyan;
        font-style: normal;
    }
    
    .container {
        max-width: 960px;
        margin: 0 auto;
        padding: 1em;
    }
    
    .ais-hits {
        margin-top: 1em;
    }
    
    .hit-name {
        margin-bottom: 0.5em;
    }
    
    .hit-description {
        color: #888;
        font-size: 14px;
        margin-bottom: 0.5em;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7.1.0/themes/algolia.css" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/selectize@0.12.6/dist/css/selectize.css">
    
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/selectize@0.12.6/dist/js/standalone/selectize.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4"></script>
    
    <div class="container">
        <h1>InstantSearch.js - Results page with an autocomplete</h1>
        <div id="autocomplete"></div>
        <div id="hits"></div>
    </div>

    【讨论】:

    • 感谢您的回答,但我想保留输入。到目前为止,如果我输入了建议列表中的单词,它将清除,但如果该单词不在建议中,它仍然存在,我如何才能保留键入的单词并避免仅自动选择。 ?@gaetanoM
    • 好吧,就是这样,我想做的是假设我有 5 个产品,它们都被命名为women shoes,我想搜索女鞋,所以如果我输入女鞋并按 Enter我希望它使用该查询women shoes 重定向到search page,它将显示所有名为女鞋的产品。这就是为什么我想保留输入的单词和清除。我只想避免自动选择@gaetanoM
    • 你弄明白了吗? @gaetanoM
    • 这是一个很好的例子,我试图遵循一切但没有工作,它没有下拉列表,如果我使用该示例与我的代码相比会很复杂@gaetanoM
    • 您能否解释一下,因为我不知道如何将我拥有的代码与您刚刚建议的代码联系起来@gaetanoM
    猜你喜欢
    • 2021-04-04
    • 2019-12-10
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2020-10-16
    • 2019-06-06
    相关资源
    最近更新 更多