从预先搜索输入

时间:2015-09-30 23:33:28

标签: javascript meteor typeahead.js

我使用sergeyt:typeahead在我的meteor应用中创建了一个预先输入搜索字段。

现在我想记录所有搜索请求,以了解我的数据库中缺少哪些信息。问题是,用户可能不会按Enter键。由于typeahead-function,用户将键入一些字符,如果没有结果,则可能会中止键入。某些用户将删除输入以尝试其他关键字。如果技术上可行,我想获得这些信息。

首先,我必须检查typeahead给出的结果有多少,但我不知道从哪里获取这些信息。

到目前为止,这是我的代码:

Template.search.helpers({
    searchData: function() {
        return [
            {
                name: 'cat1',
                valueKey: 'title',
                displayKey: 'title',
                header: '<h3 class="category-name">Category 1</h3>',
                template: 'searchResults',
                local: function() { return Collection.find().fetch(); }
            }
        ]
    },
    selected: function(event, suggestion) {
        if (Router.routes[suggestion.type] === void 0) {
            console.warn('Route not found');
            return;
        }
        else Router.go(suggestion.type, { _id : suggestion.id });
    }
});

我会从该模板的事件开始:

Template.search.events({
    'submit form': function(event, template) {
        event.preventDefault();
        var newElement = template.firstNode.children[0][1].value;
        Log.insert({ title: newElement, missing: true });
    },
    'keyup input': function(event, template) {
        var keyword = event.target.value;
        Log.insert({ title: keyword });
    }
});
  1. submit-event:如果用户按Enter键,关键字将保存到集合中。但这是非常糟糕的,因为如果没有预先输出结果就会发生这种情况,因为用户可以选择一个建议,然后按回车键去寻找结果,但是我的代码会被覆盖... < / p>

  2. keyup-event:问题是,将跟踪每个键事件。对于输入&#39;只是搜索&#39;,该集合将有14个插入。那不是我想要的。如果我正在使用更改事件,则输入必须变得模糊,这也不是我需要的。

  3. 所以在我看来这不是最好的方式。

    也许可以使用typeahead.js的自定义事件,例如typeahead:render

1 个答案:

答案 0 :(得分:0)

使用下划线的trottle仅每500毫秒左右保存一次搜索字符串。这将减少您保存的唯一搜索字符串的数量,同时仍然可以来回捕获大部分用户。

在你的情况下:

Template.search.events({
    'submit form': _.throttle(function(event, template) {
        event.preventDefault();
        var newElement = template.firstNode.children[0][1].value;
        Log.insert({ title: newElement, missing: true });
        },500);
    },
    'keyup input': _.throttle(function(event, template) {
        var keyword = event.target.value;
        Log.insert({ title: keyword });
        },500);
    }
});

您的要求有点矛盾,所以这似乎是一个合理的妥协。您希望捕获搜索字符串,但不是捕获在搜索字符串的路上键入的每个字符。如果您没有限制并且用户键入:

f o o d

然后通常会保存4次搜索:

  1. ˚F
  2. FO
  3. FOO
  4. 食品
  5. 然后,如果他们决定退回一个角色,你会再次保存:

    1. FOO
    2. 通过限制,假设用户键入相当正常的页面,您将保存两次搜索:

      1. 食品
      2. FOO
      3. 因为他们可能会想到他们用食物得到的结果,所以决定他们走得太远(至少500ms),然后退格。