Если Вы ожидаете arbitary количество параметров, Вы могли бы сделать что-то вроде этого.
public ActionResult Open(){
string[] keys = Request.QueryString.AllKeys;
Dictionary queryParams = new Dictionary();
foreach (string key in keys)
{
queryParams[key] = Request.QueryString[key];
}
string sort = queryParams["sort"];
...
// Compare Position - MIT Licensed, John Resig
function comparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains ?
(a != b && a.contains(b) && 16) +
(a != b && b.contains(a) && 8) +
(a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex < b.sourceIndex && 4) +
(a.sourceIndex > b.sourceIndex && 2) :
1) +
0 :
0;
}
Скорее сложно, я бы лично перебирал каждое дерево, пока не нашел общий анестер, а затем проверял, какой родительский узел (или фактический узел, если этот низкий) идет первым, начиная с firstChild и работая через братьев и сестер, что-то вроде:
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.
}
Я только что отредактировал этот код в попытке исправить две возможные проблемы, однако я не тестировал это новое редактирование, поэтому, если что-то сломается, мне придется попробовать еще раз. (Отредактировано снова, чтобы исправить "не"
Вы можете использовать функцию DOM compareDocumentPosition
, которая будет возвращать разные числа на основе отношений двух узлов:
DOCUMENT_POSITION_DISCONNECTED = 0x01; DOCUMENT_POSITION_PRECEDING = 0x02; DOCUMENT_POSITION_FOLLOWING = 0x04; DOCUMENT_POSITION_CONTAINS = 0x08; DOCUMENT_POSITION_CONTAINED_BY = 0x10;
Потенциально результатом может быть сумма более чем одного из этих кодов, поскольку ответом является битовая маска, но я не могу представить себе ситуацию, когда два из этих условий выполнялись бы одновременно. Также обратите внимание, что результат «отключен» будет возвращен, например, с узлами, которые были созданы, но еще не добавлены в дерево документа