uniapp中H5定位功能实现

news2024/12/24 20:42:49

1.要实现该功能 必须使用vue-jsonp进行跨域

JSONP是一种跨域数据请求的解决方案,它使用script元素来请求数据,再利用回调函数将数据传回页面。

Vue框架提供了对JSONP的支持,可以方便地在Vue应用中使用JSONP获取跨域数据。下面我们来了解一下Vue使用JSONP的步骤。

第一步:在Vue应用中安装jsonp插件:

yarn add vue-jsonp

第二步:在Vue应用入口处引用并安装jsonp插件:

import { VueJsonp } from 'vue-jsonp'
Vue.use(VueJsonp)

2.要在uniapp的manifest.json中web配置中进行地图配置,填写腾讯地图api中的key,我个人使用的是腾讯地图

在 manifest.json的源码视图中,看到H5相关配置

 然后到你需要定位的页面写上一下代码

// #ifdef H5
let url = 'https://apis.map.qq.com/ws/geocoder/v1/'
let data = {
	location: res.latitude + ',' + res.longitude,
	key: 'NJNBZ-XS33X-WOM4O-ZLIG5-POXA3-ILFJC',
	output: 'jsonp',
	callback: 'jsonp'
	}
	console.log(this);
	this.$jsonp(url, data).then(res => {
	if (res.status == 0) {
		console.log(res)
				
	} else {
		console.log(res)
	}
	})
// #endif

以下是页面完整代码

<template>
	<view>
		<!-- #ifdef MP -->
		<search-slot>
			<view class="mx-1" slot="left">
				<text class="iconfont icon-xiaoxi"></text>
			</view>
			<view class="flex-1 search-title text-muted" slot="center" @click="goSearch">
				请输入搜索内容
			</view>
			<view class="mx-1" slot="right" @click="scanCode">
				<text class="iconfont icon-richscan_icon"></text>
			</view>
		</search-slot>
		<!-- #endif -->
		<view style="height: 60rpx;line-height: 60rpx;background-color: rgba(255,0,0,0.1);">
			{{address}}
		</view>
		<scroll-view scroll-x="true" class="white-space mt-1 scroll-title" :scroll-into-view="scrollinto">
			<view v-for="(item,index) in navbars" :key="index" :id="'tab'+index" class="d-inline-block mx-2"
				:class="currentIndex==index?'active':''" @click="changeTab(index)">{{item.name}}</view>
		</scroll-view>
		<swiper :style="'height:'+scrollH" :current="currentIndex" @change="changeIndex">
			<swiper-item v-for="(newItem,i) in newsItems" :key="i" :style="'height:'+scrollH">

				<!-- 	<view style="height:300px ;">
							{{JSON.stringify(news.type)}}
						</view> -->
				<view class="swiper-item">
					<scroll-view scroll-y="true" :style="'height:'+scrollH" @scrolltolower="scrolltolower(i)">
						<template v-if="newItem.list.length>0">
							<block v-for="(news,j) in newItem.list" :key="j">
								<!-- 轮播图 -->
								<template v-if="news.type=='swiper'">
									<swiper-banner :swipers="news.data"></swiper-banner>
								</template>
								<!-- 金刚区-->
								<template v-else-if="news.type=='indexnavs'">
									<fast-navs :pagees="pagees"></fast-navs>
								</template>
								<template v-else-if="news.type=='threeAdv'">
									<!-- 瓷片区 -->
									<divider></divider>
									<three-adv :news="news.data"></three-adv>
								</template>
								<template v-else-if="news.type=='oneAdv'">
									<one-adv :title="news.data.title" :cover="news.data.cover"></one-adv>
								</template>
								<template v-else-if="news.type=='list'">
									<common-list :news="news.data"></common-list>
								</template>
							</block>
							<view class="text-center text-muted my-1">{{newItem.loadmore}}</view>
						</template>
						<template v-else-if="newsItems[i].forward=='before'">
							<view class="text-center text-dark">
								加载中…
							</view>
						</template>
						<template v-else>
							<view class="text-center text-dark">
								暂无数据
							</view>
						</template>
					</scroll-view>
				</view>
			</swiper-item>
		</swiper>
		<sk-index v-if="isSkShow"></sk-index>
	</view>
