Я хочу реализовать 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, но если он работает отлично!)