搜索提示的更多定制

Class

搜索提示的更多定制

没错, 上面这个就是淘宝首页的搜索框完整代码, 里面定制了很多, 例如, 不同tab公用一个suggest, 定制页脚, 替换返回数据等, 具体分析如下;

不同tab切换时, 关闭/开启suggest, 或者设置不同的数据源

// 切换逻辑
// __fp_sug 是对 suggest 封装了一层, 其中的 sug 对象就是一个 Suggest 实例
switchToTab = function(n) {
    if (!__fp_sug) return;

    // 设置不同的数据源
    if (n == 1) {
        __fp_sug.sug.dataSource = 'http://suggest.taobao.com/sug?area=b2c&code=utf-8&extras=1&callback=KISSY.Suggest.callback';
    } else {
        __fp_sug.sug.dataSource = 'http://suggest.taobao.com/sug?code=utf-8&extras=1&callback=KISSY.Suggest.callback';
    }
    // 由于多个数据源共享一个数据源的, 其中每次请求回来的数据都会被缓存下来, 当切换tab时, 需要清空下之前旧tab时的提示数据, 不然当不同tab, 输入相同关键词, 就不会触发请求, 导致提示层数据相同
    __fp_sug.sug._dataCache = {};

    // 当切换到特定tab时, 开启/关闭提示, .ON 为自定义的属性, 不是suggest内置的属性, 他的用处见下:
    var curRel = searchType.value;
    __fp_sug.ON = curRel === 'item' || curRel === 'mall';
};

// 绑定sug的 beforeStart 事件, 当 beforeStart 返回 false 时, 不去请求数据源, 进而不更新提示层数据
// 结合之前的 ON 属性, 给特定tab不发送请求,及开启/关闭搜索提示
__fp_sug.sug.on('beforeStart', function(e) {
    return self.ON;
});

设置页脚 , 当输入特定的关键词时, 更改页脚内容

// 绑定 updateFooter 事件, 该事件会在每次数据返回更新提示层数据后触发
sug.on('updateFooter', self._updateFooter, self);

// _updateFooter 代码片段
function(evt) {
    var self = this,
        sug = self.sug;

    // ...
    sug.footer.appendChild(D.create('<div class="my-box">'));
},

动态修改数据或插入特定数据

// 当请求数据返回的时候, 修改返回的数据
sug.on('dataReturn', function() {
    this.returnedData['result'] = ['返回结果只有一条数据了'];

    this.rawData = this.returnedData;
});

// 当显示之前, 添加数据到指定位置
sug.on('beforeShow', self._beforeShow, self);

// self._beforeShow 片段
var self = this,
    sug = self.sug,
    cateString = '',
    q = S.trim(self.q.val());

S.each([['新数据1', 'id1'],['新数据2', 'id2']], function(cate, i) {
    cateString += '<li class="ks-suggest-extras-my" key="'+q+'" ><span class="ks-suggest-key">' + q + '</span>'+cate[0]+'</span></li>';
});
if (cateString) {
    D.prepend(D.create(cateString), sug.content.firstChild);
}