地区选择是项目开发中常用的操作,本文讲的控件是在手机端使用的选择控件,不仅可以用于实现地区选择,只要是3个级别的选择都可以实现,比如专业选择、行业选择、职位选择等。效果如下图所示:
附:本实例asp.net mvc中使用jquery H5省市县三级地区选择控件及中国省市县标准地区库下载地址
咨询QQ:806693619
一、实现原理
一般常用输入控件是input,当点击input的时候执行jquery获取焦点事情,然后弹出本地区选择插件,选择完地区后点击确定将选择的值返回给input完成地区输入。核心代码包括样式文件、h5自适应rem.js脚本、控件核心js脚本及后台数据提供代码。
二、核心js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
$(
function
() {
$(
"#inputVal"
).focus(
function
() {
$.selectPanel(
"1"
,
"/PubConfig/GetAreaList"
,
"山东省"
,
"inputVal"
);
});
//默认允许选择个数
var
pubSelectNum = 2;
//记录第一级选择值
var
pubFirstVal;
//记录第二级选择值
var
secondVal;
//默认数据获取地址
var
pubAjaxUrl =
"/PubConfig/GetAreaList"
;
//返回值赋予对象ID
var
pubReturnObjId;
$.extend({
//初始化数据
selectPanel:
function
(selectNum, ajaxUrl,defaultVal,returnObjId) {
pubSelectNum = selectNum;
pubAjaxUrl = ajaxUrl;
pubFirstVal = defaultVal;
pubReturnObjId = returnObjId;
initLayout();
//第一级别
$.ajax({
url: pubAjaxUrl,
type:
'POST'
,
cache:
false
,
dataType:
'json'
,
data: { pId:
"ROOT"
},
success:
function
(data) {
//成功事件
var
listr =
""
, firstId =
""
;
$.each(data,
function
(i, item) {
//配置默认省份
if
(data[i].NAME == defaultVal) {
firstId = data[i].ID;
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"act font18\">"
+ data[i].NAME +
"</li>"
;
}
else
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"font18\">"
+ data[i].NAME +
"</li>"
;
});
$(
".p-first"
).empty();
$(
".p-first"
).append(listr);
//初始化第二级别
$.ajax({
url: pubAjaxUrl,
type:
'POST'
,
cache:
false
,
dataType:
'json'
,
data: { pId: firstId },
success:
function
(data) {
//成功事件
var
listr =
""
, firstId =
""
;
$.each(data,
function
(i, item) {
if
(data[i].PID ==
"Yes"
)
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"foldIco font18\">"
+ data[i].NAME +
"</li>"
;
else
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"font18\">"
+ data[i].NAME +
"</li>"
;
});
$(
".p-second"
).empty();
$(
".p-second"
).append(listr);
},
error:
function
(XMLHttpRequest, textStatus, errorThrown) {
//发送失败事件
alert(textStatus);
}
});
},
error:
function
(XMLHttpRequest, textStatus, errorThrown) {
//发送失败事件
alert(textStatus);
}
});
}
});
//向body加载初始布局
function
initLayout() {
$(
".selectPanel"
).remove();
var
StringArray = [];
StringArray.push(
"<div class=\"sl-mask\" style=\"opacity: 1;\"></div>"
);
StringArray.push(
"<div class= \"selectPanel sl-actionsheet-toggle\">"
);
StringArray.push(
"<div class=\"p-bar\">"
);
StringArray.push(
"<div class=\"sl-btn sl-btn-inline sl-btn-small sl-btn-border-gray cancelBtn font18\">取消</div>"
);
StringArray.push(
"<div class=\"sl-btn sl-btn-inline sl-btn-small sl-btn-border-orange p-bar-right confirmBtn font18\">确定</div>"
);
StringArray.push(
"</div>"
);
StringArray.push(
"<div class=\"p-value font16\">"
);
StringArray.push(
"</div>"
);
StringArray.push(
"<div class=\"p-content\">"
);
StringArray.push(
"<div class=\"p-content-panel\">"
);
StringArray.push(
"<ul class=\"p-first\">"
);
StringArray.push(
"</ul>"
);
StringArray.push(
"</div>"
);
StringArray.push(
"<div class=\"p-content-panel\">"
);
StringArray.push(
"<ul class=\"p-second\">"
);
StringArray.push(
"<ul class=\"p-three\">"
);
StringArray.push(
"</ul>"
);
StringArray.push(
"</ul>"
);
StringArray.push(
"</div>"
);
StringArray.push(
"</div>"
);
StringArray.push(
"</div>"
);
$(
"body"
).append(StringArray.join(
""
));
}
//取消
$(
".cancelBtn,.sl-mask"
).live(
"click"
,
function
() {
$(
".sl-mask"
).remove();
$(
".selectPanel"
).remove();
});
//确定
$(
".confirmBtn"
).live(
"click"
,
function
() {
$(
"#"
+ pubReturnObjId).val(
"1"
);
var
selectedList = $(
".p-value-cell"
);
if
(selectedList.length == 1)
{
$(
"#"
+ pubReturnObjId).val(selectedList.html());
}
else
{
}
$(
".selectPanel"
).remove();
$(
".sl-mask"
).remove();
});
//点击第一级别执行的
$(
".p-first>li"
).live(
"click"
,
function
() {
var
thisObject = $(
this
);
pubFirstVal = thisObject.html();
$(
".p-first>li"
).removeClass(
"act"
);
thisObject.addClass(
"act"
);
//更新第二级别数据
$.ajax({
url: pubAjaxUrl,
type:
'POST'
,
cache:
false
,
dataType:
'json'
,
data: { pId: thisObject.attr(
"id"
) },
success:
function
(data) {
//成功事件
var
listr =
""
, firstId =
""
;
$.each(data,
function
(i, item) {
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"font18\">"
+ data[i].NAME +
"</li>"
;
});
$(
".p-second"
).empty();
$(
".p-second"
).append(listr);
},
error:
function
(XMLHttpRequest, textStatus, errorThrown) {
//发送失败事件
alert(textStatus);
}
});
});
//点击第二级别执行的
$(
".p-second>li"
).live(
"click"
,
function
() {
var
thisObject = $(
this
);
secondVal = thisObject.html();
if
(thisObject.hasClass(
"act"
)) {
thisObject.removeClass(
"act"
);
$(
".p-three"
).remove();
thisObject.removeClass(
"expandIco"
);
thisObject.addClass(
"foldIco"
);
}
else
{
$(
".p-second>li"
).removeClass(
"act"
);
thisObject.addClass(
"act"
);
thisObject.removeClass(
"foldIco"
);
thisObject.addClass(
"expandIco"
);
//更新第三级别数据
$.ajax({
url: pubAjaxUrl,
type:
'POST'
,
cache:
false
,
dataType:
'json'
,
data: { pId: thisObject.attr(
"id"
) },
success:
function
(data) {
//成功事件
var
listr =
"<ul class=\"p-three\">"
, firstId =
""
;
$.each(data,
function
(i, item) {
//判断是否有选择值,如果有需要添加已选择状态样式
if
($(
".p-value-cell[data-code*='"
+ data[i].ID +
"']"
).length > 0) {
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\" class=\"act\">"
+ data[i].NAME +
"</li>"
;
}
else
listr = listr +
"<li id='"
+ data[i].ID +
"' data-title=\""
+ data[i].NAME +
"\">"
+ data[i].NAME +
"</li>"
;
});
listr = listr +
"<ul>"
;
$(
".p-three"
).remove();
thisObject.after(listr);
},
error:
function
(XMLHttpRequest, textStatus, errorThrown) {
//发送失败事件
alert(textStatus);
}
});
}
});
//点击第三级别执行的
$(
".p-three>li"
).live(
"click"
,
function
() {
var
thisObject = $(
this
);
if
(thisObject.hasClass(
"act"
)) {
$(
".p-value-cell[data-code*='"
+ thisObject.attr(
"ID"
) +
"']"
).remove();
thisObject.removeClass(
"act"
);
}
else
{
var
selectedList = $(
".p-value-cell"
);
if
(selectedList.length > pubSelectNum * 1 - 1)
{ alert(
"最多允许选择一项"
);
return
; }
thisObject.addClass(
"act"
);
var
listr =
"<div class=\"p-value-cell font18\" data-code=\""
+ thisObject.attr(
"ID"
) +
"\" data-title=\""
+ thisObject.html() +
"\">"
+ pubFirstVal + secondVal + thisObject.html() +
"</div>"
;
$(
".p-value"
).append(listr);
}
});
//点击已经选择项目,取消选择
$(
".selectPanel .p-value-cell"
).live(
"click"
,
function
() {
var
thisObject = $(
this
);
//更新选项状态
$(
"#"
+ thisObject.attr(
"data-code"
)).removeClass(
"act"
);
thisObject.remove();
});
});
|
三、样式文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
.sl-mask {
position
:
fixed
;
z-index
:
10000
;
top
:
0
;
right
:
0
;
left
:
0
;
bottom
:
0
;
background
: rgba(
0
,
0
,
0
,
0.6
);
height
:
100%
;
}
.selectPanel {
position
:
fixed
;
left
:
0
;
bottom
:
0
;
-webkit-transform: translate(
0
,
100%
);
transform: translate(
0
,
100%
);
-webkit-backface-
visibility
:
hidden
;
backface-
visibility
:
hidden
;
z-index
:
50000
;
width
:
100%
;
background-color
:
#EFEFF4
;
-webkit-transition: -webkit-transform .
3
s;
transition: -webkit-transform .
3
s;
transition: transform .
3
s;
transition: transform .
3
s,-webkit-transform .
3
s;
background-color
:
#fff
;
}
.sl-actionsheet-toggle {
-webkit-transform: translate(
0
,
0
);
transform: translate(
0
,
0
);
}
.selectPanel .p-bar {
padding
: .
15
rem;
}
.selectPanel .p-bar-
left
{
float
:
left
;
}
.selectPanel .p-bar-
right
{
float
:
right
;
}
.selectPanel .p-value {
padding
:
0
.
15
rem;
position
:
relative
;
line-height
:
1.5
;
}
.selectPanel .p-value-cell {
display
: inline-
block
;
position
:
relative
;
height
: .
6
rem;
margin
: .
15
rem
0
;
margin-right
:
0px
;
line-height
: .
6
rem;
text-align
:
center
;
margin-right
: .
2
rem;
padding
:
0
.
15
rem;
padding-right
:
0.15
rem;
padding-right
: .
5
rem;
border
:
1px
solid
rgba(
0
,
0
,
0
,
0.2
);
color
:
#666
;
border-radius: .
08
rem;
}
.selectPanel .p-value::before {
content
:
' '
;
width
:
100%
;
height
:
1px
;
background
:
#e3e3e3
;
position
:
absolute
;
left
:
0
;
top
:
0
;
}
.selectPanel .p-value::after {
content
:
' '
;
width
:
100%
;
height
:
1px
;
background
:
#e3e3e3
;
position
:
absolute
;
left
:
0
;
bottom
:
0
;
}
.selectPanel .p-value-cell:after {
content
:
'\2715'
;
position
:
absolute
;
top
:
0
;
right
: .
1
rem;
font-weight
:
100
;
}
.selectPanel .p-content {
position
:
relative
;
overflow
:
visible
;
width
:
100%
;
background
:
#fff
;
display
: box;
display
: -webkit-box;
display
: -moz-box;
display
: -ms-flexbox;
display
: -webkit-flex;
display
: flex;
-webkit-transform: translate(
0
,
0
);
transform: translate(
0
,
0
);
-webkit-transition: -webkit-transform .
3
s;
transition: -webkit-transform .
3
s;
transition: transform .
3
s;
transition: transform .
3
s,-webkit-transform .
3
s;
}
.selectPanel .p-content .p-content-panel {
overflow
:
hidden
;
width
:
100%
;
-webkit-box-flex:
1
;
-moz-box-flex:
1
;
-webkit-flex:
1
;
-ms-flex:
1
;
flex:
1
;
border-left
:
1px
solid
#e3e3e3
;
height
:
9.22
rem;
overflow-y:
scroll
;
overflow-x:
hidden
;
-webkit-overflow-scrolling: touch;
height
:
7.5
rem;
}
.selectPanel .p-content .p-first > li {
line-height
:
1.05
rem;
position
:
relative
;
list-style
:
none
;
border-bottom
:
1px
solid
rgba(
188
,
187
,
187
,
0.28
);
padding
:
0
.
234
rem
0
.
3
rem;
overflow
:
hidden
;
white-space
:
nowrap
;
text-
overflow
: ellipsis;
}
.selectPanel .p-content .p-second > li {
line-height
:
1.05
rem;
position
:
relative
;
list-style
:
none
;
border-bottom
:
1px
solid
rgba(
188
,
187
,
187
,
0.28
);
padding
:
0
.
234
rem
0
.
3
rem;
overflow
:
hidden
;
white-space
:
nowrap
;
text-
overflow
: ellipsis;
}
.selectPanel .p-content .p-second .foldIco {
background-image
:
url
(../../SelectPanel/Images/
67
.png);
background-repeat
:
no-repeat
;
background-
size
: .
25
rem;
background-position
:
90%
.
35
rem;
}
.selectPanel .p-content .p-second .expandIco {
background-image
:
url
(../../SelectPanel/Images/
86
.png);
background-repeat
:
no-repeat
;
background-
size
: .
25
rem;
background-position
:
90%
.
35
rem;
}
.selectPanel .p-content .p-three > li {
line-height
:
1.05
rem;
position
:
relative
;
list-style
:
none
;
border-bottom
:
1px
solid
rgba(
188
,
187
,
187
,
0.28
);
padding
:
0
.
234
rem
0
.
6
rem;
overflow
:
hidden
;
white-space
:
nowrap
;
text-
overflow
: ellipsis;
}
.selectPanel .act {
background-color
: rgba(
255
,
214
,
0
,
0.14
);
color
:
#0180cf
;
}
/*按钮定义*/
.sl-btn {
position
:
relative
;
display
:
block
;
margin-left
:
auto
;
margin-right
:
auto
;
padding-left
: .
3
rem;
padding-right
: .
3
rem;
text-align
:
center
;
text-decoration
:
none
;
color
:
#FFFFFF
;
line-height
: .
98
rem;
border-radius: .
08
rem;
-webkit-tap-highlight-
color
: rgba(
0
,
0
,
0
,
0
);
overflow
:
hidden
;
-moz-user-select:
none
;
-webkit-user-select:
none
;
-ms-user-select:
none
;
-khtml-user-select:
none
;
user-select:
none
;
border
:
0px
;
}
.sl-btn-
inline
{
display
: inline-
block
;
}
.sl-btn-
medium
{
height
: .
8
rem;
line-height
: .
78
rem;
}
.sl-btn-
small
{
height
: .
6
rem;
line-height
: .
58
rem;
}
.sl-btn-border-
gray
{
color
:
#666
;
border
:
1px
solid
rgba(
0
,
0
,
0
,
0.2
);
}
.sl-btn-border-gray:not(.qs-btn-border-disabled):active, .qs-btn-border-gray:not(.qs-btn-border-disabled).eventactive {
color
: rgba(
0
,
0
,
0
,
0.6
);
background-color
:
#DEDEDE
;
}
.sl-btn-border-orange {
color
:
#fd8000
;
border
:
1px
solid
#fd8000
;
}
.sl-btn-border-orange:not(.qs-btn-border-disabled):active, .qs-btn-border-orange:not(.qs-btn-border-disabled).eventactive {
color
:
#fff
;
background-color
:
#fb9934
;
}
html {
font-family
:
"microsoft yahei"
,
"宋体"
;
-webkit-text-size-adjust:
100%
;
font-size
:
100px
;
}
body {
margin
:
0
;
max-width
:
7.5
rem;
min-height
:
100%
;
min-width
:
320px
;
margin
:
0
auto
;
color
:
#666666
;
background-color
:
#f2f2f2
;
-webkit-overflow-scrolling: touch;
font-size
: .
3
rem;
}
* {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
h
1
, h
2
, h
3
, h
4
, h
5
, form, p, ul, input {
margin
:
0px
;
padding
:
0px
;
}
input, textarea {
font-family
:
"microsoft yahei"
,
"宋体"
;
font-size
: .
27857142
rem;
color
:
#666666
;
}
li {
padding
:
0px
;
margin
:
0px
;
line-height
:
180%
;
list-style-type
:
none
;
}
.font
9
{
font-size
: .
1888
rem;
}
.font
10
{
font-size
: .
234
rem;
}
.font
12
{
font-size
: .
25714285
rem;
}
.font
13
{
font-size
: .
27857142
rem;
}
.font
14
{
font-size
: .
3
rem;
}
.font
15
{
font-size
: .
32142857
rem;
}
.font
16
{
font-size
: .
34285714
rem;
}
.font
18
{
font-size
: .
38571428
rem;
}
.font
20
{
font-size
: .
468
rem;
}
.font
24
{
font-size
: .
56249999
rem;
}
.font
28
{
font-size
: .
65624999
rem;
}
|
四、数据获取代码
数据获取代码是在.net mvc的c层完成的,根据你的项目需要需要自己完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//地区选择控件使用
public
ActionResult GetAreaList()
{
var pId = ClassesLib.GetString(
"pId"
);
string
sqStr =
"Select ID,NAME,PID from KZRCW.TSSYS_AREA where PID = '"
+ pId +
"' order by id"
;
List<TSSYS_AREA> list = db.Database.SqlQuery<TSSYS_AREA>(sqStr).ToList();
for
(
int
i = 0; i < list.Count; i++)
{
var pidStr = list[i].ID;
var listKid = db.TSSYS_AREA.Where(c => c.PID == pidStr).ToList();
if
(listKid.Count > 0)
list[i].PID =
"Yes"
;
else
list[i].PID =
"No"
;
}
return
Json(list, JsonRequestBehavior.AllowGet);
}
|
五、调用方法-控件使用方法
1
2
3
|
<
body
>
<
input
id
=
"inputVal"
/>
</
body
>
|
1
2
3
|
$(
"#inputVal"
).focus(
function
() {
$.selectPanel(
"1"
,
"/PubConfig/GetAreaList"
,
"山东省"
,
"inputVal"
);
});
|
使用时需要传入4个参数,第一个是最多允许选择的个数、第二个数据获取路径,第三个第一层默认选择值,第四个选择完成后选择值需要赋予的控件ID。