javascript - 对象.defineProperty : setters for dom elements properties

标签 javascript dom ecmascript-6

我无法完全理解Object.defineProperty如何在dom元素上工作。 在普通的 javascript 对象上它就像一个魅力

var obj={name: 'john'};
Object.defineProperty(obj, 'name', {
  get: function(){
    console.log('get value')
  },
  set:function(newValue){
    console.log('set value '+newValue);
  },
  configurable: true
}); 

线

obj.name='Tom';

将打印到控制台“set value Tom”并将 obj.name 更改为 Tom。

当我在 dom 元素上尝试它时(例如,在复选框的选中属性上),它将在控制台中打印新值,但不会更改属性的值:

var box = document.getElementById('checkBox1');
Object.defineProperty(box, 'checked', {
  set: function (newValue) {
    console.log('set value '+newValue)
    },
  configurable: true
});

单击未选中的复选框将输出“设置值已选中”。 但屏幕上和对象框中都没有任何变化。 复选框的 setter 停止工作。就像我“禁用”它一样。

我哪里错了?

最佳答案

那是因为您从未在 setter 中设置该值。当您创建 setter 时,您将接管处理在对象(在您的情况下在元素上)设置值的工作。 (如果您尝试在 setter 中设置它,例如 box.checked = newValue,您将进入一个循环,该循环只会因堆栈溢出而结束。)

查看您的代码,您试图在 DOM 元素的 checked 属性发生更改时收到通知。您不能使用 defineProperty 来做到这一点。宿主对象(如 DOM 元素)根本不必支持 defineProperty,即使支持,当控件的底层状态在内部发生更改时,它们也不必调用 setter。

关于javascript - 对象.defineProperty : setters for dom elements properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545467/

相关文章:

javascript - 属性 <position> 的值无效

javascript - Dajaxice javascript 核心文件未被解析

javascript - 不同高度的下拉菜单 : setting height to auto breaks the rolldown

Javascript ES6 在最后一个 li 项中获取 anchor 标记

javascript - 为什么 ES6 Symbol 属性可以被 Object.defineProperty 枚举?

javascript - 使用关键字在文本区域中查找、隐藏文本并用图片替换文本 unhide onclick

javascript - Vanilla Javascript : Find a data attribute of the same name as an element given its id

javascript - 如何在 html 侧边栏中包含选中所有框

php - 加载剥离 javascript 并将其放入数组中供以后使用的替代方法是什么

javascript - 如何使用 Web Crypto API 创建哈希?