</template>

<script>
	var QQMapWX = require('../../common/lib/qqmap-wx-jssdk.min.js');
	import {
		getHome,
		getPage
	} from '../../api/index.js'
	export default {
		data() {
			return {
				isSkShow:true,
				address: "",
				qqmapsdk: "",
				scrollH: 0,
				scrollinto: '',
				currentIndex: 0,
				navbars: [],
				newsItems: []
			}
		},
		onLoad() {
			uni.getSystemInfo({
					success: (e) => {
						// #ifdef APP-PLUS||H5
						this.scrollH = e.windowHeight - uni.upx2px(98) + 'px'
						// #endif
						// #ifdef MP
						this.scrollH = e.windowHeight - uni.upx2px(266) + 'px'
						// #endif
					}
				}),
				this.qqmapsdk = new QQMapWX({
					key: 'NJNBZ-XS33X-WOM4O-ZLIG5-POXA3-ILFJC'
				});
				uni.getLocation({
					type: 'gcj02',
					highAccuracyExpireTime: 100,
					success: (res) => {
						console.log('当前位置的经度:' + res.longitude);
						console.log('当前位置的纬度:' + res.latitude);
						// #ifdef MP
						this.qqmapsdk.reverseGeocoder({
							location: {
								latitude: res.latitude,
								longitude: res.longitude
							},
							success: (res2) => {
								console.log('221432423');
								console.log(res2);
								this.address = res2.result.address
							}
						})
						// #endif
						// #ifdef H5
						let url = 'https://apis.map.qq.com/ws/geocoder/v1/'
						let data = {
							location: res.latitude + ',' + res.longitude,
							key: 'NJNBZ-XS33X-WOM4O-ZLIG5-POXA3-ILFJC',
							output: 'jsonp',
							callback: 'jsonp'
						}
						console.log(this);
						this.$jsonp(url, data).then(res => {
							if (res.status == 0) {
								console.log(res)
				
							} else {
								console.log(res)
							}
						})
						// #endif
				
					}
				});
		},
		onNavigationBarSearchInputClicked() {
			uni.navigateTo({
				url:'/pages/search/search'
			})
		},
		//原生跳转到搜索页
		onNavigationBarButtonTap(e) {
			console.log(e);
		},
		mounted() {
			this.gethome()
			

		},
		computed: {
			pagees() {
				let pages = [] //[[1,2,3,4,5,6,7,8],[9,10]] 
				let index = this.currentIndex
				if (this.newsItems[index]) {
					this.newsItems[index].list.map(item => {
						if (item.type == 'indexnavs') {
							let indexnavs = Object.values(item.data)
							indexnavs.forEach((v, i) => {
								let page = Math.floor(i / 8)
								if (!pages[page]) {
									pages[page] = []
								}
								pages[page].push(v)
							})
						}
					})
				}
				return pages
			}
		},
		methods: {
			//请求数据
			gethome() {
				getHome().then(res => {
					console.log('res=>', res);
					this.navbars = res.data.category
					var arr = []
					for (var i = 0; i < this.navbars.length; i++) {
						let forward = i == 0 ? 'after' : 'before'
						var obj = {
							list: [],
							loadmore: '加载更多…',
							forward: forward
						}
						if (i == 0) {
							obj.list = res.data.data
						}
						arr.push(obj)
					}
					this.newsItems = arr
					this.isSkShow = false
					console.log('newsItems=>', this.newsItems);
				})
			},
			//小程序跳转到搜索页
			goSearch() {
				uni.navigateTo({
					url:'/pages/search/search'
				})
			},
			//扫码
			scanCode() {
				uni.scanCode({
					success: function(res) {
						console.log('条码类型:' + res.scanType);
						console.log('条码内容:' + res.result);
					}
				});
			},
			//切换标题
			changeTab(index) {
				if (this.currentIndex == index) return
				this.currentIndex = index
				this.scrollinto = 'tab' + index
				if (this.currentIndex < 6) {
					this.scrollinto = 'tab0'
				}
			},
			//当swiper切换时触发
			changeIndex(e) {
				console.log(e);
				this.currentIndex = e.detail.current
				if (this.newsItems[this.currentIndex].forward == 'after') {
					return;
				} else {
					this.getpage()
				}

			},
			//请求不同标题下页面数据
			getpage(callback) {
				let index = this.currentIndex
				let id = this.navbars[index].id
				let obj = this.newsItems[index]
				let page = Math.ceil(obj.list.length / 5) + 1
				console.log('page=>', page);
				obj.forward = 'before'
				getPage(id, page).then(res => {
					console.log(res);
					let data = res.data
					if (data) {
						obj.list = [...obj.list, ...data]
						obj.loadmore = data.length < 5 ? '没有更多了…' : '加载更多…'
					}
					obj.forward = 'after'
				})
				if (typeof callback == 'function') {
					callback()
				}
			},
			//下拉加载更多
			scrolltolower(index) {
				//加载更多…  加载中…  没有更多了…
				if (this.newsItems[index].loadmore != '加载更多…') {
					return;
				} else {
					this.newsItems[index].loadmore = '加载中…'
					this.getpage(() => {
						uni.showToast({
							title: '加载成功'
						})
					})
				}


			}
		}
	}
