惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Jina AI
Jina AI
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
I
InfoQ
L
LangChain Blog
The Cloudflare Blog
IT之家
IT之家
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
博客园 - 聂微东
美团技术团队
博客园_首页

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
全是好东西!HTML command属性和JS toggle事件 « 张鑫旭-鑫空...
张鑫旭,zhangxinxu · 2026-06-22 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12237
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

一、先说command属性

HTML command属性只能设置在按钮元素上,可以触发元素内置的方法,而这个方法是可以自定义设置的。

比方说下面这个点击按钮显示弹框的实现:

<button commandfor="my-dialog" command="show-modal">
  点击显示弹框
</button>

<dialog id="my-dialog" closedby="any">
  我显示啦!
</dialog>

<dialog>弹框元素内置了showModal方法,此时,点击按钮,弹框就会显示。

实时渲染效果如下:

我显示啦!

commandfor还适合触发popover浮层的显示,虽然popover属性有原生的popovertaregt属性。

实现原理

commandfor属性执行目标元素,通过ID属性值关联。

command属性会调用目标元素上的DOM方法,如果DOM方法是驼峰格式,则使用短横线表示。

是否支持自定义方法

测试代码如下:

<button commandfor="hanyun" command="radius">
  点击图片圆角
</button>
  
<img id="hanyun" src="hanyun.jpg" alt="张含韵">
  
<script>
HTMLImageElement.prototype.radius = function () {
  this.style.borderRadius = '50%';
} 
</script>

结果点击按钮是无效的,实时渲染如下,点击是没有任何反应的。

张含韵

正确使用自定义方法的路径

command执行其实是支持自定义行为的,只是使用方法并不是上面所说的这样,而是使用 command 事件。

代码示意:

<button commandfor="image" command="--radius">
  点击图片圆角
</button>
  
<img id="image" src="hanyun.jpg">
  
<script>
image.addEventListener("command", (event) => {
  if (event.command === "--radius") {
    event.target.style.borderRadius = '50%';
  }
});
</script>

此时,点击按钮,就可以看到图片元素圆角化了。

实时渲染效果如下(RSS订阅器中无效果,可访问原文体验):

兼容性

出乎我的意料,commandfor属性主流浏览器居然都已经支持了。

commond属性兼容性

二、再来说说toggle事件

ToggleEvent事件类型也是一个新特性,出现的时机比上面的command属性要早,如下截图所示:

Toggle事件的兼容性

此事件对象包括 beforetoggletoggle 两种事件类型。

其中:

  • beforetoggle事件会在Popover弹出框或<dialog>元素显示或隐藏之前触发;
  • toggle 事件则会在Popover弹出框、<dialog>元素或者<details>元素显示或隐藏后触发,多了个<details>元素。

newState和oldState值

我们可以通过newStateoldState事件对象的属性判断当前元素的展开还是收起状态。

比方说如下所示的实时渲染测试案例(RSS阅读器中无效果,可以访问原文体验):

HTML并不简单

技术发展还是很快的,在《HTML并不简单》这本书里介绍 details 元素的时候,还没有 toggle 事件呢。

测试代码如下:

<details id="details" open>
    <summary>HTML并不简单</summary>
    <content>技术发展还是很快的,在《HTML并不简单》这本书里介绍 details 元素的时候,还没有 toggle 事件呢。</content>
</details>
<script>
  details.addEventListener("toggle", function (event) {
    if (event.newState === "open") {
      this.style.background = 'aliceblue';
    } else {
      this.style.background = '';
    }
  });
</script>

最近刚支持的event.source

event.source可以返回触发ToggleEvent事件执行的目标元素。

例如,一个<dialog>元素关闭既可以使用内置的关闭行为(例如ESC,点击黑色蒙层,Form关闭、command关闭),还可以手动调用close()方法,此时我们可以借助event.source判断状态变化的来源是什么。

例如:

<p>关闭来源是:<output id="output"></output></p>
<p><button commandfor="dialog" command="show-modal">显示弹框</button></p>
<dialog id="dialog" closedby="any">
  <form method="dialog">
    <button>form关闭按钮</button>
  </form>
  <p>
    <button commandfor="dialog" command="close">command关闭按钮</button>
  </p>
</dialog>
<script>
  dialog.addEventListener("toggle", function (event) {
    if (event.newState === "closed") {
      output.textContent = event.source?.textContent || '来源未知';
    }
  });
</script>

实时运行效果如下(Chrome 140+,Safari 16.5+):

根据我的测试,只有通过command指令触发的弹框关闭按钮,才会被event.source识别出来,其他任何内置的弹框关闭行为,event.source都是null,包括JS执行的dialog.close()命令也是如此。

看来,这种场景下,还需要通过其他方式区分。

  • 常规弹框关闭,如果无法识别event.source,则可以认为是close()行为触发;
  • 如果是method="dialog"表单触发的弹框关闭,是会触发弹框的submit事件的;
    dialog.addEventListener("submit", function (event) {
      console.log('submit');
    });
  • 如果是ESC快捷键关闭,可以通过cancel事件识别。

最后,附上event.source的兼容性。

toggle事件source属性兼容性

三、结束时候说的话

妈呀,我买的恒生科技跌的爹妈都不认识了。

公司股票也新低了,没话说。

我还买了理想,两次翻倍都没卖,结果现在腰斩。

还不如去抄AI股。

算了,千斤难买早知道,人是无法赚到认知以外的钱的。

我家婉儿表示赞同!

南宫婉

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12237

(本篇完)