Comments 11
нет, твой велосипед не удобен. потомучто на нем нет сидения.
например вот такая конструкция:
[node]
[child]
[/child]
[child]
[/child]
[/node]
что вернет next() из node?
[node]
[child]
[/child]
[child]
[/child]
[/node]
что вернет next() из node?
вернет [node] если это .next( [node] ) и нет соседних элементов, если после ноде есть другой элемент, то вернет этот другой элемент, если после него элемента нет, но есть элементы до, то вернет самый первый из предшествующих.
Видимо, вы пропустили ключевой момент: «множество считается цикличным, то есть последний элемент в множестве считается предыдущим по отношению к первому».
Видимо, вы пропустили ключевой момент: «множество считается цикличным, то есть последний элемент в множестве считается предыдущим по отношению к первому».
Само по себе оно конечно интересно! Но в чем практическая польза? Сходу не смог придумать пример, на мой взгляд доступ к элементу по ид лучше, а такая система усложняет код — при просмотре пришлось бы еще помнить/смотреть структуру DOM.
например, форма для аплоада файлов. Кнопка «добавить ещё один файл», по нажатию на которую добавляется ещё один инпут и ссылка «удалить», чтобы можно было удалить добавленный элемент. В таком случае для удобно использовать такую относительную навигацию.
Кстати, я в своё время написал очень похожий велосипед, вот пример использования:
var no_logo_div = get_obj_by_path(upload_div, «parent 1 prev child 0 0»);
parent 1 означает parentNode.parentNode
child 0 0 — первый потомок у первого потомка
Кстати, я в своё время написал очень похожий велосипед, вот пример использования:
var no_logo_div = get_obj_by_path(upload_div, «parent 1 prev child 0 0»);
parent 1 означает parentNode.parentNode
child 0 0 — первый потомок у первого потомка
Это альтернатива функциям prev(), next(), first(), last(), parent() и практически применяется она там же. Так же это лишь малая часть библиотеки, так как приводить ее всю здесь я не видел смысла (привел именно непохожую на другие ее часть, которая может быть кому-то интересна).
Обращение к элементу по ID возможно только в HTML документе, причем, если рассматривать кроссбраузерную ситуацию, не подгружаемого динамически посредством Ajax. Здесь речь идет о навигации по всем XML подобным элементам. Причем использовать эти функции наоборот удобны именно в сочетании с поиском по ID или тегам. Делая виджет, например аккордеон или галерею, вам не нужно задавать ID каждому элементу, вы задаете его только элементу контейнеру а навигацию с содержимым (структура которого вам известна) с легкостью осуществляете посредством подобных функций. Например:
Block = new Target( document.getElementById( «BlockID» ) );
Block.inner().get() \\ и у вас ссылка на первый тег в контейнере
Block.inner().previous().get() \\ и у вас ссылка на последний тег в контейнере
Block.select( ">-" ).get() \\ альтернативная предыдущей запись
Последняя запись, из за которой и решил написать статью, удобна именно для сложной структуры (так как символов печатать минимум, а наглядность сохраняется). Плюс в ряде случаев еще очень интересен подход ее использования в связи с динамическим формированием шаблона (что делается очень просто так как является обычной строкой).
И у меня эта часть функционала очень хорошо зарекомендовала себя в другом моем «велосипеде» самописной CMS где данные хранятся в полноценном HTML файлах (база является статической версией самого сайта), а скрип на Ruby осуществляет ее обновление посредством сравнения с шаблоном оформления посредством аналогичных функций. То есть если обычно CMS работаю по принципу раздельного хранения контента и оформления и формируют динамически по запросу выдачу, то в данном случае хранится сама выдача и шаблон оформления, а по запросу на редактирование скрипт находит «разность» между сформированной страницей и шаблоном на котором она сформирована и позволяет редактировать содержание полученных блоков.
Обращение к элементу по ID возможно только в HTML документе, причем, если рассматривать кроссбраузерную ситуацию, не подгружаемого динамически посредством Ajax. Здесь речь идет о навигации по всем XML подобным элементам. Причем использовать эти функции наоборот удобны именно в сочетании с поиском по ID или тегам. Делая виджет, например аккордеон или галерею, вам не нужно задавать ID каждому элементу, вы задаете его только элементу контейнеру а навигацию с содержимым (структура которого вам известна) с легкостью осуществляете посредством подобных функций. Например:
Block = new Target( document.getElementById( «BlockID» ) );
Block.inner().get() \\ и у вас ссылка на первый тег в контейнере
Block.inner().previous().get() \\ и у вас ссылка на последний тег в контейнере
Block.select( ">-" ).get() \\ альтернативная предыдущей запись
Последняя запись, из за которой и решил написать статью, удобна именно для сложной структуры (так как символов печатать минимум, а наглядность сохраняется). Плюс в ряде случаев еще очень интересен подход ее использования в связи с динамическим формированием шаблона (что делается очень просто так как является обычной строкой).
И у меня эта часть функционала очень хорошо зарекомендовала себя в другом моем «велосипеде» самописной CMS где данные хранятся в полноценном HTML файлах (база является статической версией самого сайта), а скрип на Ruby осуществляет ее обновление посредством сравнения с шаблоном оформления посредством аналогичных функций. То есть если обычно CMS работаю по принципу раздельного хранения контента и оформления и формируют динамически по запросу выдачу, то в данном случае хранится сама выдача и шаблон оформления, а по запросу на редактирование скрипт находит «разность» между сформированной страницей и шаблоном на котором она сформирована и позволяет редактировать содержание полученных блоков.
>>>++++++да это же брейнфак :)
Еще один способ, на шарпе.
Применяя метод можно писать запросы вида:
XmlNode xn = GetNodeByscript(node, «p2|n2|c1|c0|c3|c1|c0»);
Чтобы получить node.ParentNode.ParentNode.NextSibling.NextSibling.ChildNodes[1].ChildNodes[0].ChildNodes[3].ChiledNodes[1].ChildNodes[0],
не заморачиваясь на проверках. Затем останется проверить не null ли xn и использовать его.
public static XmlNode GetNodeByscript(XmlNode node, string script)
{
XmlNode ret = node;
int num = 0;
string[] cells = script.Split('|');
foreach (string cell in cells)
{
if (int.TryParse(cell.Substring(1, cell.Length - 1), out num))
{
switch (cell[0])
{
case 'p'://ParentNode
case 'P':
for (int i = 0; i < num; i++)
{
if (ret.ParentNode != null) ret = ret.ParentNode;
else return null;
}
break;
case 'n'://NextSibling
case 'N':
for (int i = 0; i < num; i++)
{
if (ret.NextSibling != null) ret = ret.NextSibling;
else return null;
}
break;
case 'b'://Back(PreviousSibling)
case 'B':
for (int i = 0; i < num; i++)
{
if (ret.PreviousSibling != null) ret = ret.PreviousSibling;
else return null;
}
break;
case 'c'://ChildNodes
case 'C':
if (ret.ChildNodes != null && ret.ChildNodes.Count > num)
ret = ret.ChildNodes[num];
break;
default:
return null;
}
}
}
return ret;
}
* This source code was highlighted with Source Code Highlighter.
Применяя метод можно писать запросы вида:
XmlNode xn = GetNodeByscript(node, «p2|n2|c1|c0|c3|c1|c0»);
Чтобы получить node.ParentNode.ParentNode.NextSibling.NextSibling.ChildNodes[1].ChildNodes[0].ChildNodes[3].ChiledNodes[1].ChildNodes[0],
не заморачиваясь на проверках. Затем останется проверить не null ли xn и использовать его.
Sign up to leave a comment.
Мой удобный велосипед (интерфейс на Javascript) для навигации по XML документу