123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>本地网页</title>
- <style type="text/css">
- .btn {
- display: block;
- margin: 20px auto;
- padding: 5px;
- background-color: #007aff;
- border: 0;
- color: #ffffff;
- height: 40px;
- width: 200px;
- }
- .btn-red {
- background-color: #dd524d;
- }
- .desc {
- padding: 10px;
- color: #999999;
- }
- </style>
- </head>
- <body>
- <p class="desc">web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。</p>
- <div class="btn-list">
- <button class="btn" type="button" data-action="navigateTo">navigateTo</button>
- <button class="btn" type="button" data-action="redirectTo">redirectTo</button>
- <button class="btn" type="button" data-action="navigateBack">navigateBack</button>
- <button class="btn" type="button" data-action="reLaunch">reLaunch</button>
- <button class="btn" type="button" data-action="switchTab">switchTab</button>
- <button class="btn" type="button" data-action="getEnv">getEnv</button>
- <!-- <button class="btn" type="button" data-action="getTheme">获取主题</button> -->
- </div>
- <p class="desc">网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。</p>
- <div class="btn-list">
- <button class="btn btn-red" type="button" id="postMessage">postMessage</button>
- </div>
- <p class="desc"></p>本地视频</p>
- <video id="videoLocal" src="../../static/test-video/10second-demo.mp4" controls style="width: 100%;"></video>
- <p class="desc"></p>网络视频</p>
- <video id="videoWeb" src="https://qiniu-web-assets.dcloud.net.cn/video/sample/2minute-demo.mp4" controls style="width: 100%;"></video>
- <video id="videoCamera" style="width: 100%;"></video>
- <div class="btn-list">
- <button class="btn" type="button" data-action="openCamera">打开摄像头</button>
- <button class="btn" type="button" data-action="closeCamera">关闭摄像头</button>
- <button class="btn" type="button" data-action="getLocation">获取定位</button>
- </div>
- <p class="desc">文件选择</p>
- <div style="padding: 0 10px;">
- <p style="font-size: 14px;"><input type="file" /></p>
- <input type="file" />
- <p style="font-size: 14px;"><input type="file" accept="image/*" multiple /></p>
- <input type="file" accept="image/*" multiple />
- <p style="font-size: 14px;">普通input</p>
- <input placeholder="底部输入框" />
- <p style="font-size: 14px;">普通input2</p>
- <input placeholder="底部输入框2" />
- <p style="font-size: 14px;">普通input3</p>
- <input placeholder="底部输入框3" />
- <br />
- <p style="font-size: 14px;">普通textarea</p>
- <textarea placeholder="底部textarea"></textarea>
- <br />
- <a href="https://web-ext-storage.dcloud.net.cn/uni-app-x/pkg/hello-uniappx.apk" download>hello uni-app x
- apk下载(自动化测试使用)</a>
- <iframe width="100%" height="250px" srcdoc="<p>iframe中输入框示例</p>
- <p style="font-size: 14px;">普通input</p>
- <input placeholder="底部输入框" />
- <p style="font-size: 14px;">普通input2</p>
- <input placeholder="底部输入框2" />
- <p style="font-size: 14px">普通input3</p>
- <input placeholder="底部输入框3" />
- <p style="font-size: 14px;">普通textarea</p>
- <textarea placeholder="底部textarea"></textarea>">
- </iframe>
- </div>
- <!-- uni 的 SDK -->
- <script type="text/javascript" src="uni.webview.1.5.5.js"></script>
- <script type="text/javascript">
- function postMessage(action) {
- uni.webView.postMessage({
- data: {
- action
- }
- });
- }
- const isWeb = location.href && /^https?:/.test(location.href)
- // document.addEventListener('UniAppJSBridgeReady', function() {
- document.querySelectorAll('.btn-list').forEach(btnList => {
- btnList.addEventListener('click', function(evt) {
- console.log('按钮点击事件触发');
- if (isWeb) {
- alert('web端暂不支持此功能')
- return
- }
- console.log('evt: ',evt);
- var target = evt.target;
- console.log('target: ', target);
- if (target.tagName === 'BUTTON') {
- var action = target.getAttribute('data-action');
- console.log(action);
- switch (action) {
- case 'switchTab':
- uni.webView.switchTab({
- url: '/pages/tabBar/API'
- });
- break;
- case 'reLaunch':
- uni.webView.reLaunch({
- url: '/pages/tabBar/component'
- });
- break;
- case 'navigateBack':
- uni.webView.navigateBack({
- delta: 1
- });
- break;
- case 'getEnv':
- uni.webView.getEnv((res) => {
- postMessage(res)
- });
- break;
- /* case 'getTheme':
- alert(getThemePreference())
- break; */
- case 'getLocation':
- if (navigator.geolocation) {
- navigator.geolocation.getCurrentPosition(
- function(position) {
- const locationData = {
- latitude: position.coords.latitude,
- longitude: position.coords.longitude,
- accuracy: position.coords.accuracy
- };
- console.log('position: ',JSON.stringify(locationData));
- alert(JSON.stringify(locationData));
- },
- function(error) {
- console.error('获取位置失败:', error.message);
- alert('获取位置失败: ' + error.message);
- },
- {
- enableHighAccuracy: true,
- timeout: 5000,
- maximumAge: 0
- }
- );
- } else {
- alert('您的浏览器不支持地理定位功能');
- }
- break;
- case 'openCamera':
- var constraints = {audio: true,video: {facingMode: "user"}};
- navigator.mediaDevices
- .getUserMedia(constraints)
- .then(function(mediaStream) {
- var video = document.getElementById("videoCamera");
- video.srcObject = mediaStream;
- video.onloadedmetadata = function(e) {
- video.play();
- };
- })
- .catch(function(err) {
- console.log(err.name + ": " + err.message);
- }); // 总是在最后检查错误
- break;
- case 'closeCamera':
- var video = document.getElementById("videoCamera");
- if (video.srcObject) {
- video.srcObject.getTracks().forEach(function(track) {
- track.stop();
- });
- video.srcObject = null; // 清除视频源
- video.load(); // 重新加载视频元素
- }
- break;
- default:
- uni.webView[action]({
- url: '/pages/component/button/button'
- });
- break;
- }
- }
- })
- })
- // });
- document.querySelector("#postMessage").addEventListener('click', function() {
- if (isWeb) {
- alert('web端暂不支持此功能')
- return
- }
- postMessage('message')
- })
- /* function getThemePreference() {
- if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
- return 'dark';
- } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
- return 'light';
- }
- return 'unknown';
- } */
- </script>
- </body>
- </html>
|