local.html 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>本地网页</title>
  7. <style type="text/css">
  8. .btn {
  9. display: block;
  10. margin: 20px auto;
  11. padding: 5px;
  12. background-color: #007aff;
  13. border: 0;
  14. color: #ffffff;
  15. height: 40px;
  16. width: 200px;
  17. }
  18. .btn-red {
  19. background-color: #dd524d;
  20. }
  21. .desc {
  22. padding: 10px;
  23. color: #999999;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <p class="desc">web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。</p>
  29. <div class="btn-list">
  30. <button class="btn" type="button" data-action="navigateTo">navigateTo</button>
  31. <button class="btn" type="button" data-action="redirectTo">redirectTo</button>
  32. <button class="btn" type="button" data-action="navigateBack">navigateBack</button>
  33. <button class="btn" type="button" data-action="reLaunch">reLaunch</button>
  34. <button class="btn" type="button" data-action="switchTab">switchTab</button>
  35. <button class="btn" type="button" data-action="getEnv">getEnv</button>
  36. <!-- <button class="btn" type="button" data-action="getTheme">获取主题</button> -->
  37. </div>
  38. <p class="desc">网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。</p>
  39. <div class="btn-list">
  40. <button class="btn btn-red" type="button" id="postMessage">postMessage</button>
  41. </div>
  42. <p class="desc"></p>本地视频</p>
  43. <video id="videoLocal" src="../../static/test-video/10second-demo.mp4" controls style="width: 100%;"></video>
  44. <p class="desc"></p>网络视频</p>
  45. <video id="videoWeb" src="https://qiniu-web-assets.dcloud.net.cn/video/sample/2minute-demo.mp4" controls style="width: 100%;"></video>
  46. <video id="videoCamera" style="width: 100%;"></video>
  47. <div class="btn-list">
  48. <button class="btn" type="button" data-action="openCamera">打开摄像头</button>
  49. <button class="btn" type="button" data-action="closeCamera">关闭摄像头</button>
  50. <button class="btn" type="button" data-action="getLocation">获取定位</button>
  51. </div>
  52. <p class="desc">文件选择</p>
  53. <div style="padding: 0 10px;">
  54. <p style="font-size: 14px;">&lt;input type="file" /&gt;</p>
  55. <input type="file" />
  56. <p style="font-size: 14px;">&lt;input type="file" accept="image/*" multiple /&gt;</p>
  57. <input type="file" accept="image/*" multiple />
  58. <p style="font-size: 14px;">普通input</p>
  59. <input placeholder="底部输入框" />
  60. <p style="font-size: 14px;">普通input2</p>
  61. <input placeholder="底部输入框2" />
  62. <p style="font-size: 14px;">普通input3</p>
  63. <input placeholder="底部输入框3" />
  64. <br />
  65. <p style="font-size: 14px;">普通textarea</p>
  66. <textarea placeholder="底部textarea"></textarea>
  67. <br />
  68. <a href="https://web-ext-storage.dcloud.net.cn/uni-app-x/pkg/hello-uniappx.apk" download>hello uni-app x
  69. apk下载(自动化测试使用)</a>
  70. <iframe width="100%" height="250px" srcdoc="<p>iframe中输入框示例</p>
  71. <p style=&quot;font-size: 14px;&quot;>普通input</p>
  72. <input placeholder=&quot;底部输入框&quot; />
  73. <p style=&quot;font-size: 14px;&quot;>普通input2</p>
  74. <input placeholder=&quot;底部输入框2&quot; />
  75. <p style=&quot;font-size: 14px&quot;>普通input3</p>
  76. <input placeholder=&quot;底部输入框3&quot; />
  77. <p style=&quot;font-size: 14px;&quot;>普通textarea</p>
  78. <textarea placeholder=&quot;底部textarea&quot;></textarea>">
  79. </iframe>
  80. </div>
  81. <!-- uni 的 SDK -->
  82. <script type="text/javascript" src="uni.webview.1.5.5.js"></script>
  83. <script type="text/javascript">
  84. function postMessage(action) {
  85. uni.webView.postMessage({
  86. data: {
  87. action
  88. }
  89. });
  90. }
  91. const isWeb = location.href && /^https?:/.test(location.href)
  92. // document.addEventListener('UniAppJSBridgeReady', function() {
  93. document.querySelectorAll('.btn-list').forEach(btnList => {
  94. btnList.addEventListener('click', function(evt) {
  95. console.log('按钮点击事件触发');
  96. if (isWeb) {
  97. alert('web端暂不支持此功能')
  98. return
  99. }
  100. console.log('evt: ',evt);
  101. var target = evt.target;
  102. console.log('target: ', target);
  103. if (target.tagName === 'BUTTON') {
  104. var action = target.getAttribute('data-action');
  105. console.log(action);
  106. switch (action) {
  107. case 'switchTab':
  108. uni.webView.switchTab({
  109. url: '/pages/tabBar/API'
  110. });
  111. break;
  112. case 'reLaunch':
  113. uni.webView.reLaunch({
  114. url: '/pages/tabBar/component'
  115. });
  116. break;
  117. case 'navigateBack':
  118. uni.webView.navigateBack({
  119. delta: 1
  120. });
  121. break;
  122. case 'getEnv':
  123. uni.webView.getEnv((res) => {
  124. postMessage(res)
  125. });
  126. break;
  127. /* case 'getTheme':
  128. alert(getThemePreference())
  129. break; */
  130. case 'getLocation':
  131. if (navigator.geolocation) {
  132. navigator.geolocation.getCurrentPosition(
  133. function(position) {
  134. const locationData = {
  135. latitude: position.coords.latitude,
  136. longitude: position.coords.longitude,
  137. accuracy: position.coords.accuracy
  138. };
  139. console.log('position: ',JSON.stringify(locationData));
  140. alert(JSON.stringify(locationData));
  141. },
  142. function(error) {
  143. console.error('获取位置失败:', error.message);
  144. alert('获取位置失败: ' + error.message);
  145. },
  146. {
  147. enableHighAccuracy: true,
  148. timeout: 5000,
  149. maximumAge: 0
  150. }
  151. );
  152. } else {
  153. alert('您的浏览器不支持地理定位功能');
  154. }
  155. break;
  156. case 'openCamera':
  157. var constraints = {audio: true,video: {facingMode: "user"}};
  158. navigator.mediaDevices
  159. .getUserMedia(constraints)
  160. .then(function(mediaStream) {
  161. var video = document.getElementById("videoCamera");
  162. video.srcObject = mediaStream;
  163. video.onloadedmetadata = function(e) {
  164. video.play();
  165. };
  166. })
  167. .catch(function(err) {
  168. console.log(err.name + ": " + err.message);
  169. }); // 总是在最后检查错误
  170. break;
  171. case 'closeCamera':
  172. var video = document.getElementById("videoCamera");
  173. if (video.srcObject) {
  174. video.srcObject.getTracks().forEach(function(track) {
  175. track.stop();
  176. });
  177. video.srcObject = null; // 清除视频源
  178. video.load(); // 重新加载视频元素
  179. }
  180. break;
  181. default:
  182. uni.webView[action]({
  183. url: '/pages/component/button/button'
  184. });
  185. break;
  186. }
  187. }
  188. })
  189. })
  190. // });
  191. document.querySelector("#postMessage").addEventListener('click', function() {
  192. if (isWeb) {
  193. alert('web端暂不支持此功能')
  194. return
  195. }
  196. postMessage('message')
  197. })
  198. /* function getThemePreference() {
  199. if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
  200. return 'dark';
  201. } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
  202. return 'light';
  203. }
  204. return 'unknown';
  205. } */
  206. </script>
  207. </body>
  208. </html>