offsetLeft值意外更改

时间:2012-10-18 17:31:22

标签: javascript dom onload offset xpathnodeiterator

考虑以下代码段:

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中的元素完全加载之前实际触发,导致一些元素最初进一步向左或向右。

0 个答案:

没有答案