кроссбраузерное сравнение положения документа

DOM4 compareDocumentPosition

Я хочу реализовать compareDocumentPosition.Resig сделал прекрасное начало в этом . Я взял его код и обработал его

function compareDocumentPosition(other) {
    var ret = 0;
    if (this.contains) {
        if (this !== other && this.contains(other)) {
            ret += 16;
        }
        if (this !== other && other.contains(this)) {
            ret += 8;
        }
        if (this.sourceIndex >= 0 && other.sourceIndex >= 0) {
            if (this.sourceIndex < other.sourceIndex) {
                ret += 4;
            }
            if (this.sourceIndex > other.sourceIndex) {
                ret += 2;
            }
        } else {
            ret += 1;
        }
    } 
    return ret;
}

Это работает для Element , но не для Text или DocumentFragment . Это связано с тем, что IE8 не предоставляет .sourceIndex на этих узлах. (Это также не дает .contains , но я уже исправил эту проблему)

Как мне эффективно записать + = 4 и + = 2 , который соответствует DOCUMENT_POSITION_FOLLOWING и DOCUMENT_POSITION_PRECEDING .

Для дополнительной ссылки эти два определены древовидным порядком, который DOM4 определяет как

Объект A предшествует объекту B, если A и B находятся в одном дереве, а A стоит перед B в древовидном порядке.

Объект A следует за объектом B, если A и B находятся в одном дереве, а A идет после B в древовидном порядке.

Древовидный порядок - предварительный, обход в глубину.

Это реализовано в большинстве современных браузеров (включая IE9). Так что вам нужно только то, что работает в IE8 (меня не волнует IE6 / 7, но если он работает отлично!)

6
задан Raynos 30 November 2011 в 23:04
поделиться