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

Если Вы ожидаете 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"];
   ...


7
задан Michael 17 August 2009 в 22:55
поделиться

3 ответа

Resig спешит на помощь :

// 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;
}
5
ответ дан 7 December 2019 в 01:24
поделиться

Скорее сложно, я бы лично перебирал каждое дерево, пока не нашел общий анестер, а затем проверял, какой родительский узел (или фактический узел, если этот низкий) идет первым, начиная с 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.
  }

Я только что отредактировал этот код в попытке исправить две возможные проблемы, однако я не тестировал это новое редактирование, поэтому, если что-то сломается, мне придется попробовать еще раз. (Отредактировано снова, чтобы исправить "не"

1
ответ дан 7 December 2019 в 01:24
поделиться

Вы можете использовать функцию DOM compareDocumentPosition , которая будет возвращать разные числа на основе отношений двух узлов:

 DOCUMENT_POSITION_DISCONNECTED = 0x01;
DOCUMENT_POSITION_PRECEDING = 0x02;
DOCUMENT_POSITION_FOLLOWING = 0x04;
DOCUMENT_POSITION_CONTAINS = 0x08;
DOCUMENT_POSITION_CONTAINED_BY = 0x10;

Потенциально результатом может быть сумма более чем одного из этих кодов, поскольку ответом является битовая маска, но я не могу представить себе ситуацию, когда два из этих условий выполнялись бы одновременно. Также обратите внимание, что результат «отключен» будет возвращен, например, с узлами, которые были созданы, но еще не добавлены в дерево документа

4
ответ дан 7 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: