Цей документ є не офіційним перекладом початкової англійської версії Element Traversal Specification. Зверніть увагу на те, що оригінальна версія документа існує тільки англійською мовою. Цей переклад може містити неточності та помилки. Переклад виконав © Зайцев Дмитро, 2011. За підтримкою сайту http://arcfloorlamp.us/. Коментарі до перекладу залишайте тут! | | На головну
Будь ласка, Зверніться до сторінки виправлень цього документа, яка може включати у себе нормативні зміни.
Див. також переклади.
Copyright © 2008 W3C® (MIT, ERCIM, Keio), Усі права захищені. W3C додержується правил відповідальності, торгової марки и використання документів.
Ця специфікація визначає інтерфейс ElementTraversal
, який дозволяє здійснювати навігацію сценарію елементів дерева DOM, виключаючи всі інші вузли в DOM, такі як текстові вузли. Він також надає атрибут, щоб виявити число дочірніх елементів цього елемента. Він призначений для того, щоб забезпечити більш зручну альтернативу існуючим інтерфейсам навігації DOM, з невеликим обсягом реалізації.
Цей розділ описує статус даного документа на час його публікації. Інші документи можуть заміняти цей документ. Зі списком поточних публікацій W3C та останньою ревізією цього технічного докладу можна ознайомитися в індексі технічних докладів W3C на http://www.w3.org/TR/.
Специфікація обходу елемента є Рекомендацією від 22 грудня 2008 року.
Цей документ був розглянутий членами W3C, розробниками програмного забезпечення, а також іншими групами W3C і зацікавленими сторонами, і схвалений Директором в якості Рекомендації W3C. Це стабільний документ і може бути використаний в якості довідкового матеріалу або цитат в іншому документі. Роль W3C у розробці Рекомендації, полягає в залученні уваги до специфікації, і сприяти її широкому поширенню. Це підвищує функціональність і сумісність у Веб(Web).
Робоча група Веб-додатків (WebApps) підготовила набір тестів та звіт про реалізацію, щоб вказати на поточний рівень підтримуваної реалізації даної специфікації, з передачею результатів для всіх тестів. Не було ніяких змін, починаючи з Запропонованою Рекомендації.
Будь ласка, надсилайте Ваші питання та коментарі щодо цієї специфікації за адресою [email protected], публічний список електронних листів для питань, що стосуються результатів WebApps WG. Цей список знаходиться у публічному архіві, і прийняття цієї політики запису до архіву запитується автоматично після першого повідомлення. Щоб підписатися на цей список надішліть листа за адресою [email protected] зі словом "subscribe" у темі листа.
Цей документ був підготовлений Робочою групою Веб-додатків (WebApps), в рамках W3C Rich Web Clients Activity, у відповідності з викладеними процедурами для W3C Process.
Інтерфейс ElementTraversal
був спочатку опублікований як частина специфікації SVG Tiny 1.2 у просторі імен SVG. На вимогу SVG, CDF, JCP, та інших груп, він був переданий у WebAPI WG, і перенесений у DOM і простір імен DOM, у якості загального об'єкта. Він був переданий ще раз, коли WebApps WG взяв на себе відповідальність за компоненти що поставляються WebAPI WG.
Цей документ був підготовлений групою, діючи в рамках Патентної Політики W3C від 5 лютого 2004 року. W3C підтримує публічний список відкритих патентів зроблений у зв'язку з результатами діяльності групи; ця сторінка також включає в себе інструкції з розкриття патенту. Особи, які мають актуальною інформацією про патент, який задовольняє Основним вимогам, повинні розкрити цю інформацію згідно з пунктом 6 патентної політики W3C.
Цей розділ є інформативним.
Інтерфейс Node
у DOM Рівень 1, визначає 11 типів вузла, але зазвичай автори хочуть працювати виключно на nodeType
1
, вузол Element
. Інші типи вузла включають у себе елемент Document
та вузол Text
, що містить у собі пробіли та розриви рядка. Вузол обходу DOM 1 включає у себе всі ці типи вузлів, які часто є джерелом безладу для авторів і які вимагають додатковий крок для авторів, щоб підтвердити, що очікувані інтерфейси вузла Element
доступні. Це вносить додаткові обмеження в продуктивності.
ElementTraversal
- це інтерфейс, який дозволяє авторам обмежувати навігацію по вузлах Element
. Це дозволяє здійснювати переміщення від елемента до його першого дочірнього елемента, його останнього дочірнього елемента і до його наступного чи попереднього елемента який знаходиться на одному рівні з ним. Оскільки реалізація представляє собою тільки вузли елементу, пам'ять і обчислювальне місце подання DOM можуть бути оптимізовані для обмежених пристроїв.
Інтерфейс Node
у DOM Рівень 1, також визначає атрибут childNodes
, який є живим списком всіх дочірніх вузлів одного вузла; список childNodes
має атрибут length
який служить для того, щоб виявити загальну кількість дочірніх вузлів у всіх nodeTypes
, це корисно для попередньої обробки операцій та обчислень перед, або замість, циклічного виконання через дочірні вузли. У інтерфейсу ElementTraversal
є подібний атрибут, childElementCount
, який повідомляє тільки число вузлів Element
, який часто є тим, що потрібно для таких операцій.
Ця специфікація не включає в себе повний перелік атрибутів, методів, та інших інтерфейсів, наявних у об'єкті Element
. Додаткові інтерфейси знаходяться у інших специфікаціях, зокрема, специфікації DOM Core.
Цей розділ є нормативним.
Ключові слова "ЗОБОВ'ЯЗАНИЙ (MUST)", "НЕ ЗОБОВ'ЯЗАНИЙ (MUST NOT)", "НЕОБХІДНИЙ (REQUIRED)", "МАЄ (SHALL)", "НЕ МАЄ (SHALL NOT)", "СЛІД (SHOULD)", "НЕ СЛІД (SHOULD NOT)", "РЕКОМЕНДУЄТЬСЯ (RECOMMENDED)", "МОЖЕ (MAY)", и "НЕОБОВ'ЯЗКОВО (OPTIONAL)" у цьому документі повинні інтерпретуватися, як описано у RFC 2119 [RFC2119]. З метою зручності читання ці терміни не обов'язково використовувати у такому регістрі у цьому документі.
Іноді, для зручності читання, вимоги відповідності формулюються, як вимоги до елементів, атрибутів, методів, інтерфейсів, властивостей або функцій. У всіх випадках вони є вимогами відповідності до реалізацій. Відповідна реалізація цієї специфікації задовольняє всі вимоги, ідентифіковані за допомогою цих термінів, у межах її прив'язок до мови.
ElementTraversal
Цей розділ є нормативним.
Інтерфейс ElementTraversal
являє собою набір атрибутів тільки для читання, які дозволяють автору легко переміщатися між елементами в документі. У відповідних реалізаціях обходу елементів, всі об'єкти які реалізують Element
повинні також реалізовувати інтерфейс ElementTraversal
. Кожен з наступних чотирьох атрибутів з набору, firstElementChild
, lastElementChild
, previousElementSibling
, та nextElementSibling
, забезпечує живе посилання на інший елемент з певним ставленням до поточного елемента, якщо зв'язаний елемент існує. П'ятий атрибут, childElementCount
, надає число дочірніх елементів елемента, для того, щоб попередньо обробити перед навігацією. Відповідна клієнтська програма повинна реалізувати всі п'ять атрибутів. Клієнтська програма може реалізувати подібні інтерфейси в інших специфікаціях, але така реалізація не потрібна для відповідності до цієї специфікації, якщо клієнтська програма розроблена для мінімального обсягу коду.
Цей інтерфейс повинен бути реалізований на всіх Element
, незалежно від їх простору імен. Вузли EntityReference невидимі механізму обходу елементів; якщо обхідник дерева (tree-walker) випадково зустрічає вузол EntityReference, він спускається до нього, не повідомляючи про це програмі яка його викликає, і обробляє будь-які дочірні елементи так, як якщо б вони були присутні в тому місці де вузол об'єкту був знайдений. Навігація зобов'язана бути незалежна від простору імен, наприклад, якщо елемент у просторі імен HTML буде супроводжуватися елементом у просторі імен SVG, тоді атрибут nextElementSibling
елемента HTML поверне елемент SVG.
firstElementChild
Отримавши доступ до цього атрибуту елемента повинен повернути посилання на перший дочірній вузол того елемента, який має nodeType
1
, як об'єкт Element
. Якщо елемент, до якого отримують доступ до цього атрибуту не має дочірніх вузлів, або якщо жоден з цих дочірніх вузлів не є вузлом елемента, то цей атрибут повинен повернути null
.
lastElementChild
Отримавши доступ до цього атрибуту елемента повинен повернути посилання на останній дочірній вузол того елемента, який має nodeType
1
, як об'єкт Element
. Якщо елемент, до якого отримують доступ до цього атрибуту, немає ніяких дочірніх вузлів, або жоден з цих дочірніх вузлів не є вузлом елемента, в такому випадку цей атрибут повинен повернути null
.
previousElementSibling
Отримавши доступ до цього атрибуту елемента повинен повернути посилання на однорівневий вузол того елемента, який безпосередньо передує того елемента в порядку проходження в документі, і який має nodeType
1
, як об'єкт Element
. Якщо у елемента, до якого отримують доступ до цього атрибуту, немає ніяких попередніх однорівневих вузлів, або якщо жоден з тих, які передують однорівневим вузлам, не є вузлами елементу, то цей атрибут повинен повернути null
.
nextElementSibling
Отримавши доступ до цього атрибуту елемента повинен повернути посилання на однорівневий вузол того елемента, який безпосередньо слідує за тим елементом в порядку проходження в документі, і який має nodeType
1
, як об'єкт Element
. Якщо у елемента, до якого отримують доступ до цього атрибуту, немає ніяких подальших однорівневих вузлів, або якщо ні один з тих подальших вузлів не є вузлом елемента, то цей атрибут повинен повернути null
.
childElementCount
Отримавши доступ до цього атрибуту елемента повинен повернути поточне число дочірніх вузлів того елемента, який має nodeType
1
. Реалізація може зберегти це число, або може обчислити його при отриманні доступу до цього атрибуту, але кількість має завжди відображати число дочірніх вузлів елемента під час отримання доступу до атрибуту. Рахуватися повинні тільки безпосередні дочірні вузли, наприклад, елементи, які є дочірніми вузлами одного з дочірніх вузлів елемента, на якому отримують доступ до атрибуту, не включені в цей підрахунок. Якщо у елемента, на якому отримують доступ до цього атрибуту, немає ніяких дочірніх вузлів, або якщо ні один з тих дочірніх вузлів не є вузлом елемента, тоді цей атрибут повинен повернути 0.
Цей розділ є інформативним.
Цей розділ ілюструє декілька прикладів ECMAScript [ECMA262], використовуючи Обхід Елементу.
previousElementSibling
Цей приклад демонструє корисність атрибуту previousElementSibling
. Наступний код бере елемент як параметр, і повертає позицію елемента у порядку послідовності в документі, в межах його старшого елементу:
function findPosition( el ) { var pos = 0; // крок через дочірні елементи у зворотному порядку while ( null != el ) { // переміщення до попереднього однорівневого елемента el = el.previousElementSibling; pos++; } return pos; }
Цей приклад демонструє корисність атрибуту childElementCount
. Наступний код бере елемент як параметр, і розміщує рівно віддалено кожен з його дочірніх елементів, згідно вільного місця:
function spaceChildren( el ) { // отримання кількості вузлів елемента var elCount = el.childElementCount; var eachWidth = window.innerWidth / (elCount + 1); // отримання першого дочірнього елемента var childEl = el.firstElementChild; // завдання початкової позиції var nextPos = eachWidth/2; // перебір дочірніх елементів з одиничним кроком while ( childEl ) { // позиція дочірнього елемента childEl.style.setProperty( 'position', 'absolute', '' ); childEl.style.setProperty( 'left', nextPos + 'px', '' ); childEl.style.setProperty( 'width', eachWidth + 'px', '' ); // збільшення позиції за шириною nextPos += eachWidth; // потім переміщення до наступного дочірнього елемента childEl = childEl.nextElementSibling; } }
Цей приклад зіставляє ElementTraversal
з іншими інтерфейсами DOM. Наступний сценарій показує різні методи ітерації через дерево DOM, враховуючи наступний фрагмент SVG:
<g id='shapeGroup'> <rect id='rect1' x='5' y='5' width='310' height='220' rx='15' ry='15' fill='skyblue'/> <rect id='rect2' x='15' y='15' width='210' height='180' rx='15' ry='15' fill='cornflowerblue'/> <ellipse id='ellipse1' cx='90' cy='70' rx='50' ry='30' fill='yellow' stroke='orange'/> <path id='path1' stroke-width='15' stroke='orange' fill='none' stroke-linecap='round' d='M25,150 C180,180 290,0 400,140 S420,100 460,90'/> <text id='text1' x='0' y='0' font-size='35' fill='yellow' stroke='orange' stroke-width='2' stroke-linejoin='round' font-weight='bold'> <textPath id='textPath1' xlink:href="#path1">when life gives you lemons...</textPath></text> </g>
function walkTest( el ) { // отримання кількості всіх вузлів var nodeCount = el.childNodes.length; // отримання першого дочірнього вузла var firstNode = el.firstChild; // отримання першого дочірнього елемента var childEl = el.firstElementChild; // перебір дочірніх елементів з одиничним кроком while ( childEl ) { // робимо щось корисне тут... // потім пересуваємося до наступного дочірнього елемента childEl = childEl.nextElementSibling; } }
Де el є елементом 'g'
який має 'id'
"shapeGroup"
, nodeCount буде мати значення 11
. firstNode буде вузлом Text
(nodeType
3
), і не еквівалентний першому присвоєному значенню childEl, який є вузлом Element
(nodeType
1
) має 'id'
"rect1"
. Цикл while
циклічно повториться ще 4 рази, виконуючи ітерації через однорівневі вузли Element
, відповідно "rect2"
, "ellipse1"
, "path1"
, та "text1"
. Та останнє значення childEl буде null
, оскільки "text1"
не має наступного однорівневого елемента, хоча у нього є наступний однорівневий вузол.
Відзначте, що елемент 'text' у SVG не те ж саме, що вузол Text
. Відзначте також, що дочірній елемент 'textPath' у SVG елементу 'text' не включений до ітерації, оскільки він не однорівневий з childEl.
Цей розділ є інформативним.
Ця специфікація забезпечує інтерфейс, який має функціональне подобу атрибутам навігації DOM з DOM 1 Core, але працює тільки на вузлах елемента, а не на інших типах вузла. Найбільш сумісними атрибутами DOM 1 Core є firstChild
, lastChild
, previousSibling
, nextSibling
, та nodeList.length
.
Об'єктна Модель Документа Рівень 2 Обхід & Діапазон (Document Object Model Level 2 Traversal & Range) це всебічна специфікація навігації документа, але яка може зажадати більше ресурсів від пристроїв і розробника, ніж Обхід Елементу (Element Traversal). Оскільки Обхід Елементу складається з оптимізованої підмножини функціональності DOM 2 Traversal, клієнтська програма яка виконує це, у певній мірі може посилювати функціональність Обходу.
Це додаткові специфікації DOM 3 Core.
Цей розділ є інформативним.
Немає ніяких відомих питань безпеки, які включені у реалізацію або використання інтерфейсу ElementTraversal
. Цей розділ повинен бути переглянутий, якщо в майбутньому, питання безпеки будуть виявлені.
interface ElementTraversal { readonly attribute ElementfirstElementChild
; readonly attribute ElementlastElementChild
; readonly attribute ElementpreviousElementSibling
; readonly attribute ElementnextElementSibling
; readonly attribute unsigned longchildElementCount
; };
firstElementChild
null
, якщо цей елемент не має дочірніх елементів.lastElementChild
null
, якщо цей елемент не має дочірніх елементів.previousElementSibling
null
, якщо цей елемент не має однорівневих вузлів елемента, які йдуть перед цим елементом в дереві документа.nextElementSibling
null
, якщо цей елемент не має однорівневих вузлів елемента, які йдуть після цього елемента в дереві документа.childElementCount
0
, якщо у цього елемента немає ніяких дочірніх вузлів, які мають nodeType
1
.Element
ElementTraversal
, Element
має всі властивості і методи Node
та Element
як це визначено у інших специфікаціях DOM, і на додаток має такі властивості:firstElementChild
Element
тільки для читання.lastElementChild
Element
тільки для читання.previousElementSibling
Element
тільки для читання.nextElementSibling
Element
тільки для читання.childElementCount
Number
тільки для читання.package org.w3c.dom; public interface ElementTraversal { Element getFirstElementChild(); Element getLastElementChild(); Element getPreviousElementSibling(); Element getNextElementSibling(); int getChildElementCount(); }
Різні редакційні зміни, виправлення та модифікації до прикладів були зроблені від проекту до проекту.
Атрибут childElementCount
був додатковим до первісної пропозиції, з причин, вказаних в цій специфікації.
ElementTraversal
у SVG.Редактор хотів би подякувати наступних людей за їх внесок при написанні цієї специфікації: Девід Андерсон (David Andersson), Робін Бержон(Robin Berjon), Жан-Ів Біттерліч (Jean-Yves Bitterlich), Серджіу Дімітріу (Sergiu Dumitriu), Деніель Глазмен (Daniel Glazman), Бьорн Хьорман (Bjoern Hoehrmann), Куросава Такеші (Kurosawa Takeshi), Кріс Ліллей (Chris Lilley), Чарльз Мак-КетіНейвайл (Charles McCathieNevile), Кемерон Мак-Кормак (Cameron McCormack), Саймон Пітерс (Simon Pieters), Нандіні Рамані (Nandini Ramani), Джонас Сіккін (Jonas Sicking), Ендрю Следд (Andrew Sledd), Джош Сореф (Josh Soref), Енн Ван Кестерен (Anne van Kesteren), Борис Жбарскій (Boris Zbarsky), та Мохамед Зерджоуі (Mohamed Zergaoui). Редактор додатково хотів би подякувати SVG WG за те, що він зробив проект [SVGD] на якому спочатку була заснована дана специфікація.