08.04.2010, 17:13
|
Аспирант
|
|
Регистрация: 08.04.2010
Сообщений: 34
|
|
Навигация внутри DOM. Как это сделать нормально?
Вот такая вот задачка.
http://sneg-izdat.ru/test/
т.е. у нас есть поле 10 на 10 клеток (обычная таблица)
кликаем по ячейке - она выделяется, далее кнопками "влево, вправо, вверх, вниз" можем перемещать "активный квадрат".
По приведенной ссылке в фф худо-бедно работает.
в ИЕ и опере, вверх/вниз перескакивает через строку.
Методы, которые пришлось использовать - порой реально извращенные, как мне кажется, но ничего лучше не нашел.
Кто может - подскажите как правильнее осуществлять навигацию внутри DOM? Данную задачу, конечно, можно решить с помощью установки ай-ди аля координатная сетка, но, ИМХО, это не способ решения проблемы. Это костыли.
|
|
08.04.2010, 17:51
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
У элементов таблицы есть специальные коллекции:
table.tBodies[0].rows[0].cells[0]
|
|
08.04.2010, 18:57
|
Аспирант
|
|
Регистрация: 08.04.2010
Сообщений: 34
|
|
Спасибо за данные методы.
Но они будут работать только в случае с таблицей.
Хотелось бы найти универсальные средства, которыми можно осуществлять навигацию в различных ситуациях.
Например если нужно перемещаться между подобным образом сверстанными дивами.
Есть ли какие-либо методы вроде previousSibling/nextSibling, через которые это можно реализовать? Либо не такие всеобъемлющие методы вроде AnyObj.childNode/AnyObj.children.
Первая пара(previousSibling/nextSibling) мне не нравится тем, что внутри них как отдельные узлы воспринимаются не только какие-то теги, но и, судя по всему, толи пробелы, толи переносы строк в исходном коде.
AnyObj.children вроде бы лишен таких пакостей, но из-за невозможности перейти к действительному соседнему узлу и обратится уже к его дочерним объектам - использование AnyObj.children не всегда возможно .
Не знаю, понятно ли вообще что я хочу...
Я хочу понять как можно переходить между соседними элементами родителя первоначального элемента, и вставать на ту же самую позицию среди дочерних элементов соседа родителя, где находится первоначальный элемент относительного своего родителя %))
Если вопрос не ясен, могу нарисовать схему.
|
|
08.04.2010, 19:21
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Цитата:
|
Первая пара(previousSibling/nextSibling) мне не нравится тем, что внутри них как отдельные узлы воспринимаются не только какие-то теги, но и, судя по всему, толи пробелы, толи переносы строк в исходном коде.
|
master_alf, напишите свои prev/next, которые пропускают текстовые ноды. Или загуглите готовое решение, их наверняка over9000.
|
|
08.04.2010, 20:27
|
Аспирант
|
|
Регистрация: 08.04.2010
Сообщений: 34
|
|
Если бы знал как написать... написал бы
Второй день только как занялся javascript и DOM...
|
|
08.04.2010, 20:39
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
|
|
08.04.2010, 21:07
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Цитата:
|
Или загуглите готовое решение, их наверняка over9000
|
master_alf, ну, гуглом-то не второй день пользуетесь?
|
|
09.04.2010, 00:17
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от master_alf
|
Спасибо за данные методы.
Но они будут работать только в случае с таблицей.
|
но твою текущую задачи они ведь решают? Хотя nextSibling/previousSibling удобнее в данном случае. В частности, удобнее childNodes. Потому что все эти rows, cells, childNodes - чтобы просмотреть список дочерних элементов, а тебе надо перейти к предыдущему/следующему. Да и вообще, тебе нужна универсальность? previous/nextSibling универсальнее, чем тебе надо, потому что учитывают текстовые узлы
Ссылка Octane, конечно, интересна, но я бы тебе советовал ее на потом, когда разберешься, как без этого обойтись
а без этого обойтись можно, как сказал e1f, как-то так
function next( el ){
do {
el = el.nextSibling;
} while( el && el.nodeType != 1 )
return el;
}
|
|
09.04.2010, 09:52
|
Аспирант
|
|
Регистрация: 08.04.2010
Сообщений: 34
|
|
Сообщение от e1f
|
master_alf, ну, гуглом-то не второй день пользуетесь?
|
Не второй, но на форуме вопрос задал только после того, как порыскал по гуглу. К сожалению сам ничего найти путнего не смог.
Сообщение от x-yuri
|
но твою текущую задачи они ведь решают?
|
Да, решают. Но т.к. задача это для меня, а не для преподователя в институте, хотелось бы научиться навигации в принципе, а не применительно к конкретно этому примеру.
Сообщение от x-yuri
|
Хотя nextSibling/previousSibling удобнее в данном случае. В частности, удобнее childNodes.
|
Не совсем понял, это же методы разного уровня, в смысле nextSibling/previousSibling - позволяют перемещаться внутри текущего уровня между узлами. А childNodes - отдает список дочерних элементов узла. т.е. получается, мы в структуре дерева уходим вглубь. Это я к тому, что не пойму, как можно сравнивать методы prevSibling/nextSibling и childNotes.
|
|
09.04.2010, 10:06
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
но ты же сравниваешь (previousSibling/nextSibling vs AnyObj.childNode/AnyObj.children)? Или я тебя неправильно понял? В принципе следующий элемент можно и через parentNode.childNodes найти, если очень хочется, но не стоит
Сообщение от master_alf
|
Да, решают. Но т.к. задача это для меня, а не для преподователя в институте, хотелось бы научиться навигации в принципе, а не применительно к конкретно этому примеру.
|
так спрашивать тогда надо "какие есть варианты навигации?", и не "как решить задачу?"
|
|
|
|