【发布时间】:2015-02-13 09:42:48
【问题描述】:
我一直在做一个小项目,我正在使用 jQuery .clone() 方法。
这样做的陷阱是在具有唯一标识符的 HTML 上使用它。
所以我继续实现getComputedStyle 来查找原始独特元素的样式属性,以便将其复制到克隆并在之后给它一个新的 id(是的,它会产生性能问题,但它是实验性的)。
根据 jQuery 规范,在克隆之后但在追加之前执行此操作将使操作发生在 DOM 之外(因此不会发生 id 'violation')。但是当我在克隆对象后尝试查找元素的样式属性时,我注意到跨浏览器的一些奇怪行为。在此之前,所有浏览器都返回相同的值,但在被克隆之后:
Firefox - 无忧无虑,有趣的是,克隆的计算样式是实际的 CSS 值而不是计算数据(以像素为单位)。
IE - 似乎有效,但值不一定正确。
Chrome - 不计算。这是一个例子:
http://codepen.io/anon/pen/zxqmNK?editors=011
var elements = [];
var objects = [];
$('body').find('[id]').each(function() {
elements.push(this);
});
$('body').clone().find('[id]').each(function() {
objects.push(this);
});
$.each(elements, function(key, element) {
var current = window.getComputedStyle(element, null).getPropertyValue('width');
$('#log').append('<p>' + element.id + ': ' + current + '</p>');
});
$('#log').append('</br>');
$.each(objects, function(count, object) {
var current = window.getComputedStyle(object, null).getPropertyValue('width');
$('#log').append('<p>' + object.id + ': ' + current + '</p>');
});
有人知道这是否是一个错误或以前曾见过类似的行为吗? 在网络方面没有太多可做的事情(甚至 Stackoverflow 也不行)。 提前感谢您提供任何见解。
编辑 - 进行了更多测试,看起来 IE 的行为与 Chrome 相同。
只是没有返回任何东西,而是将所有内容设置为“自动”。
如果使用.css() 访问克隆对象的样式,则所有值都返回0px(包括背景等属性)。
似乎只有 Mozilla 将克隆的对象视为已应用任何样式。
【问题讨论】:
-
不是一个直接的答案,但您为什么要与
getComputedStyle合作这么多?使用类为元素设置样式而不是按照自己的方式查找 CSS 样式不是更容易、更容易预测吗? -
谢谢,anpsmn。我不敢相信我没有找到那个。我确实决定按照 Felix Kling 那里建议的方式(复制原始对象的样式)。虽然 Mozilla 处理它的方式如果它是跨浏览器可用的话会非常棒。 Matijs,你当然是对的,但是从中提取的代码是一个小插件(放大镜),我不想强迫人们改变他们的文件结构。我当然会推荐使用课程。为回复干杯。
标签: jquery css clone dom-manipulation getcomputedstyle