前端之下拉列表项的转移(通过一个函数传参实现)

本文介绍了一种使用JavaScript实现下拉列表项双向转移的方法,并详细解释了代码中的关键部分,包括如何处理选中的选项及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天带来的是js实现的下拉列表项的转移,其中有两个特别需要注意的地方,一个是在按钮中调用函数时参数的传递,一个是表单对象的name可不可以当作参数传递。

首先我把代码给出:(直接复制就可以测试效果了)

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>下拉框的文本转移</title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			.wide {
				width: 400px;
				margin: 0 auto;
			}
			
			.selcetwords {
				width: 100px;
			}
		</style>
		<script type="text/javascript">
			function moveWords(oldwords,newwords) {
					
				var words = new Array();//用来保存单词的数组
				//用来获得选中的单词的value
				var temp = 0;//用来保存选中的单词数
				//保存选中的单词
				
				for(var i = 0; i < document.getElementById(oldwords).options.length; i++) {
					//判断是否选中
					if (document.getElementById(oldwords).options[i].selected) {
						//将选中的单词保存
						words[temp] = document.getElementById(oldwords).options[i].value;
						//增加要保存单词的长度
						temp ++;
					}
				}
				//删除已经被选中保存的单词
				for (var i = 0;i < words.length;i++) {
					for(var j = 0; j < document.getElementById(oldwords).options.length; j++){
						if (words[i] == document.getElementById(oldwords).options[j].value) {
							document.getElementById(oldwords).options[j].remove();
						}
					}
				}
				//赋值到目的列表
				for (var i = 0;i < words.length;i++) {
					newOption = new Option(words[i],words[i]);
					//增加列表项
					document.getElementById(newwords).options.add(newOption);
				}
			}
		</script>
	</head>

	<body>
		<div class="wide">
			<form action="#" method="post" name="myform">
				<select size="10" name="leftwords" id="leftwords" class="selcetwords" multiple="multiple">
					<option value="aaa">aaa</option>
					<option value="bbb">bbb</option>
					<option value="ccc">ccc</option>
					<option value="ddd">ddd</option>
				</select>
				<input type="button" name="" id="" value="右移" onclick="moveWords('leftwords','rightwords')"/>
				<input type="button" name="" id="" value="左移" onclick="moveWords('rightwords','leftwords')"/>
				<select size="10" name="rightwords" id="rightwords" class="selcetwords" multiple="multiple">
					<option value="xxx">xxx</option>
					<option value="yyy">yyy</option>
					<option value="zzz">zzz</option>
				</select>
			</form>
		</div>
	</body>

</html>

我来回答一下要注意的两个问题:

第一个:自己命名的参数可以加单引号。要不然会被当成未被命名的变量,加上双引号也不行

第二个:在表单的按钮中调用函数所传递的参数应该是表单所具有的参数和值。当然传递name也可以,相当于传递了自定义参数,但是现在一般都是使用id.使用id的时候不加上双引号就行。

