考虑以下代码段:
var iframe = document.createElement('iframe');
iframe.src = 'foobar.html';
document.body.appendChild(iframe);
iframe.onload = function () {
var nodeIterator = iframe.contentDocument.createNodeIterator(
iframe.contentDocument.body,
NodeFilter.SHOW_ELEMENT,
{ acceptNode: function (node) {
if (node.hasAttribute('id')) {
return NodeFilter.FILTER_ACCEPT;
} else {
return NodeFilter.FILTER_SKIP;
}
}}, false),
currentNode, someArray = [];
while (currentNode = nodeIterator.nextNode()) {
// Calculate offsetLeft
someArray.push({
id: currentNode.id,
left: (function () {
var a = currentNode, b = 0;
while (a) {
b += a.offsetLeft;
a = a.offsetParent;
}
return b;
}())
});
// On element click, log offsetLeft after calculating again
currentNode.onclick = function (e) {
e.stopPropagation();
var a = this, b = 0;
while (a) {
b += a.offsetLeft;
a = a.offsetParent;
}
console.log(b);
};
}
};
我遇到的问题是:对于某些元素,offsetLeft
计算在第二次计算时是不同的。使用Google Chrome的检查器,我可以看到第二次计算发生时offsetLeft
始终是准确的。
在节点迭代期间完成的offsetLeft
计算对于某些元素是错误的,但是一致(在页面刷新期间值始终相同)。
我想知道是否有人有任何见解,为什么会这样。我一直在想iframe.onload
在其contentDocument
中的元素完全加载之前实际触发,导致一些元素最初进一步向左或向右。