当前位置: 首页 > news >正文

微信小程序可以进行dom操作吗?

小程序不能使用各种浏览器暴露出来的 DOM API,进行 DOM 选中和操作

原因:在小程序中,渲染层和逻辑层是分开的,分别运行在不同的线程中,逻辑层运行在 JSCore 中,并没有一个完整浏览器对象,因而缺少相关的DOM API和BOM API。

为什么要这样设计?

因为JavaScript是可操纵DOM的,如果JavaScript线程和UI线程同时运行,即在修改这些元素属性同时渲染界面,那么渲染线程前后获得的元素数据就可能不一致,导致传统web开发渲染线程和脚本线程是互斥的。于是当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时立即被执行。 因此长时间的脚本运行可能会导致页面失去响应。

小程序DOM操作API —— SelectQuery

浏览器中:

const demo= document.querySelector('#demo')
console.log(demo.boundingClientRect().top)

小程序中:

const query = wx.createSelectorQuery()
// 组件中:const query = wx.createSelectorQuery().in('组件id')
query.select('#demo').boundingClientRect()
query.exec(function (res) {console.log(res[0].top)
})

可以发现有三点明显的区别:

  • 通过createSelectorQuery创建了一个query对象而不是document.querySelector
  • 在query对象上执行查询操作并非马上执行,而是进入等待队列,直至query对象上exec被调用才触发查询行为
  • 查询结果是异步返回的,在callback中按查询顺序依次从参数中读取

第一点区别产生的原因是首先小程序双线程模型决定了业务代码中不能拿到document对象, 也就无法在上面调用相关查询方法。那为什么要通过调用createSelectorQuery()返回查询对象而不是把查询对象定义为全局的呢?这是因为小程序每个页面的视图层都对应一个webview,而所有的页面都共用一个逻辑线程,这种一对多的关系在通讯时需要有id来进行区分,所以每次createSelectorQuery时返回的query对象是绑定了当前视图层webview对应id的。

第二、三点的查询非立即执行,而是在exec被调用时真正触发比较好理解:业务代码在逻辑线程,真实dom在另一个webview线程,线程间的通讯需要借助宿主能力完成,query对象的exec方法被触发时小程序把callbak存储起来,然后调用native宿主暴露的方法去通讯,拿到webview线程查询回来的结果之后进行反序列化处理,传递给先前保存的callbak并开始执行,所以这里是异步的。

http://www.lryc.cn/news/42238.html

相关文章:

  • 昇腾AI深耕沽上:港口辐射力之后,天津再添基础创新辐射力
  • 基于YOLOv5的疲劳驾驶检测系统(Python+清新界面+数据集)
  • 【Linux】-- 进程优先级和环境变量
  • iOS 紧急通知
  • 即时零售:不可逆的进化
  • 零售数据总结经验:找好关键分析指标和维度
  • 从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构
  • C++中那些你不知道的未定义行为
  • java基础面试题(四)
  • @PropertySource使用场景
  • 【C语言进阶:刨根究底字符串函数】strtok strerror函数
  • 西安石油大学C语言期末重点知识点总结
  • 读《Multi-level Wavelet-CNN for Image Restoration》
  • 【Linux】安装DHCP服务器
  • 功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂
  • 数据结构之哈希表
  • linux信号理解
  • HC小区管理系统window系统安装教程
  • 自动化测试工具软测界的不二之选,还不快速来了解
  • centos系统/dev/mapper/centos-root目录被占满的解决方式
  • 【C++】STL容器、算法的简单认识
  • 把python开发的web服务,打包成docker镜像的方法
  • 【Linux】多线程
  • Qt 设置窗口背景图片的几种方法实例
  • springcloud微服务架构搭建过程
  • LeetCode:215. 数组中的第K个最大元素
  • vue面试题(day06)
  • 22 k8s常用命令
  • 基于ESP32做低功耗墨水屏时钟
  • 常见路由器开源系统(固件)简介