jQuery Mobile 表单选择菜单(Select Menus)详解
选择菜单(Select Menus) 是 jQuery Mobile 的 下拉选择组件,自动增强原生 <select>,支持 单选、多选、图标、搜索、弹窗、分组、自定义图标 等,移动端触控体验极佳。
无需 JS,只需 HTML +
data-*属性!
1. 基本结构
<label for="country">国家:</label>
<select name="country" id="country">
<option value="BE" selected>比利时</option>
<option value="CN">中国</option>
<option value="US">美国</option>
</select>
jQM 自动增强为 圆角下拉按钮
2. 选择菜单类型
| 类型 | 写法 | 效果 |
|---|---|---|
| 原生下拉 | 默认 | 小屏原生选择器 |
| 自定义菜单 | data-native-menu="false" | 弹窗式菜单(推荐) |
| 多选 | <select multiple> | 复选框列表 |
| 带图标 | data-icon="grid" | 按钮图标 |
| 搜索过滤 | data-filter="true" | 搜索选项 |
| 分组 | <optgroup> | 分组显示 |
3. 完整示例(可直接运行)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>jQM 选择菜单</title>
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>
<div data-role="page">
<div data-role="header" data-position="fixed">
<h1>选择菜单大全</h1>
</div>
<div data-role="main" class="ui-content">
<form>
<!-- 1. 基础下拉(弹窗式) -->
<div class="ui-field-contain">
<label for="country">国家:</label>
<select name="country" id="country" data-native-menu="false">
<option value="BE" selected>比利时</option>
<option value="CN">中国</option>
<option value="US">美国</option>
<option value="FR">法国</option>
<option value="DE">德国</option>
</select>
</div>
<!-- 2. 带图标 + 小号 -->
<div class="ui-field-contain">
<label for="lang">语言:</label>
<select name="lang" id="lang" data-native-menu="false"
data-icon="gear" data-mini="true">
<option value="zh">中文</option>
<option value="en" selected>English</option>
<option value="fr">Français</option>
</select>
</div>
<!-- 3. 多选菜单 -->
<div class="ui-field-contain">
<label for="hobby">兴趣(多选):</label>
<select name="hobby" id="hobby" multiple data-native-menu="false">
<option value="read">阅读</option>
<option value="sport" selected>运动</option>
<option value="music" selected>音乐</option>
<option value="travel">旅行</option>
</select>
</div>
<!-- 4. 分组菜单 -->
<div class="ui-field-contain">
<label for="city">城市:</label>
<select name="city" id="city" data-native-menu="false">
<optgroup label="欧洲">
<option value="brussels" selected>布鲁塞尔</option>
<option value="paris">巴黎</option>
<option value="berlin">柏林</option>
</optgroup>
<optgroup label="亚洲">
<option value="beijing">北京</option>
<option value="tokyo">东京</option>
</optgroup>
</select>
</div>
<!-- 5. 带搜索过滤(长列表) -->
<div class="ui-field-contain">
<label for="province">省份(带搜索):</label>
<select name="province" id="province" data-native-menu="false" data-filter="true">
<option value="antwerp">安特卫普</option>
<option value="flanders">弗拉芒</option>
<option value="wallonia">瓦隆</option>
<option value="brussels">布鲁塞尔首都区</option>
<!-- 更多选项... -->
</select>
</div>
<!-- 6. 翻转开关(特殊选择) -->
<div class="ui-field-contain">
<label for="wifi">Wi-Fi:</label>
<select name="wifi" id="wifi" data-role="flipswitch" data-mini="true">
<option value="off">关</option>
<option value="on" selected>开</option>
</select>
</div>
<!-- 7. 滑块选择(替代下拉) -->
<div class="ui-field-contain">
<label for="rating">评分:<span id="rate-val">3</span>/5</label>
<select name="rating" id="rating" data-role="slider" data-mini="true">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected>3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</div>
<!-- 8. 原生下拉(小屏优化) -->
<div class="ui-field-contain">
<label for="theme">主题(原生):</label>
<select name="theme" id="theme">
<option value="light" selected>浅色</option>
<option value="dark">深色</option>
</select>
</div>
<!-- 9. 提交按钮 -->
<button type="submit" class="ui-btn ui-btn-b ui-corner-all ui-shadow">
提交选择
</button>
</form>
<!-- 10. 当前用户信息 -->
<div style="margin-top:30px; padding:15px; background:#e6f7ff; border-radius:8px;">
<h4>实时信息</h4>
<p><strong>时间:</strong>2025年11月17日 03:11(CET)</p>
<p><strong>国家:</strong>比利时 (BE)</p>
</div>
</div>
<div data-role="footer" data-position="fixed">
<h4>比利时 © 2025</h4>
</div>
</div>
<!-- 评分滑块实时显示 -->
<script>
$(document).on("pagecreate", function() {
$("#rating").on("change", function() {
$("#rate-val").text($(this).val());
});
});
</script>
</body>
</html>
4. 选择菜单属性汇总
| 属性 | 值 | 说明 |
|---|---|---|
data-native-menu="false" | true/false | 弹窗菜单(推荐) |
data-icon="gear" | 图标名 | 按钮图标 |
data-mini="true" | — | 小号 |
multiple | — | 多选 |
data-role="flipswitch" | — | 变为 开关 |
data-role="slider" | — | 变为 滑块选择 |
data-filter="true" | — | 选项内 搜索 |
5. JavaScript 控制
<script>
$(document).on("pagecreate", function() {
// 获取值
var country = $("#country").val();
// 设置值
$("#country").val("CN").selectmenu("refresh");
// 监听变化
$("#country").on("change", function() {
console.log("选择了:" + $(this).val());
});
// 刷新(动态选项后)
$("#country").selectmenu("refresh");
});
</script>
6. 最佳实践
| 建议 | 说明 |
|---|---|
使用 data-native-menu="false" | 统一体验 |
选项 > 6 个时加 data-filter="true" | 支持搜索 |
多选用 multiple | 自动变复选列表 |
开关用 flipswitch | 更直观 |
动态选项后调用 selectmenu("refresh") | 必须 |
7. 常见问题
| 问题 | 解决方案 |
|---|---|
| 下拉不弹窗 | 必须 data-native-menu="false" |
| 动态选项不显示 | 调用 .selectmenu("refresh") |
| 搜索框不出现 | 必须 data-filter="true" |
| 多选无复选框 | 确保 multiple 属性 |
8. 推荐模板
<!-- 标准弹窗下拉 -->
<label for="sel">选择:</label>
<select id="sel" data-native-menu="false">
<option value="1">选项1</option>
<option value="2" selected>选项2</option>
</select>
<!-- 多选带搜索 -->
<select multiple data-native-menu="false" data-filter="true">
<option>选项A</option>
<option selected>选项B</option>
</select>
<!-- 开关 -->
<select data-role="flipswitch">
<option value="off">关</option>
<option value="on">开</option>
</select>
总结:选择菜单类型选择
| 场景 | 推荐写法 |
|---|---|
| 国家/语言 | data-native-menu="false" |
| 兴趣多选 | multiple |
| 长列表 | data-filter="true" |
| 开关 | data-role="flipswitch" |
| 评分 | data-role="slider" |
需要我为你生成:
- 级联下拉菜单(省份 → 城市)?
- 带图片的选项菜单?
- 自定义弹窗样式的 Select?
随时告诉我!