当前位置: 首页 > 知识库问答 >
问题:

javascript - 前端:DOM节点属性被暗中修改的原理是什么?

竺焕
2024-01-03

【前端】dom结点的属性被暗中修改,这是什么原理?

m是一个dom结点,对m.style.animation赋值“3s myKeyframe”后,m.style.animation的值却是图中那一长串,显然是被处理后的字符串,问题是,这是如何做到的?

我猜测是有一个类似于setter的函数,对我传入的“3s myKeyframe”进行了处理,然后再赋值给m.style.animation,可是这显然不可能实现,因为我是直接对属性进行赋值的,没有机会调用函数。

我想知道这是什么原理?如何实现的

共有3个答案

司马渝
2024-01-03

,因为我是直接对属性进行赋值的,没有机会调用函数。

不太明白你说的话,对属性直接赋值,就没有机会调用函数了?setter函数不就可以吗?

const person = {         name: '',         set name(_name) {             name=`peter ${_name}`        },         get name() {             return name;         }}person.name = 'HUAN'console.log(person.name)// peter HUAN
杜辉
2024-01-03

setter就是用来拦截直接对属性赋值的操作,可以试试以下代码
style对象对属性的setter是在底层实现的,所以控制台里看不到拦截器相关的内容

const style = new Proxy({}, {  set(o, p, v) {    o[p] = v + ' abcabc';  },});style.animation = '1s';console.log(obj.animation);
查宜民
2024-01-03

DOM节点属性的修改原理主要涉及到JavaScript的内部处理机制。当你尝试修改一个DOM节点的属性时,JavaScript实际上会将你的修改转换为浏览器可以理解的原始格式。这是因为DOM操作是由浏览器内部处理的,它需要以一种能够理解和操作的方式来表示这些改变。

在你给出的例子中,当你给m.style.animation赋值为"3s myKeyframe"时,JavaScript实际上会把这个字符串转换为一个更复杂的对象结构,这个结构包含了动画的所有信息,包括持续时间、动画名称等。然后,这个对象结构会被转换为一个字符串,以便浏览器可以理解并执行这个动画。

这种转换过程是由JavaScript引擎自动完成的,你无法直接控制它。如果你需要更细粒度的控制,你可能需要使用一些更低级别的API,例如CSSOM,来直接修改CSS样式。

至于你提到的setter函数,这实际上是一种常见的JavaScript实现机制,用于在属性被赋值时执行一些额外的操作。但是在这个例子中,setter函数并没有被调用,因为你是直接修改属性的值,而不是通过一个setter函数来修改的。

总的来说,DOM节点属性的修改原理主要是通过JavaScript引擎的内部处理机制来实现的,它会将你的修改转换为浏览器可以理解的格式。如果你需要更细粒度的控制,你可能需要使用一些更低级别的API。

 类似资料:
  • 最近看到一个视频直播,会实时公布魔法上网的免费节点,博主说是通过扫描节点获取的,请问一下具体是什么原理,是通过什么方式扫描的?

  • 修改superset前端文件,(superset-frontend文件夹下的文件)。npm run dev-server 和 superset run -p 8088前后端分别启动,访问前端链接,会发现对前端界面的修改是已经生效的。。。。。但是npm run -p 8088直接运行superset项目,访问对应的链接,发现前端的修改没有生效,(修改后,有重新打包前端项目,打包成功,在superse

  • CSS中什么是逻辑属性,什么是旧版属性? eg. 逻辑属性:marginBlockStart 旧版属性:marginTop

  • 本文向大家介绍DOM节点的根节点是不是body?相关面试题,主要包含被问及DOM节点的根节点是不是body?时的应答技巧和注意事项,需要的朋友参考一下 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简

  • 在使用一个库的时候碰到了一个很奇怪的问题,有个class实例化生成的对象,假设为A 对A的属性进行修改 打印A发现,其中的a属性并没有变,但是直接打印A.a是改变了的,请问这种情况大概会是什么原因呢,是有什么知识盲区吗,目前知道a属性是不可删除的属性,但是一般对象设置configurable=false也不会出现这种情况,如果不允许修改的话应该也会报错。。 (PS:A只是为了表述简化的例子,并不是

  • DOM节点操作 获取DOM节点 prototype,获取JS对象上的属性 Attribute,获取DOM标签上的属性 获取DOM节点 var div1 = document.getElementById('div1'); //元素 var divList = document.getElementByTagName('div'); //集合 console.log(divList.length);