首页
/ Happy DOM 项目实现 select 多选元素的 selectedOptions 属性支持

Happy DOM 项目实现 select 多选元素的 selectedOptions 属性支持

2025-06-18 08:48:10作者:韦蓉瑛

在 Web 开发测试中,DOM 模拟库扮演着重要角色。Happy DOM 作为一个轻量级的 DOM 实现,最近完成了对 HTMLSelectElement 的 selectedOptions 属性的支持,这对于测试包含多选 select 元素的 React 组件尤为重要。

selectedOptions 属性的重要性

selectedOptions 是 HTMLSelectElement 接口的一个属性,特别针对设置了 multiple 属性的 select 元素。它返回一个包含所有当前选中 option 元素的 HTMLCollection。这个属性在以下场景非常有用:

  1. 表单处理中获取用户选择的多个选项
  2. 测试框架中验证多选下拉框的状态
  3. 动态更新 UI 基于用户选择

Happy DOM 的实现细节

Happy DOM 在最新版本中完整实现了这个属性,其行为与浏览器原生实现保持一致。当 select 元素设置了 multiple 属性时,selectedOptions 会返回一个包含所有选中项的集合;对于单选 select,则只返回包含单个选中项的集合。

实现的核心在于正确维护 select 元素内部 option 元素的选中状态,并实时更新 selectedOptions 的返回值。这需要考虑以下情况:

  • 用户通过点击选择/取消选择选项
  • 通过 JavaScript 直接修改 option 的 selected 属性
  • 通过设置 select 的 value 属性改变选中项

对测试场景的影响

这一改进使得开发者可以更轻松地将测试从 jsdom 迁移到 Happy DOM,特别是在测试 React 组件时。现在可以像在真实浏览器中一样,通过 selectedOptions 属性来断言多选下拉框的状态。

例如,在测试中现在可以这样编写断言:

const select = document.querySelector('select[multiple]');
// 模拟用户选择
select.options[1].selected = true;
select.options[3].selected = true;

// 断言选中项
expect(select.selectedOptions.length).toBe(2);
expect(select.selectedOptions[0]).toBe(select.options[1]);

兼容性考虑

Happy DOM 的实现确保了与主流浏览器一致的行为,包括:

  • 返回的 HTMLCollection 是实时的,会随选中状态变化自动更新
  • 对于未设置 multiple 属性的 select 元素,selectedOptions 仍会返回集合(包含单个选中项)
  • 属性访问的性能经过优化,不会在每次访问时重新计算

总结

Happy DOM 对 selectedOptions 属性的支持完善了其对表单元素的模拟能力,使得开发者可以更准确地在测试中模拟和验证多选下拉框的行为。这一改进进一步缩小了测试环境与真实浏览器环境的差距,为前端测试提供了更可靠的保障。

登录后查看全文
热门项目推荐

热门内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
178
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
868
514
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
288
323
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
373
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
600
58
GitNextGitNext
基于可以运行在OpenHarmony的git,提供git客户端操作能力
ArkTS
10
3