@autofe/carpicker
Version:
A Carpicker library based on jQuery
285 lines (236 loc) • 7.64 kB
Markdown
# Carpicker
## HTML
选择品牌、车系、车型下拉框有三种形式
* 品牌、车系、车型共用一个下拉框
* 品牌、车系共用一个下拉框,车型单独使用一个下拉框
* 品牌、车系、车型各自使用下拉框
```html
<!-- 品牌、车系、车型共用一个下拉框 -->
<div class="athm-select" id="js-select-simple" data-toggle="carpicker">
<div class="athm-select__selected" data-select-picker>
<span class="athm-select__text" data-select-value>选择品牌</span>
<span class="athm-select__icon">
<i class="athm-iconfont athm-iconfont-arrowdown"></i>
</span>
</div>
<div class="athm-select__option" data-select-dropdown>
<div class="pop-wrapper">
<!-- 区别主要在这里,剩下的工作就交给了样式实现 -->
<div class="brand" data-select-brand></div>
<div class="series" data-select-series></div>
<div class="spec" data-select-spec></div>
</div>
</div>
</div>
<!-- 品牌、车系共用一个下拉框 -->
<div class="athm-select" id="js-select-brand" data-toggle="carpicker">
<div class="athm-select__selected" data-select-picker>
<span class="athm-select__text" data-select-value>选择品牌</span>
<span class="athm-select__icon">
<i class="athm-iconfont athm-iconfont-arrowdown"></i>
</span>
</div>
<div class="athm-select__option" data-select-dropdown>
<div class="pop-wrapper">
<div class="brand" data-select-brand></div>
<div class="series" data-select-series></div>
</div>
</div>
</div>
<!-- 单选品牌下拉框 -->
<div class="athm-select" id="js-select-brand2" data-toggle="carpicker">
<div class="athm-select__selected" data-select-picker>
<span class="athm-select__text" data-select-value>选择品牌</span>
<span class="athm-select__icon">
<i class="athm-iconfont athm-iconfont-arrowdown"></i>
</span>
</div>
<div class="athm-select__option" data-select-dropdown>
<div class="pop-wrapper">
<div class="brand" data-select-brand></div>
</div>
</div>
</div>
```
### JavaScript
因为选择品牌、车型、车系涉及到数据来源及数据结构,所以在调用的时候增加了一些配置项
* 首页,针对不同数据来源及数据结构,我们需要自己写方法获取数据及处理数据结构
* 在选择品牌及车系之后执行下一步的方法
```javascript
$('#select').carpicker(options);
```
```javascript
var dataCar = {
getBrandData: function() {
var carBrand = [];
brandSereisData.forEach(element => {
var item = {
'id': element.I,
'name': element.N,
'letter': element.L,
'list': element.List
}
carBrand.push(item)
});
return carBrand;
},
getSeriesData: function(key, callback) {
var carSeries = [];
brandSereisData.forEach(element => {
if (element.I == key) {
element.List.forEach(ele => {
var item = {
'id': '',
'name': '',
'list': [],
'brandId': key
};
item.id = ele.I;
item.name = ele.N;
ele.List.forEach(series => {
item.list.push({
'id': series.I,
'name': series.N
})
})
carSeries.push(item);
})
return;
}
});
if (callback && typeof callback === 'function') {
callback(carSeries)
};
return;
},
getSpecData: function(key, callback) {
var carSpec = [];
if (specData && specData.List.length > 0) {
specData.List.forEach(ele => {
var item = {
'id': '',
'name': '',
'list': []
};
item.id = ele.I;
item.name = ele.N;
ele.List.forEach(spec => {
item.list.push({
'id': spec.I,
'name': spec.N,
'price': spec.P
})
})
carSpec.push(item)
})
if (callback && typeof callback === 'function') {
callback(carSpec);
};
return;
}
}
}
$('#js-select-brand').carpicker({
selectLevel: 'series',
onInitPicker: dataCar.getBrandData,
onBrandPicker: function (id) {
dataCar.getSeriesData(id, function (data) {
// 全部车系项
var seriesItem = {
'show': true,
'link': true,
'url': '//www.autohome.com.cn/'
}
$('#js-select-brand').data('fe.carpicker').setSeries(data, seriesItem);
})
},
onSeriesPicker: function (id) {
dataCar.getSpecData(id, function (data) {
$('#js-select-spec').data('fe.carpicker').setSpec(data);
});
}
```
## Options
参数可以通过 data attributes 或者 JavaScript 两种方式来配置.
Name | Type | Default | Description
---- | ---- | ------- | -----------
selectPicker | string | `'[data-select-picker]'` | 触发容器
selectValue | string | `'[data-select-value]'` | 值容器
selectDropdown | string | `'[data-select-dropdown]'` | 下拉容器
selectedClass | string | `'selected'` | 选中选项使用的样式类.
disabledClass | string | `'disabled'` | 下拉框禁用状态样式类.
activeClass | string | `'active'` | 下拉框激活状态样式类.
selectLevel | string | `'brand'` | 选择到指定级 <br> `'brand'` `'series'` `'spec'`
selectNav | Boolean | `false` | 是否显示导航 <br> 为 true 会自动创建
onInitPicker | function | `null` | 初始化完成,用于渲染品牌数据
onBrandPicker | function | `null` | 选择品牌项执行
onSeriesPicker | function | `null` | 选择车系项执行
onSpecPicker | function | `null` | 选择车型项执行
## Methods
### `.carpicker(options)`
初始化当前 DOM 内容为一个下拉框, 可以接受参数进行配置.
```javascript
$('#select').carpicker({});
```
### `.carpicker('show')`
手动打开对话框.
```javascript
$('#select').carpicker('show');
```
### `.carpicker('hide')`
手动关闭对话框.
```javascript
$('#select').carpicker('hide');
```
### `.carpicker('toggle')`
手动打开或者关闭.
```javascript
$('#select').carpicker('toggle');
```
### `.carpicker('disable')`
禁用.
```javascript
$('#select').carpicker('disable');
```
### `.carpicker('enable')`
非禁用.
```javascript
$('#select').carpicker('enable');
```
### `.data('fe.carpicker').setValue({})`
设置值
### `.data('fe.carpicker').getValue()`
获取值
### `.data('fe.carpicker').setSeries(data, obj)`
渲染车系数据并显示
`obj` 为控制「全部车系」链接的选项
```js
// 全部车系项
var obj = {
'show': true,
'link': true,
'url': '//car.autohome.com.cn/price/brand.html'
}
```
### `.data('fe.carpicker').setSpec(data, array)`
渲染车型数据并显示
`array` 以数组形式传递车型 id 在渲染时如果当前车型 id 参数于 array 中会将当前项做禁用处理
### `.data('fe.carpicker').destroy()`
销毁当前对象
## Event
Event Type | Description
---------- | -----------
init.fe.carpicker | 下拉框初始化时触发.
show.fe.carpicker | 当 `show` 方法被调用, 此事件会立即触发.
shown.fe.carpicker | 下拉框已呈现完毕时触发.
hide.fe.carpicker | 当 `hide` 方法被调用, 此事件会立即触发.
hidden.fe.carpicker | 下拉框已隐藏完毕时触发.
change.fe.carpicker | 当值发生变化时触发. 回调函数接受参数为 `event` , 当前选项值 `data` (`{text: '', value: ''}`) 和当前选项 `$item` 。
```javascript
$('#select').on('show.fe.carpicker', function (e) {
// 阻止下拉框打开
e.preventDefault();
});
```
# End
Thanks to [Bootstrap](http://getbootstrap.com/)