2012-06-01 7 views
0

Я хотел бы выбрать XPath тега и содержимое тега, что-то похожее на то, что делает Evernote. Однако я не могу найти примеров. Как это можно достичь?Как вернуть XPath тега с помощью XUL?

+1

Вы знаете, что нет «XPath тега»? Вы можете выбрать один и тот же тег разными выражениями XPath, которые вы хотите? Я предполагаю, что вы хотите пойти по позиции элемента в документе, как это делает [Удалить это постоянно] (https://addons.mozilla.org/addon/remove-it-permanently/)? –

ответ

0

После некоторых исследований мы нашли:

function createXPathFromElement(elm) { 
     var allNodes = document.getElementsByTagName('*'); 
     for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) 
     { 
      if (elm.hasAttribute('id')) { 
       var uniqueIdCount = 0; 
       for (var n=0;n < allNodes.length;n++) { 
        if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++; 
        if (uniqueIdCount > 1) break; 
       }; 
       if (uniqueIdCount == 1) { 
        segs.unshift('id("' + elm.getAttribute('id') + '")'); 
        return segs.join('/'); 
       } else { 
        segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]'); 
       } 
      } else if (elm.hasAttribute('class')) { 
       segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]'); 
      } else { 
       for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
        if (sib.localName == elm.localName) i++; 
       }; 
       segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
      }; 
     }; 
     return segs.length ? '/' + segs.join('/') : null; 
    } 

    function lookupElementByXPath(path) { 
     var evaluator = new XPathEvaluator(); 
     var result = evaluator.evaluate(path, document.documentElement, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
     return result.singleNodeValue; 
    } 
Смежные вопросы