文档管理中心
我的

获取网页内容高度

通过调用getPageHeight可获取当前网页内容的实际高度,开发者可以根据具体需求选择合适的方法。

使用场景

在网页加载过程中,获取的高度可能不够精确,特别是在网页还未渲染完成时。因为动态内容加载后会更新这个值。网页内容可能需要长时间加载。目前网站为优化首次加载速度,会使用动态网页加载技术,用户在看到网页首帧时,页面资源还在动态加载页面,特别是包含图片、动态内容的页面。

非静态网页不建议在onPageEnd、onPageVisible、onFirstContentfulPaint、onFirstMeaningfulPaint事件等Web组件生命周期回调和Web性能指标回调中获取网页内容高度。需要根据当前网页的特点,通过JSBridge或延迟等方案,在前端特定的回调通知里获取当前网页内容的实际高度。

普通静态展示页面

普通静态网页,可以在onPageEnd等Web组件生命周期回调和Web性能指标回调中通过getPageHeight获取网页内容的高度。

应用侧代码

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct Index {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Row() {
  9. Column() {
  10. Web({ src: $rawfile('index.html'), controller: this.controller })
  11. .onPageEnd(() => {
  12. console.info("page height: onPageEnd: " + this.controller.getPageHeight());
  13. })
  14. }
  15. .width('100%')
  16. .height('100%')
  17. }
  18. .height('100%')
  19. }
  20. }

复杂动态网页使用JSBridge传递特定回调

动态网页可以通过JSBridge传递特定回调,通知到应用侧调用。

应用侧代码

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. class TestClass {
  4. testController: webview.WebviewController;
  5. constructor(controller: webview.WebviewController) {
  6. this.testController = controller;
  7. }
  8. notifyToGet(): void {
  9. console.info("page height: " + this.testController.getPageHeight());
  10. }
  11. }
  12. @Entry
  13. @Component
  14. struct Index {
  15. controller: webview.WebviewController = new webview.WebviewController();
  16. @State jsbObj: TestClass = new TestClass(this.controller);
  17. build() {
  18. Row() {
  19. Column() {
  20. Web({ src: $rawfile('index.html'), controller: this.controller })
  21. .javaScriptAccess(true)
  22. .javaScriptProxy({
  23. object: this.jsbObj,
  24. name: "jsbObj",
  25. methodList: ["notifyToGet"],
  26. controller: this.controller
  27. })
  28. }
  29. .width('100%')
  30. .height('100%')
  31. }
  32. .height('100%')
  33. }
  34. }

加载普通网页

普通网页可以通过load事件,在网页的所有资源都完全加载完成后触发。

前端代码

收起
自动换行
深色代码主题
复制
  1. <!--index.html-->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <script>
  10. window.addEventListener("load", function() {
  11. if (typeof jsbObj !== 'undefined') {
  12. jsbObj.notifyToGet();
  13. } else {
  14. console.info("jsbObj is undefined");
  15. }
  16. })
  17. </script>
  18. </body>
  19. </html>

加载大图片的网页

当网页含有大图片时,可使用图片加载完成回调触发。

在前端代码中,请将示例图片路径替换为实际使用的图片资源。

收起
自动换行
深色代码主题
复制
  1. <!--index.html-->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <img src="example.jpg" id="largeImage" alt="Large Image">
  10. <script>
  11. var img = document.getElementById('largeImage');
  12. img.addEventListener('load', function() {
  13. if (typeof jsbObj !== 'undefined') {
  14. jsbObj.notifyToGet();
  15. } else {
  16. console.info("jsbObj is error");
  17. }
  18. });
  19. </script>
  20. </body>
  21. </html>

加载大量图片的网页

针对图片密集网页,在所有图片加载完成后触发。

在前端代码中,请替换图片为真实图片。

收起
自动换行
深色代码主题
复制
  1. <!--index.html-->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <img src="example1.jpg" >
  10. <img src="example2.jpg" >
  11. <script>
  12. function waitForImages() {
  13. const images = Array.from(document.images);
  14. const promises = images.map(img => {
  15. if (img.complete) return Promise.resolve();
  16. return new Promise(resolve => {
  17. img.onload = img.onerror = resolve;
  18. });
  19. });
  20. return Promise.all(promises).then(() => {
  21. if (typeof jsbObj !== 'undefined') {
  22. jsbObj.notifyToGet();
  23. } else {
  24. console.info("jsbObj is error");
  25. }
  26. })
  27. }
  28. document.addEventListener("DOMContentLoaded", waitForImages);
  29. </script>
  30. </body>
  31. </html>

无法使用JSBridge场景

在无法使用JSBridge的场景下,可以通过添加setTimeout等函数来延迟获取当前页面的高度。具体的延迟时间可以根据网页的复杂度来确定。

应用侧代码

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. @Entry
  4. @Component
  5. struct Index {
  6. controller: webview.WebviewController = new webview.WebviewController();
  7. build() {
  8. Row() {
  9. Column() {
  10. Web({ src: $rawfile('index.html'), controller: this.controller })
  11. .onPageEnd(() => {
  12. setTimeout(()=>{
  13. console.info("page height: onPageEnd: setTimeout: " + this.controller.getPageHeight());
  14. },2000)
  15. })
  16. }
  17. .width('100%')
  18. .height('100%')
  19. }
  20. .height('100%')
  21. }
  22. }