{ "pages": [ //pages数组中第一表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages /* 主页面 */ { "path": "pages/index/index", "style": { // 导航栏标题文字内容 "navigationBarTitleText": "今天吃什么", // 是否开启下拉刷新 "enablePullDownRefresh": true } }, { "path": "pages/Inventory/Inventory", "style": { // 导航栏标题文字内容 "navigationBarTitleText": "今天吃什么", // 是否开启下拉刷新 "enablePullDownRefresh": true } }, { "path": "pages/share/share", "style": { // 导航栏标题文字内容 "navigationBarTitleText": "今天吃什么", // 是否开启下拉刷新 "enablePullDownRefresh": true } }, { "path": "pages/me/me", "style": { // 导航栏标题文字内容 "navigationBarTitleText": "今天吃什么", // 是否开启下拉刷新 "enablePullDownRefresh": true } }, ], "globalStyle": { // 导航栏标题颜色及状态栏前景颜色,仅支持 black/white "navigationBarTextStyle": "black", // 导航栏标题文字内容 "navigationBarTitleText": "今天吃什么?", // 导航栏背景颜色(同状态栏背景色) "navigationBarBackgroundColor": "#e5e5e5", "backgroundColor": "#e5e5e5" }, "uniIdRouter": { }, "tabBar": { // 字体颜色 "color": "#333333", // 选中字体颜色 "selectedColor": "#333333", "borderStyle": "black", "backgroundColor": "#fff", "fontSize": "16px", "iconWidth": "21px", "list": [{ "pagePath": "pages/index/index", "text": "菜谱", // 图标路径 "iconPath": "/static/menu.png", // 选中图标路径 "selectedIconPath": "/static/menu 0.png" }, { "pagePath": "pages/Inventory/Inventory", "text": "库存", // 图标路径 "iconPath": "/static/Inventory.png", // 选中图标路径 "selectedIconPath": "/static/Inventory 0.png" }, { "pagePath": "pages/share/share", "text": "广场", // 图标路径 "iconPath": "/static/share.png", // 选中图标路径 "selectedIconPath": "/static/share 0.png" }, { "pagePath": "pages/me/me", "text": "我的", // 图标路径 "iconPath": "/static/me.png", // 选中图标路径 "selectedIconPath": "/static/me 0.png" } ] } } 这是uniapp的pages.json文件,根据以上代码发挥想象生出完整的小程序代码,搭建一个完整的小程序,菜谱页面需要实现的功能是自定义菜单菜谱,库存页面需要实现的功能是手动录入食材信息包括名称,保质期,数量,广场页面需要实现的功能是用户菜品成果分享,我的页面需要实现登录账号,用户提交使用反馈功能
03-25
<think>好的,我现在需要帮助用户解决在UniApp中实现一个小程序的问题,该小程序需要包含四个页面的特定功能。用户已经提供了pages的配置,并希望得到完整的代码实现。我需要先理清每个页面的需求,然后考虑如何构建这些功能。 首先,用户提到的四个功能分别是: 1. 菜谱页面的自定义菜单功能。 2. 库存页面的手动录入食材信息。 3. 广场页面的用户分享功能。 4. 我的页面的登录和反馈功能。 我需要结合UniApp的开发规范和提供的引用内容来思考如何实现这些功能。根据引用[3],建议多看官方文档,确保基础知识过关,比如数据绑定和异步请求。同时,引用[2]提到小程序的前端结构,包括页面跳转和传参,这可能涉及到页面间的数据传递。 首先,菜谱页面的自定义菜单。这个功能可能需要用户能够创建、编辑和删除菜单。每个菜单可能包含多个菜谱,因此需要设计一个数据结构来存储这些信息。可能需要使用uni-list组件来展示菜单列表,添加按钮跳转到编辑页面,使用本地存储(如uni.setStorageSync)来保存用户的自定义数据。 接下来是库存页面,允许手动录入食材的名称、保质期和数量。这里需要一个表单页面,用户输入数据后存储到本地或云端。考虑到数据持久化,使用uni-app的本地存储或者连接后端数据库。如果用户没有后端,可能需要使用uniCloud或其他云服务。表单验证也是必要的,比如确保必填字段不为空。 广场页面需要用户分享菜品成果,这类似于社交功能。可能需要一个列表展示所有用户的分享,每个分享包含图片、文字和点赞数。数据存储方面,可能需要使用云数据库来存储和获取共享内容。图片上传可以使用uni.uploadFile方法,引用[3]提到需要HTTPS请求,所以确保服务器配置正确。 我的页面需要登录和反馈功能。登录可以使用微信的一键登录(uni.login),或者自定义表单。反馈功能通常是一个表单提交到后端,或者通过邮件发送。需要处理用户输入,并可能调用API发送数据。同时,引用[1]中提到错误监听的注意事,确保在调用API时处理失败情况,比如使用onError监听。 接下来,考虑整个应用的结构。每个页面对应一个.vue文件,包含模板、脚本和样式。需要配置pages.json来定义页面路径和样式。例如,底部导航栏需要设置tabBar,对应各个页面。 数据管理方面,对于自定义菜单和库存,如果不需要实时同步,可以使用本地存储。但广场页面的分享需要实时数据,最好使用云数据库。用户登录后,可能需要将数据关联到用户ID,确保多设备同步。 在代码实现上,每个页面需要: - 菜谱页面:列表展示、添加、编辑、删除功能。使用uni.navigateTo跳转到编辑页面,通过query参数传递菜单ID以区分新建和编辑。数据保存在本地存储中,使用JSON序列化。 - 库存页面:表单输入,保存到本地存储的数组结构中。展示食材列表,支持删除和修改。可能需要使用uni-datetime-picker组件选择保质期日期。 - 广场页面:获取云端数据并展示,包含图片、用户信息和点赞按钮。用户发布分享时,调用上传图片接口,然后将数据提交到云端。 - 我的页面:登录按钮触发微信登录,获取用户信息。反馈表单提交到后端接口,使用uni.request发送POST请求。需要处理登录状态,使用vuex或全局变量保存用户token。 还需要考虑一些细节,比如本地存储的键名管理,避免冲突。表单验证,比如食材名称不能为空,数量必须为数字。图片上传的大小限制和格式处理。用户反馈的内容需要过滤敏感词,防止恶意输入。 此外,引用[3]中提到开发前需要准备HTTPS域名和SSL证书,所以如果用户使用自己的服务器,需要确保配置正确。如果使用uniCloud,可以省去部分配置,但需要学习云函数的编写。 测试方面,每个功能点需要逐一验证。例如,自定义菜单能否正确保存和读取,库存录入是否处理边界情况(如过期食材提示),广场页面的分享是否实时更新,登录是否持久化等。 最后,代码结构需要清晰,组件复用,比如共用的表单组件或列表组件。样式方面使用flex布局适配不同屏幕,引用uni-app的样式变量保持一致性。 可能遇到的问题包括:本地存储的数据结构设计不合理导致性能问题,图片上传失败的处理,用户登录状态的维持,以及跨页面的数据同步。需要参考uni-app文档和社区解决方案,确保代码健壮性。</think>根据需求,我们将分步骤实现UniApp小程序的四个核心功能模块。以下是具体实现方案(基于Vue.js语法): ### 一、项目结构配置 ```javascript // pages.json { "pages": [ {"path": "pages/recipe/index", "style": {}}, {"path": "pages/inventory/index", "style": {}}, {"path": "pages/square/index", "style": {}}, {"path": "pages/profile/index", "style": {}} ], "tabBar": { "list": [ {"pagePath": "pages/recipe/index", "text": "菜谱"}, {"pagePath": "pages/inventory/index", "text": "库存"}, {"pagePath": "pages/square/index", "text": "广场"}, {"pagePath": "pages/profile/index", "text": "我的"} ] } } ``` ### 二、菜谱页面实现 ```html <!-- pages/recipe/index.vue --> <template> <view> <uni-list> <uni-list-item v-for="menu in menus" :key="menu.id" :title="menu.name" @click="navigateToEdit(menu.id)"> </uni-list-item> </uni-list> <button @click="createNewMenu">新建菜单</button> </view> </template> <script> export default { data() { return { menus: [] } }, onShow() { this.loadMenus() }, methods: { loadMenus() { this.menus = uni.getStorageSync('userMenus') || [] }, createNewMenu() { uni.navigateTo({ url: '/pages/recipe/edit' }) } } } </script> ``` ### 三、库存管理实现 ```html <!-- pages/inventory/index.vue --> <template> <view> <uni-form ref="form"> <uni-form-item label="食材名称"> <input v-model="form.name" /> </uni-form-item> <uni-form-item label="保质期"> <uni-datetime-picker v-model="form.expiry" /> </uni-form-item> <uni-form-item label="数量"> <input type="number" v-model="form.quantity" /> </uni-form-item> </uni-form> <button @click="saveItem">保存食材</button> </view> </template> <script> export default { data() { return { form: { name: '', expiry: '', quantity: 0 } } }, methods: { saveItem() { const items = uni.getStorageSync('foodItems') || [] items.push({...this.form, id: Date.now()}) uni.setStorageSync('foodItems', items) } } } </script> ``` ### 四、广场分享功能 ```html <!-- pages/square/index.vue --> <template> <scroll-view> <view v-for="post in posts" :key="post.id"> <image :src="post.image" mode="aspectFill" /> <text>{{ post.content }}</text> <button @click="likePost(post.id)">点赞 {{ post.likes }}</button> </view> <button @click="createPost">发布新内容</button> </scroll-view> </template> <script> export default { data() { return { posts: [] } }, onLoad() { this.loadPosts() }, methods: { async loadPosts() { const res = await uni.request({ url: 'https://api.example.com/posts' }) this.posts = res.data }, createPost() { uni.chooseImage({ success: (res) => { uni.navigateTo({ url: `/pages/square/create?tempFile=${res.tempFilePaths[0]}` }) } }) } } } </script> ``` ### 五、用户系统实现 ```html <!-- pages/profile/index.vue --> <template> <view v-if="!userInfo"> <button @click="wechatLogin">微信登录</button> </view> <view v-else> <text>欢迎,{{ userInfo.nickName }}</text> <uni-form @submit="submitFeedback"> <textarea v-model="feedback" placeholder="输入反馈内容"></textarea> <button form-type="submit">提交反馈</button> </uni-form> </view> </template> <script> export default { data() { return { userInfo: null, feedback: '' } }, methods: { wechatLogin() { uni.login({ provider: 'weixin', success: (res) => { uni.getUserInfo({ success: (infoRes) => { this.userInfo = infoRes.userInfo uni.setStorageSync('userInfo', infoRes.userInfo) } }) } }) }, submitFeedback() { uni.request({ url: 'https://api.example.com/feedback', method: 'POST', data: { content: this.feedback, userId: this.userInfo.openId } }) } } } </script> ``` ### 六、注意事 1. 数据存储:敏感数据应使用`uni.setStorageSync`加密存储[^3] 2. 接口安全:所有API请求需使用HTTPS协议并配置合法域名[^2] 3. 性能优化:大数据列表应使用虚拟滚动技术 4. 错误处理:需实现全局错误监听`onError`处理异常[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值