Piuttosto difficile, io personalmente sarebbe itterate up ogni albero finché non ho trovato un ansester comune, allora verificare quale nodo padre (o il nodo reale, se così in basso) viene prima di partire con firstChild e di lavoro attraverso i fratelli, qualcosa di simile:
function OrderCheck(node1, node2){
var ar1 = [null, node1];
var ar2 = [null, node2];
for(var i = 1; ar1[i] != null; i++)
ar1[i+1]=ar1[i].parentNode;
for(var i = 1; ar2[i] != null; i++)
ar2[i+1]=ar2[i].parentNode;
ar1.reverse(); ar2.reverse(); // easier to work with.
i = 0;
while(ar1[i] === ar2[i]){
if(ar1[i] === null)
return 0;
else
i++
}
if(ar1[i] === null)
return 2;
if(ar2[i] === null)
return 1;
if(i != 0){
var n = ar1[i-1].firstChild;
do{
if(n === ar1[i])
return 1;
if(n === ar2[i])
return 2;
}while(n = n.nextSibling);
}
return -1;// Shouldn't happen.
}
var order = OrderCheck(document.body, document.body.previousSibling);
if(order == 1){
// element 1 first
}else if(order == 2){
// element 2 first
}else{
// there was an error.
}
mi basta modificare questo codice, nel tentativo di risolvere due possibili problemi, non ho ancora testato questa nuova modifica però, quindi se qualcosa si rompe dovrò riprovare . (Modificato di nuovo per correggere un errore di stile "non funziona nemmeno").
Si noti che il metodo Resig funzionerà solo sui nodi degli elementi, non sui nodi di testo. – Michael
Sì. I nodi di testo non hanno .sourceIndex e non hanno .contains(). – Michael
&& non fa nulla in tutti questi casi, perché l'RHS è sempre vero. – gsnedders