Можно попытаться сгенерировать строку XPath для элемента - чем сложнее строка, тем точнее и переносимее будет идентификатор.
Например, простая строка запроса XPath только для элемента не будет очень уникальной и, вероятно, будет повторяться:
'//html/body/div/div/p/strong'
Факторинг по всем атрибутам может быть излишним
<code>'//html/body[@onclick="somereallylongjavascript" and class="nosidebar"]/div[@id="wrapper" and @class="posts"]/div[@class="entry" and @id="firstentry"]/p[@class="first"]/strong'
Но вы, вероятно, могли бы найти хорошую золотую середину, ограничившись определенными атрибутами, возможно, просто идентификаторами:
'//html/body/div[@id="wrapper"]/div[@id="firstentry"]/p/strong'
<Ч />
Вы можете извлекать XPath изначально во всех браузерах. Есть метод W3C:
var myElement=document.evaluate(
XPathstring,
document,
function(ns){return{'html':'http://www.w3.org/1999/xhtml','':null}[ns];},
9,
null
).singleNodeValue;
(функция ns предназначена исключительно для поддержки application / xhtml + xml)
Метод IE более упрощен, но менее гибок:
var myElement=document.selectSingleNode(XPathString);
<Ч />
Создание строки XPath - это, конечно, другая проблема - есть разные варианты, но, к сожалению, ни одна из них не является родной. XPather - это дополнение к moz, которое предоставляет интерфейс, который делает это - его источник написан на языке MPL и относительно прост, но, вероятно, больше, чем вам нужно. Существуют различные более короткие сценарии, которые предоставляют более простые решения.
Редактировать: Джастин Джонсон предоставил ссылку на SO-ответ, содержащий ОЧЕНЬ короткую XPath-генерирующую функцию. Это немного упрощенно, оно использует запись нечетного идентификатора (id(blah)
вместо [@id="blah"]
) и не toLowerCase()
его tagName
s, что может ухудшить мобильность, но в остальном выглядит идеально для ваших нужд.