</script>

<style>
	.search-title {
		height: 88rpx;
		line-height: 88rpx;
		background-color: #eee;
		border-radius: 44rpx;
		text-indent: 30rpx;
	}

	.scroll-title {
		height: 88rpx;
		line-height: 60rpx;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的&#xff0c;在每次进行修改操作时&#xff0c;都不会产生新的对象&#xff0c;所以在进行修改的时候&#xff0c;尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

keepalived安装配置详解

文章目录 高可用介绍keepalived安装、使用vip漂移抓包脑裂脑裂有没有危害&#xff1f;如果有危害对业务有什么影响&#xff1f; keepalived架构双vip架构 Healthcheck实现 notifyVRRP选举格式 高可用 介绍 高可用性&#xff08;High Availability&#xff09;是指系统或服务能…

Linux的locale本地化配置

Linux的locale本地化配置 locale简介localectl常用操作语言环境键盘布局 常见问题:配置语言环境报错Linux系统locale(UTF-8)报错最小化自动安装的Centos7修改完整中文显示 locale简介 参考: http://m.blog.chinaunix.net/uid-20621049-id-3427444.html locale把按照所涉及到的…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一&#xff0c;以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript&#xff0c;网站安装ImageMagick&#xff0c;网站 安装完毕后&#xff0c;需要自行配置环境路径 脚本 使用示…

灌区信息化智能测控一体化闸门系统解决方案

一、方案背景 闸门是节水灌溉工程中重要组成部分。在农田灌区中&#xff0c;一方面存在传统手摇闸门&#xff0c;未能实现自动化、数字化&#xff0c;另一方面部分灌区闸站虽然部分实现了自动化控制&#xff0c;但是由于闸站较多&#xff0c;有些位置较为偏僻&#xff0c;部分水…

网络数据安全风险评估实施指引(一)

近日&#xff0c;全国信息安全标准化技术委员会发布了《网络安全标准实践指南 网络数据安全风险评估实施指引》&#xff08;TC260-PG-20231A v1.0-202305&#xff09;&#xff0c;旨在响应《数据安全法》要求&#xff0c;落实重要数据处理过程风险评估&#xff0c;衔接已发布的…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展&#xff0c;使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构&#xff0c;我们能够构建出更强大、可靠且可持续的前…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客&#xff1a;OpenCV实现将任意形状ROI区域置黑&#xff08;多边形区域置黑&#xff09; 比较常用的是使用 Rect 矩形实现该功能&#xff0c;代码如下&…

vmware-ubuntu 出现的奇怪问题

虚拟机突然连不上网 参考博文-CSDN-卍一十二画卍&#xff08;作者&#xff09;-Vmware虚拟机突然连接不上网络【方案集合】 sudo vim /var/lib/NetworkManager/NetworkManager.statesudo service network-manager stop sudo vim /var/lib/NetworkManager/NetworkManager.stat…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联&#xff0c;本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络&#xff0c;通过mac地址互通&#xff0c;不通过路由互通。跨子网&#x…

Java Vue物联网系统

一个简单易用的物联网平台&#xff0c;可用于搭建物联网平台以及二次开发和学习。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用Vue&#xff1b;消息服务器采用EMQX&#xff1b; 技术栈 服务端相关技术…

Vector - CANoe - DoIP在CANoe应用

目录 背景说明 一、DoIP通信说明 1、连接(Connection) 2、车辆发现(Vehicle Discovery)

第一阶段-第八章 Python的文件操作

目录 一、文件的编码  1.学习目标  2.文件编码  3.查看文件编码  4.本小节的总结 二、文件的读取  1.学习目标  2.什么是文件  3.文件包含的操作&#xff08;打开、关闭、读、写&#xff09;  4.文件的操作步骤&#xff08;打开或创建文件open&#xff08;mode…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 14 日论文合集)

文章目录 一、检测相关(6篇)1.1 LVLane: Deep Learning for Lane Detection and Classification in Challenging Conditions1.2 Garbage in, garbage out: Zero-shot detection of crime using Large Language Models1.3 Robotic surface exploration with vision and tactile …

汽车电子 -- 使用CANdb++ Editor创建并制作一个DBC

参看&#xff1a;关于DBC文件的创建&#xff08;DBC文件系列其一&#xff09; 一、什么是DBC DBC文件是DataBase Container文件的缩写。 CAN数据库文件也称为后缀为&#xff08;.dbc&#xff09;的文件。DBC文件是基本的文本文件&#xff0c;其中包括将原始CAN总线数据解码为…

Raft算法之日志复制

Raft算法之日志复制 一、日志复制大致流程 在Leader选举过程中&#xff0c;集群最终会选举出一个Leader节点&#xff0c;而集群中剩余的其他节点将会成为Follower节点。Leader节点除了向Follower节点发送心跳消息&#xff0c;还会处理客户端的请求&#xff0c;并将客户端的更…

音频播放器Web页面代码实例(基于HTML5)

音频播放器Web页面代码实例&#xff08;基于HTML5&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><…

C/C++自定义类型(详解struct,enum,union)

目录 一&#xff0c;struct 1&#xff09;结构及一般使用方法 2&#xff09;无名结构体 3&#xff09;巧用typedef 4)struct小细节 5&#xff09;补充内存对齐&#xff08;提高程序可移植性&#xff0c;提高运行效率&#xff09; 二&#xff0c;enum 1)结构及一般使用方…

H3C-Cloud Lab实验-RIP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. 按照图示配置 IP 地址 2. 配置 RIP 实现全网路由互通 3. 路由器之间需要开启接口身份验证来保证协议安全性&#xff0c;密钥为 123456 实验步骤&#xff1a; 1. 配置R1的IP地址 2. 配置R2的IP地址 3. 配置R3的IP地址 4. 在…

【解决】Android Studio打包出现not found for signing config ‘externalOverride‘

问题出现场景 之前我的这个项目在另一台电脑上开发&#xff0c;现在迁移到这台计算机上&#xff0c;出现了key报错的问题&#xff0c;网络上有些说需要在XML中进行配置signature相关的内容&#xff0c;这个感觉比较复杂&#xff0c;本文主要介绍一个简单的解决方法&#xff0c;…