“”
由于项目中有急需用到搜索推荐+自动填充的功能, 但是github上找的jquery-autocomplete又不能完全满足需求, 并且由于jquery插件编写方式的格式, 修改起来不是很方便, 还不如自己实现一个, 故开始自己造轮子
autocomplete 功能实现分析
一般说来, 一个组件内抽象着很多具体的实现, 想要全面控制这些实现, 需要先分析, 然后将具体实现分离关注.
确定实现功能所需的所有界面(按逻辑划分)
-
一个单行文本框
search-input
-
一个填充搜索推荐层
search-menu
-
头部区域块
search-menu-header
-
内容区域块
search-menu-content
-
推荐搜索项区域块
search-menu-item
-
推荐搜索文字区域块
item-text
-
推荐搜索附加信息区域块, 例如: 商品数量显示
item-count
或者历史提交搜索记录删除按钮search-menu-history-delete
-
-
-
尾部区域块
search-menu-footer
- 关闭按钮
search-menu-close
- 关闭按钮
-
确定实现功能所需的所有逻辑(按人机交互事件划分)
- 一个单行文本框
search-input
-
input
事件-
主要控制输入的关键字与推荐关键词数据的匹配获取,
-
search-menu
的控制隐显, 模板重新生成 -
记忆已进行匹配操作的关键词, 以及匹配的推荐关键词数据
-
-
click
事件search-menu
的控制隐显, 模板重新生成
-
foucsin
事件- 记忆
search-input
当前的focus状态, 键盘事件要用
- 记忆
-
focusout
事件-
记忆
search-input
当前的focus状态, 键盘事件要用 -
search-menu
的控制隐显
-
-
keydown
事件-
ESC: 27
search-menu
的控制隐显
-
RETURN: 13
-
记忆历史搜索提交项
-
提交搜索(比如提交数据至远程服务器进行关键词匹配的商品搜索)
-
-
LEFT: 37
-
UP: 38
-
search-menu
的控制隐显 -
记忆
search-menu-item
选中第几项 -
处理操作后
search-menu-item
的UI变化 -
处理操作后
search-input
的value变化
-
-
RIGHT: 39
-
DOWN: 40
-
search-menu
的控制隐显 -
记忆
search-menu-item
选中第几项 -
处理操作后
search-menu-item
的UI变化 -
处理操作后
search-input
的value变化
-
-
-
-
一个填充搜索推荐层
search-menu
-
mouseenter
事件 (针对searchItem冒泡)-
记忆
search-menu-item
选中第几项 -
处理操作后
search-menu-item
的UI变化
-
-
mouseleave
事件-
记忆
search-menu-item
选中第几项 -
处理操作后
search-menu-item
的UI变化
-
-
click
事件 (针对searchItem冒泡)-
记忆
search-menu-item
选中第几项 -
处理操作后
search-menu-item
的UI变化 -
search-menu
的控制隐显 -
提交搜索(比如提交数据至远程服务器进行关键词匹配的商品搜索)
-
-
-
关闭按钮
search-menu-close
-
click
事件search-menu
的控制隐显
-
-
历史提交搜索记录删除按钮
search-menu-history-delete
-
‘click’事件
-
删除该项历史提交搜索记录
-
处理操作后
search-menu-item
的UI变化 -
将焦点返回
search-input
-
-
确定数据存储
-
search-menu的赋值数据源
searchMenuData
(Object) 默认为空对象[key]
id
默认未定义[key]
isShowHeader
默认false[key]
isShowFooter
默认true[key]
recommendKeywordDataList
-
search-menu-content的赋值数据源
recommendKeywordDataList
(Array<Object>) 默认未定义其中Object部分
[key]
keyword
可以自定义指定这个key -
历史已提交搜索关键词缓存
historySearchedKeywordCacheList
(Array<String>) 默认为空数组 -
历史未提交推荐搜索关键词缓存
historyRecommendKeywordCacheList
(Array<String>) 默认为空数组 -
历史未提交推荐搜索关键词 -> 返回的数据结果集
historyRecommendKeywordCache
(Object) 默认为空对象key -> historyKeyword value -> recommendKeywordDataList toJson
确定关键属性
-
一个单行文本框
search-input
输入文本值searchInputValue
(String) 默认未定义 -
推荐搜索关键词
recommendKeyword
(String) 默认未定义 -
头部区域块是否显示标识
isShowHeader
(Boolean) 默认false -
尾部区域块是否显示标识
isShowFooter
(Boolean) 默认true -
[公开]历史已提交搜索关键词缓存最大个数
maximumHistorySearchedKeywordCacheList
(Int) 默认为100 -
[公开]历史已提交搜索关键词显示个数
displayHistorySearchedKeywordCacheListCount
(Int)默认为10 -
[公开]历史未提交搜索关键词缓存最大个数
maximumHistoryKeywordCacheList
(Int) 默认为100 -
[公开]是否使用远程数据
remote
(Boolean) 默认false (请求方式强制使用jsonp) -
[公开]远程请求地址
url
(String) 默认未定义 (当remote
为true时必须指定) -
[公开]对应搜索文本的请求参数名
queryName
(String) 默认为’searchKey’ -
[公开]附加请求参数对象
additionalQueryParams
(Object) 默认null (需要支持实例修改) -
[公开]本地数据源
localData
(Object) 默认null (当remote
为false时必须指定)key -> keyword value -> recommendKeywordDataList toJson -
[公开]对每个推荐搜索返回结果集里指定的字段进行格式化, 返回格式化后的值 -> 回调函数
formatRecommendKeywordData
(Function) 默认为null -
[公开]允许触发一次获取搜索推荐数据动作最小间隔
recommendFetchInterval
(Int) 默认为10(ms) -
fetch数据的请求对象
xhr
(Object) 默认null 由jQuery.ajax创建 -
延迟进行fetch数据请求对象
defered
(Object) 默认null 由setTimeout创建 -
一个单行文本框
search-input
当前focus状态focusState
(Boolean) 默认false -
一个填充搜索推荐层
search-menu
当前显示状态displayState
(Boolean) 默认false -
推荐搜索项count
recommendItemsCount
(Int) 默认0 -
当前选择/停留的搜索项index
searchItemIndex
(Int) 默认-1 选择搜索推荐项时使用, 0表示第一项,recommendItemsCount-1
表示最后一项 -
[公开]提交搜索事件 -> 回调函数
onSearch
(Function) -
[公开]切换推荐搜索项事件 -> 回调函数
onSelect
(Function) 默认为更新UI方法 应是指定搜索文本框元素searchInput
的value值, 以及针对自定义模板选中的searchItem切换选中样式 -
[公开]切换搜索菜单层显示状态事件 -> 回调函数
onSearchMenuDisplayStateChange
(Function) 默认为更新UI方法 应指定切换推荐搜索层元素searchMenu
的隐显 -
[公开]搜索文本框元素
searchInput
(HTMLElement) (必须指定) -
推荐搜索层元素
searchMenu
(HTMLElemnt) 默认为null, 内部模板解析创建元素后, 自动关联(通过id) -
[公开]设置完search-menu的赋值数据源事件
searchMenuData
-> 回调函数*onSetSearchMenuData*
(Function) 默认为设置header与footer值方法 使用者可以在这里指定搜索菜单header, footer或其他自定义变量 -
[公开]自定义模板解析生成方法
template
(Function) 默认为模板方法 该方法应是获取到自定义模板后, 直接传入js对象即可返回html代码 -
[公开]模板生成html后事件 -> 回调函数
onTemplate
(Function) 默认为更新UI方法 应是获取到模板解析数据后生成的html代码, 然后将推荐搜索层元素searchMenu
内容替换(模板需要作控制, 只有第一次才包含容器元素标签) -
[公开]每个推荐搜索项匹配的选择器
searchItemSelector
(String) 默认为与默认模板匹配的选择器 可自定义, 但需要同时自定义模板 -
[公开]被选中的那个推荐搜索项匹配的选择器
searchItemSelectedSelector
(String) 默认为与默认模板匹配的附加选择器 可自定义, 但需要同时自定义css -
是否允许
search-input
focusout事件触发allowFocusOut
(Boolean) 默认true 为防止点击search-menu
执行foucsout事件逻辑 -
[公开]search-menu-content的赋值数据源
recommendKeywordDataList
中对应显示推荐搜索词的字段名suggestKeyword
(String) 默认为’keyword’ -
[公开]请求远程数据, 返回结果对应dataList数组的key
resultListKey
(String) 默认为’list’ -
[公开]推荐搜索层
search-menu
的关闭按钮匹配的选择器searchMenuCloseSelector
(String) 默认为’.search-menu-close’ 可自定义, 但需要同时自定义模板 -
[公开]推荐搜索层
search-menu
的内容部分匹配的选择器searchMenuContentSelector
(String) 默认为’.search-menu-content’ 可自定义, 但需要同时自定义模板 -
[公开]远程请求超时时间
timeout
(Int) 默认为3000(30s) -
[公开]远程请求返回数据方式
dataType
(String) 默认为’json’ 也支持’jsonp’ -
[公开]search-menu-content的赋值数据源
recommendKeywordDataList
中对应显示推荐搜索词的字段的html内容suggestKeywordHtml
(String) 默认为’suggestKeywordHtml’ 可自定义, 但需要同时自定义模板 -
[公开]推荐搜索层
search-menu
的历史已提交搜索记录的删除按钮匹配的选择器searchMenuHistoryDeleteSelector
(String) 默认为’.search-menu-history-delete’ 可自定义, 但需要同时自定义模板