【问题标题】:Log informations from typeahead search input来自预输入搜索输入的日志信息
【发布时间】:2015-09-30 23:33:27
【问题描述】:

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

现在我想记录所有搜索请求,以了解我的数据库中缺少哪些信息。问题是,用户可能不会按回车键。由于 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 键以获取该结果,但是使用我的代码这将被覆盖...

  2. keyup-event:问题在于,每个关键事件都会被跟踪。对于键入“just search”,将有 14 个插入到集合中。那不是我想要的。如果我使用更改事件,则输入必须模糊,这也不是我需要的。

所以在我看来这不是最好的方法。

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

【问题讨论】:

    标签: javascript meteor typeahead.js


    【解决方案1】:

    使用下划线的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. 食物

    如果他们决定退格一个字符,你会再次保存:

    通过节流,假设用户在相当正常的页面上键入,您将节省两次搜索:

    1. 食物

    因为他们大概会考虑他们在食物中得到的结果,所以决定他们走得太远(至少 500 毫秒),然后退格。

    【讨论】:

    • 这是个好主意,但我仍然有问题,提交事件会覆盖 typeahead-enter-event。
    • 我会改用input 事件。这将处理键盘事件以及复制/粘贴。也许结合blur
    • 是否可以在没有 underscore.js 的情况下进行节流?我只是问因为underscore.js有很多功能,但我不需要它们......
    • 压缩后的大小为 5.7Kb。随着时间的推移,您可能会使用更多这些功能。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多