Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: Наши скрипты > jpath^2 - быстрее, выше, сильнее! |
Автор: cruelangel 17.11.2007, 20:55 | ||
теперь совершенно не совместимо ни с xpath, ни с css, ни даже с jpath^1 ^_^ новая версия ещё больше ориентирована на яваскрипт. от осей отказался, но остались так называемые "макросы". основной оператор - точка. если после него указано имя, то он вернёт значение свойства с этим именем. если имя не указано, то он вернёт значения всех свойств. если указана звёздочка - вернёт все значения, которые "труъ" ;-). alert( jpath.call( [ 1, 2, 3 ], ' .1 ' ) ); // вернёт [ 2 ] alert( jpath.call( [ false, 1, 2, 3 ], ' .* ' ) ); // вернёт [ 1, 2, 3 ] alert( jpath.call( [ [ 1, 1.5 ] , [ 2, 2.5 ], 3 ], ' . .1 ' ) ); // вернёт [ 1.5, 2.5 ] получить следующий узел можно так: alert( jpath.call( node, ' .nextSibling ' )[0] ); // вернёт node.nextSibling alert( jpath.call( node, ' + ' )[0] ); // то же самое другие макросы: alert( jpath.call( node, ' - ' )[0] ); // вернёт node.previousSibling alert( jpath.call( node, ' ^ ' )[0] ); // вернёт node.parentNode если нужны не любые узлы, а только элементы, то нужно указать звёздочку в качестве имени: alert( jpath.call( node, ' +* ' )[0] ); // вернёт следующий элемент если нужно отфильтровать по имени: alert( jpath.call( node, ' +tr ' )[0] ); // вернёт следующую строку таблицы если нужно отфильтровать ещё и по классу: alert( jpath.call( node, ' ^*:megacontainer ' )[0] ); // вернёт ближайшего предка с классом "megacontainer" alert( jpath.call( node, ' +p:alert ' )[0] ); // вернёт следующий параграф с классом "alert" слэши по прежнему возвращают коллекции детей или потомков: alert( jpath.call( node, ' / ' ) ); // вернёт всех детей alert( jpath.call( node, ' /* ' ) ); // вернёт все дочерние элементы alert( jpath.call( node, ' /li:odd ' ) ); // вернёт все элементы списка с классом 'odd' alert( jpath.call( node, ' // ' ) ); // вернёт всех потомков (медленная и как правило бессмысленная операция) alert( jpath.call( node, ' //* ' ) ); // вернёт все элементы-потомки alert( jpath.call( document, ' //a:j-hover ' ) ); // вернёт все ссылки с классом 'j-hover' доступ к отдельному элементу коллекции осуществляется с помощью точки: alert( jpath.call( node, ' / .0 ' ) [0] ); // вернёт node.firstChild и наоборот, используя квадратные скобки можно организовывать коллекции: alert( jpath.call( node, ' [^] ' ) ); // вернёт всех предков alert( jpath.call( node, ' [+tr] ' ) ); // вернёт все следующие строки alert( jpath.call( node, ' [ +tr +tr ] ' ) ); // вернёт каждую вторую строку после текущей alert( jpath.call( node, ' [/*] ' ) ); // вернёт всех потомков alert( jpath.call( node, ' //* ' ) ); // то же самое, но гораздо быстрее квадратные скобочки можно вкладывать друг в друга. возвращаемое значение, как и прежде - массив найденных значений (null и undefined не возвращаются) если функцию jpath сделать методом объекта, то при её вызове он будет будет являться началом пути. соответственно по дефолту - jpath( 'путь' ) - стартоым объектом является объект window. alert( jpath.call( node, '//*' ) ); // вернёт все элементы - потомки node node.jpath= jpath; alert( node.jpath( '//*' ) ); // вернёт все элементы - потомки node есть мысли в какую сторону стоит развивать всё это дальше? ![]() |
Автор: JSman 7.6.2008, 12:58 |
XPath не убьешь, по простой причине: у него высокое быстродействие. Поэтому как минимум советую написать, там где возможно, конвертер твоего запроса в запрос XPath. |