【发布时间】:2014-04-20 21:10:10
【问题描述】:
我开始开发一个小型 JavaScript 库,我希望仅通过我的 API 来设置 HTML 元素的样式(因为出于某种原因,我需要完全控制样式)。
所以我想让 style 属性不可访问(我的 API 将通过我的 style 别名访问它 - 这不是一个理想的解决方案,但对于像 jQuery 这样的其他库,它可以做到这一点)。
如果我写这个(灵感来自this topic):
var box = document.getElementById('someElementId');
Object.defineProperty(box, 'style', {
get: function() {
throw 'you cant access style property';
}
});
box.style.color = 'red';
它仅适用于box 元素。
是否可以对 Webkit、Firefox 和 IE9+ 中的所有(现有和未来)元素执行此操作?
我也试过这个:
Object.defineProperty(HTMLElement, 'style', {...
但没有运气。
任何帮助将不胜感激!
编辑
正如@Teemu 建议的那样,我可以写HTMLElement.prototype 而不是HTMLElement,它在FF 和IE 中运行良好,但在Chrome 中不行。它看起来像Chrome bug。可惜……
Edit2 - 我为什么需要它
我想要开发的库的主要目标是允许以下写作风格:
element.setWidth('parent.width / 2 - 10');
在这种情况下,element 的宽度应该对 parent 的宽度的每次变化做出反应。
但由于onresize 事件仅适用于window 对象(this article 似乎已过时),
我可以“聆听”修改 .style.width 属性的唯一方法是执行我自己的样式 API。
而且我想限制(或至少显示警告)直接style 修改,因为它会破坏元素的行为。
【问题讨论】:
-
只是好奇,如果样式无法访问,您的 API 将如何设置它?
-
Object.defineProperty(HTMLElement.prototype, 'style', {...})可以解决问题。那么你将如何在你的 API 中设置style,我不知道...... -
@Zub How is that? - 我明白了,它在 Chrome 中不起作用,但在 IE 和 FF 中可以正常工作。
-
为什么你认为这是一个错误? DOM 级别 2 将“样式”定义为只读 属性 — w3.org/TR/DOM-Level-2-Style/css.html#CSS-htmlelementcss 只是因为某些浏览器选择在
HTMLElement.prototype和其他浏览器上将样式实现为 getter/setter — 作为元素对象的直接属性(@ Chrome 中的 987654343@)并不意味着它是一个错误。这只是一个实现细节。 -
@Zub 是的,您需要单独密封每个元素。或者覆盖所有返回元素的方法(
createElement、getElementById等)以返回已经密封的元素。但这是一个更大的蠕虫罐,所以我不建议你去那里。
标签: javascript dom prototype ecmascript-5