Подтвердить что ты не робот

Javascript: использование xpath в jQuery

У меня, например, следующий запрос XPath:

//div[span="something"]/parent::div/child::div[@class=\"someClass\"]

Я хочу использовать этот запрос XPath в JavaScript:

return $("a:contains('Fruits')").mouseover();

Я пробовал это:

return $("div[span=\"something\"]/parent::div/child::div[@class=\"someClass\"]").mouseover();

Но это не сработало. Есть ли еще одна семантика для запросов XPath, чтобы использовать их в JavaScript?

4b9b3361

Ответ 1

Вы можете переписать свои запросы xpath в виде селекторов CSS:

$('div:has(> div > span:contains(something)) > div.someClass');

Вы можете добиться того же эффекта, что и parent:: с помощью селектора :has pseduo, чтобы выбрать элемент на основе его дочерних элементов: div.foo:has(> div.bar) выберет все div элементы с классом foo, у которых есть дочерний div с классом bar. Это эквивалентно div[@class="bar"]/parent::div[@class="foo"].

См:

Возможно, вы могли бы подойти к этому несколькими другими способами, используя различные комбинации методов jQuery DOM traversal. Например, это будет очень прямой перевод вашего запроса xpath:

$('div:has(> span:contains(something))')  // //div[span="something"]
    .parent('div')                        // /parent::div
    .children('div.someClass');           // /child::div[@class="someClass"]

Стоит отметить, что div.someClass в CSS не является точным эквивалентом div[@class="someClass"] в xpath. CSS будет соответствовать <div class='foo someClass bar'>, но xpath не будет. Подробнее см. статью Брайана Суда о анализе микроформатов с помощью XSLT.

Ответ 2

Вы можете добавить результаты существующей оценки XPath к выбору jQuery, я объединил это расширение jquery, которое, кажется, делает все для вас.

Пример использования:

$(document).xpathEvaluate('//body/div').remove()

Вот надстройка.

$.fn.xpathEvaluate = function (xpathExpression) {
   // NOTE: vars not declared local for debug purposes
   $this = this.first(); // Don't make me deal with multiples before coffee

   // Evaluate xpath and retrieve matching nodes
   xpathResult = this[0].evaluate(xpathExpression, this[0], null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

   result = [];
   while (elem = xpathResult.iterateNext()) {
      result.push(elem);
   }

   $result = jQuery([]).pushStack( result );
   return $result;
}

Ответ 3

Как соавтор Wicked Good XPath, я, безусловно, рекомендую его для поддержки кросс-браузера XPath (на HTML-документах вы можете попробовать использовать это с документами XML, но поддержка неполна).

Мы приветствуем какой-либо тест производительности/производительности в нашей библиотеке. Во время разработки библиотека была протестирована в IE 7 до 10 плюс браузер Android 2.2, который не имеет встроенной поддержки XPath.

Ответ 4

Насколько я знаю, реализации кросс-браузера не существует. Существует плагин xpath для jQuery, который говорит, что все еще находится в разработке.

Кроме того, существует стандартная версия JavaScript, основанная на Google, для спецификации DOM уровня 3 XPath, называемой wicked-good-xpath, которая хороша.

Ответ 5

Я не уверен в предложении parent::div, но без него он должен выглядеть так:

$('div[span="something"] div.someClass');

Ответ 6

если вы хотите выбрать элемент внутри iframe, из родительского окна, вы должны изменить второй параметр функции evaulate() на элемент документа iframe, например:

var iFrameDocument = $('iframe#myPage').get(0).contentWindow.document;
xpathResult = this[0].evaluate(xpathExpression, iFrameDocument, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

Ответ 8

jQuery имеет ограниченную поддержку XPath. Вы можете видеть, что он здесь поддерживает: http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors

Как уже упоминалось @Ameoo, вы можете использовать метод оценки, который доступен в большинстве современных браузеров - кроме, как и ожидалось, IE: элемент jquery select по xpath