Статьи

Грубое руководство по DOM

Добро пожаловать в Грубое Руководство по DOM.

В двух частях этой серии описывается объектная модель документа, объясняются ее преимущества и рассматривается ее реализация.

Грубое руководство по DOM — часть 1

Это проклятие веб-разработчиков во всем мире — противоречивые стандарты, несовместимость браузеров и код, который меняется каждый раз, когда новая версия браузера попадает в Интернет.

Но не бойтесь — напасть на белого коня придет героический рыцарь, одетый в одежду нового W3C DOM и вооруженный инструментами, чтобы этот кошмар навсегда закончился. Читайте дальше, чтобы узнать, как новый DOM, наконец, привносит некоторые стандарты в совершенно нестандартный мир Интернета.

Грубое руководство по DOM — часть 2

Теперь, когда вы знаете теорию нового DOM, пришло время снять перчатки и испачкать руки.

В этой статье вы узнаете, как новые правила применяются к старым избранным элементам, таким как обмен изображениями, проверка форм и навигация по фреймам, а затем узнаете, как использовать обычный JavaScript для добавления и удаления элементов из дерева документов на лету.

Грубое руководство по DOM — часть 1

Текущее состояние Дании

В «Гамлете» Шекспира один из персонажей замечательно отмечает: «Что-то гнилое в штате Дания». И каждый раз, когда я сажусь кодировать какой-нибудь dHTML, меня мучает чувство удивления по поводу его проницательности. Этот комментарий, наполненный подтекстом гибели, является настолько прекрасной оценкой многочисленных несовместимостей между двумя основными браузерами и проблем, которые они ежедневно создают для разработчиков, что трудно не смеяться. И я бы … если бы я не был уже плачущим ведром.

Эти несовместимости особенно ярко проявляются в области, известной как DOM или объектная модель документа, стандартный метод доступа к каждому элементу в документе вместе с его атрибутами. Когда была впервые представлена ​​примитивная версия DOM, разработчики сразу поняли, насколько она полезна для добавления новых уровней интерактивности на статическую веб-страницу. Однако, поскольку два основных браузера разветвлялись в разных направлениях, разрабатывая конструкции DOM, которые были взаимно несовместимыми, это восторг быстро превращался в разочарование — в конце концов, ни одному разработчику не нравится писать разные версии одного и того же скрипта для разных браузеров.

Конечно, еще не все потеряно. Предпринимаются усилия, особенно в W3C, по установлению общих стандартов для всех браузеров. Выпуск спецификации CSS, а затем спецификаций DOM Level 0 и Level 1 привел к тому, что большинство основных браузеров оказались в соответствии с предлагаемыми стандартами. Обратная сторона: поскольку стандарт теперь доступен, производители браузеров скоро перестанут поддерживать свои предыдущие версии DOM… это означает, что весь написанный вами код и продуманные обходные пути, которые вы разработали, больше не будут работать в новых версиях браузеров.

Вы уже можете видеть, что это происходит — код, написанный специально для Netscape 4.x, больше не работает в Netscape 6.x, который построен на движке Mozilla — и поэтому каждый разработчик должен понимать новый стандарт DOM и его влияние на код dHTML развитие.

На следующих нескольких страницах я проиллюстрирую некоторые из новых конструкций DOM, а также примеры того, как их можно использовать в «реальных» документах HTML. Моим верным конем в этом путешествии будет Mozilla, замечательный браузер с открытым исходным кодом, доступный по адресу http://www.mozilla.org/ , который претендует на звание самого совместимого со стандартами браузера на сегодняшний день.

Прежде чем мы начнем, несколько оговорок.

Во-первых, это руководство не является исчерпывающей ссылкой на DOM — вы можете купить книгу для этого. Это просто руководство, которое поможет вам осуществить переход к новой объектной модели.

Во-вторых, я не претендую на звание эксперта по DOM, и большая часть материала этого руководства основана на моем собственном опыте разработчика.

Наконец, поскольку новые стандарты DOM предлагаются и утилизируются, материал может стать недействительным; Вы всегда должны обращаться к самой последней версии стандарта или рекомендации по адресу http://www.w3.org/DOM/ для получения актуальной информации (это один из моих любимых документов — я часто использую его, когда у меня возникают проблемы со сном) ,

С формальностями с пути, давайте начнем.

Вернуться к основам

Мы начнем с основ — очень простой HTML-страницы.

<html>  <head></head>  <body bgcolor="white">  <div id="a" style="font-family: Arial; color: white;  background: black">Wassup?</div>  </body>  </html> 

Давайте изменим цвет шрифта текста внутри <div> . В Internet Explorer это обычно выполняется с помощью

 <script language="JavaScript">  document.all.a.style.color = "red";  </script> 

Вот код, который я бы использовал в Mozilla:

 <script language="JavaScript">  var obj = document.childNodes[0].childNodes[1].childNodes[0];  obj.style.color = "red";  </script> 

Объяснение здесь в порядке. В новом DOM каждый элемент в документе HTML является частью «дерева», и вы можете получить доступ к каждому элементу, перемещаясь по «ветвям» дерева, пока не достигнете соответствующего «узла». Учитывая это, вот мое представление HTML-документа выше, в виде «дерева».

 document  | -- <html>  | -- <head>  | -- <body>  | -- <div> 

Теперь, чтобы добраться до <div> , мне нужно:

  1. начать сверху (« document »);
  2. перейти вниз к основной ветви — тегу <html> или « document.childNodes[0] »;
  3. затем ко второй подветви — <body> или « document.childNodes[0].childNodes[1] »;
  4. затем к <div> — « document.childNodes[0].childNodes[1].childNodes[0] »;

На этом этапе я успешно прошел путь к элементу <div> в дереве документа. Быстрый способ убедиться в этом — использовать alert() для объекта.

 <script language="JavaScript">  var obj = document.childNodes[0].childNodes[1].childNodes[0];  alert(obj.nodeName);  obj.style.color = "red";  </script> 

который отображает имя тега — DIV — в окне предупреждения.

С этого момента я могу начать возиться с атрибутами объекта — в приведенном выше примере я изменил атрибут стиля «цвет». Не волнуйтесь об этом на данный момент; просто убедитесь, что вы поняли, как я перемещался по дереву документов, чтобы добраться до DIV .

Copyright Melonfire , 2000. Все права защищены.

Навигация по Семейному древу

В дополнение к различным childNodes[] , DOM также предлагает ряд других объектов / свойств, которые могут упростить навигацию между элементами документа.

  • firstChild — ссылка на первый дочерний узел в коллекции
  • lastChild — ссылка на последний дочерний узел в коллекции
  • parentNode — ссылка на узел на один уровень выше в дереве
  • nextSibling — ссылка на следующий узел в текущей коллекции
  • previousSibling — ссылка на предыдущий узел в текущей коллекции

Итак, со ссылкой на пример выше, я мог бы использовать любой из альтернативных маршрутов ниже, чтобы перейти к тегу <div> .

 document.childNodes[0].childNodes[1].firstChild  document.childNodes[0].firstChild.nextSibling.firstChild  document.childNodes[0].childNodes[1].firstChild.firstChild.parentNode 

Каждый дочерний элемент в дереве может быть тегом HTML или «текстовым узлом». Это поднимает важный момент — пробелы и возврат каретки между различными тегами могут влиять на древовидную структуру документа, создавая текстовые узлы в древовидной структуре и вызывая сильные скрежеты зубов при настройке кода для нового дерева.

Что в имени?

Именно по этой причине DOM предлагает более быстрый и эффективный метод доступа к элементам на странице — метод getElementById() .

Я переписал приведенный выше пример, чтобы продемонстрировать, как можно использовать этот метод.

 <script language="JavaScript">  var obj = document.getElementById("a");  obj.style.color = "red";  </script> 

Как видите, это гораздо проще читать… и кодировать.

Каждый узел имеет некоторые базовые свойства, которые пригодятся разработчику — например, свойство «nodeName» возвращает имя тега, а свойство «nodeType» возвращает число, указывающее тип узла (HTML tag = 1; атрибут HTML tag = 2; текстовый блок = 3). Если узел является текстовым, а не тегом, свойства «data» и «nodeValue» возвращают текстовую строку.

В следующем примере показано, как можно получить доступ к различным свойствам узла — раскомментируйте различные вызовы метода alert (), чтобы отобразить различные свойства объекта.

 <html>  <head></head>  <body id="body" bgcolor="white"><font face="Arial"  size="2">This stuff is giving me a headache already!</font>  <script language="JavaScript">   // get to the <font> tag  var fontObj = document.getElementById("body").childNodes[0];   // check the tag - returns "FONT"  // alert(fontObj.nodeName);  // check the type of node - returns 1  // alert(fontObj.nodeType);  // get the text within the <font> tag  var textObj = fontObj.childNodes[0];  // check the text value - returns "This stuff is giving  me a headache already!"  // alert(textObj.data);  // check the type of node - returns 3  // alert(textObj.nodeType);  </script>  </body>  </html> 

И, кстати, — текстовый узел, который не содержит данных, возвращает значение « #text » свойству «nodeName» — попробуйте заменить строку текста из тегов <font> выше на пару пробелов, чтобы понять, что я имею в виду.

Утки в ряд

В дополнение к методу getElementById() , который обычно используется для получения ссылки на определенный элемент, DOM также предлагает метод getElementsByTagName() , используемый для возврата коллекции элемента определенного типа. Например, код

 document.getElementsByTagName("form"); 

вернет коллекцию или массив, содержащий ссылки на все теги <form> в документе. Каждая из этих ссылок является узлом, и затем может управляться с использованием стандартных методов и свойств DOM.

Рассмотрим следующий документ, который содержит три элемента <div> , каждый из которых содержит строку текста

 <html>  <head>  </head>  <body bgcolor="white">  <div id="huey">  Huey here!  </div>  <div id="dewey">  Dewey in the house!  </div>  <div id="louie">  Yo dude! How's it hangin'?  </div>  </body>  </html> 

а затем изучите код, который я буду использовать для манипулирования текстом во втором <div>

 <script language="JavaScript">   // get a list of all <div> tags  var divCollection = document.getElementsByTagName("div");   // get a reference to the second <div> in the collection  var deweyObj = divCollection[1];   // verify that we are where we think we are  // alert(deweyObj.getAttribute("id"));  // change the text string within the <div>  deweyObj.childNodes[0].data = "Dewey rocks!";  </script> 

Собрание всех тегов в документе (очень похоже на « document.all ») можно получить с помощью

 document.getElementsByTagName("*"); 

Copyright Melonfire , 2000. Все права защищены.

Меняем вещи вокруг

Теперь, когда вы знаете, как найти путь к определенным элементам HTML в документе, пришло время научиться манипулировать ими. Поскольку большая часть этой манипуляции включает в себя изменение атрибутов тега на лету, DOM предлагает getAttribute() и setAttribute() , которые специально разработаны для этой цели.

Рассмотрим следующую модификацию только что увиденного примера, в которой используются эти два метода для изменения размера шрифта и текстовой строки.

 <html>  <head></head>  <body id="body" bgcolor="white"><font face="Arial"  size="2">This stuff is giving me a headache already!</font>  <br>  Click to <a href="javascript:increaseFontSize();">increase font size</a>  or <a href="javascript:changeText()">change text string</a>   <script language="JavaScript">   // get to the <font> tag  var fontObj = document.getElementById("body").childNodes[0];   // check the tag - returns "FONT"  // alert(fontObj.nodeName);  // check the type of node - returns 1  // alert(fontObj.nodeType);  // get the text within the <font> tag  var textObj = fontObj.childNodes[0];   // check the text value - returns "This stuff is giving  me a headache already!"  // alert(textObj.data);  // check the type of node - returs 3  // alert(textObj.nodeType);  function changeText()  {   // alter the node value  textObj.data = "I need some aspirin. Now.";  }  function increaseFontSize()  {   // get the value of the "size" attribute of the node  var size = fontObj.getAttribute("size");   // increase by 1  size += 1;   // set the new value  fontObj.setAttribute("size", size);  }  </script>  </body>  </html> 

Я использовал два разных метода здесь. Чтобы изменить размер шрифта, я сначала использовал метод getAttribute() для возврата текущего значения атрибута, а затем использовал метод setAttribute() для записи нового значения. Однако изменение текстовой строки — это просто вопрос изменения значения свойства «data» текстового узла.

При использовании getAttribute() и setAttribute() учитывать getAttribute() setAttribute() . Все имена атрибутов должны быть в нижнем регистре, а имена и значения должны быть заключены в кавычки (если вы опустите кавычки, значения будут рассматриваться как переменные). Очевидно, что вы должны использовать только те атрибуты, которые имеют отношение к рассматриваемому тегу — например, вы не можете использовать setAttribute("src") для <font> .

альтернативы

Альтернативный способ получения (и установки) значений атрибута заключается в коллекции attributes[] , которая по сути является массивом, содержащим список всех пар атрибут-значение для определенного тега. Я изменил предыдущий пример, чтобы проиллюстрировать, как это работает — раскомментируйте различные alert() чтобы увидеть значения различных свойств.

 <html>  <head></head>  <body id="body" bgcolor="white">  <font face="Arial" size="2">This stuff is giving me  a headache already!</font>   <script language="JavaScript">   // get to the <font> tag  var fontObj = document.getElementById("body").childNodes[0];   // return the number of attributes of the <font> tag  // or the length of the attributes[] collection  // returns 2  // alert(fontObj.attributes.length);  // returns the name of the first attribute - "face"  // alert(fontObj.attributes[0].name);  // returns the value of the first attribute - "Arial"  // alert(fontObj.attributes[0].value);  // changes the value of the first attribute to "Verdana"  fontObj.attributes[0].value = "Verdana";   // returns the new value of the first attribute - "Verdana"  // alert(fontObj.attributes[0].value);  </script>  </body>  </html> 

Copyright Melonfire , 2000. Все права защищены.

Shazam!

DOM также позволяет вам изменять свойства CSS определенных тегов HTML — как показано в следующем примере:

 <html>  <head>  <script language="JavaScript">  function disappear()  {  var obj = document.getElementById("mirage");  obj.style.display = "none";  }  </script>  </head>  <body>  <div id="mirage">  Now you see it...  </div>  <a href="javascript:disappear()">...now you don't!</a>  </body>  </html> 

Я сделал нечто подобное в самом первом примере в этой статье — взгляните и на этот, пока вы на нем.

Используя эту технику, можно применить практически любой встроенный стиль к элементу на странице. Помните, что свойства стиля, которые являются дефисами — например, « background-color » и « font-family » — должны быть написаны как одно слово с первым символом после дефиса в fontFamily — например, « backgroundColor » и « fontFamily » , Следующий пример должен ясно проиллюстрировать это:

 <html>  <head>  <script language="JavaScript">  function transform()  {  var obj = document.getElementById("marvel");  obj.style.fontFamily = "Verdana";  obj.style.fontSize = "40pt";  obj.style.backgroundColor = "red";  obj.style.color = "black";  obj.style.textDecoration = "underline";  obj.style.textAlign = "center";  obj.style.letterSpacing = "10";  }  </script>  </head>  <body>  <div id="marvel">  Captain Marvel  </div>  <a href="javascript:transform()">shazam!</a>  </body>  </html> 

Это об этом на данный момент. Во второй части этой статьи я рассмотрю несколько простых примеров кода для простых приложений JavaScript — обмен изображениями, проверка формы и навигация по фреймам — с использованием новых структур DOM. Я также буду обсуждать функции appendChild() и createNode() , которые позволяют разработчикам добавлять новые элементы в дерево документа через программный код. Не пропустите!

Примечание. Все примеры в этой статье были протестированы на Mozilla (сборка 18). Примеры являются только иллюстративными и не предназначены для производственной среды. YMMV!
Copyright Melonfire , 2000. Все права защищены.

Грубое руководство по DOM — часть 2

Копать глубже

В первой части этой статьи я ознакомил вас с основами навигации по HTML-документу через DOM и объяснил различные доступные вам методы и коллекции. Если вы все это поняли (и я надеюсь, что вы поняли), то теперь у вас должно быть достаточно четкое представление о том, как управлять типичным HTML-документом и изменять элементы интерфейса на лету.

На следующих нескольких страницах я собираюсь углубиться в DOM с иллюстрациями того, как DOM взаимодействует с таблицами, формами, изображениями и фреймами. Я также буду обсуждать некоторые методы, доступные для добавления (и изменения) узлов в дерево DOM через JavaScript, и укажу на некоторые из лучших веб-ресурсов по этой теме.

Давайте взломать!

Создание Swap()

Первый пункт повестки дня сегодня — это иллюстрация того, как вы можете использовать DOM для выполнения одного из самых популярных приложений dHTML — обмена изображениями. Взгляните на следующий HTML-документ:

 <html>  <head>  </head>   <body>   <a href="http://www.melonfire.com/" onMouseOver="javascript:imageSwap();"  onMouseOut="javascript:imageSwap();"><img id="logo" src="logo_n.gif"  width=50 height=50 border=0></a>   </body>  </html> 

Теперь я настроил это так, чтобы события mouseover и mouseout на изображении обрабатывались JavaScript-функцией imageSwap() . Эта функция отвечает за обмен изображения каждый раз, когда происходит событие, поэтому давайте посмотрим на него.

 <script language="JavaScript">  var normal = "logo_n.gif";  var hover = "logo_h.gif";   function imageSwap()  {  var imageObj = document.getElementById("logo");  var imageSrc = imageObj.getAttribute("src");   if (imageSrc == normal)    {    imageObj.setAttribute("src", hover);    }  else    {    imageObj.setAttribute("src", normal);    }  }  </script> 

Если вы помните то, чему я вас научил в прошлый раз, ничто из этого не должно вызывать удивления. Сначала я определил изображения « normal » и « hover » состояния, а затем создал функцию imageSwap() , которая вызывается всякий раз, когда мышь перемещается над изображением.

Функция imageSwap() получает ссылку на изображение через его идентификатор, а затем получает текущее значение атрибута изображения « src ». Затем он сравнивает значение со значениями переменных « normal » и « hover » и соответствующим образом изменяет источник изображения.

Поворачивая таблицы

Далее таблицы. Взгляните на следующий HTML-документ, который содержит таблицу с двумя строками по три ячейки в каждой.

 <html><head></head><body><table border="1" cellspacing="5"  cellpadding="5"><tr><td>R1, C1</td><td>R1, C2</td><td>R1,  C3</td></tr><tr><td>R2, C1</td><td>R2, C2</td><td id="r2c3">R2,  C3</td></tr></table></body></html> 

Теперь, когда вы перемещаетесь по таблице, следует помнить об одном важном моменте — из DOM vie таблицу следует обрабатывать так, как если бы она включала дополнительный <tbody> сразу после <table> и перед <tr> теги. Добавляя это к уравнению, страница выше теперь выглядит так:

 <html><head></head><body><table border="1" cellspacing="5"  cellpadding="5"><tbody><tr><td>R1, C1</td><td>R1, C2</td><td>R1,  C3</td></tr><tr><td>R2, C1</td><td>R2, C2</td><td id="r2c3">R2,  C3</td></tr></tbody></table></body></html> 

Теперь применяются обычные правила навигации DOM, как показано в следующем примере. Этот сценарий выполняет детализацию до последней ячейки второй строки и изменяет как цвет фона ячейки, так и текстовую строку внутри нее.

 <script language="JavaScript">   // get to the cell  // you could also use  // var cellObj =  document.childNodes[0].childNodes[1].childNodes[0].childNodes[0].  childNodes[1].childNodes[2];   var cellObj = document.getElementById("r2c3");   // get to the text within the cell  var cellTextObj = cellObj.childNodes[0];   // set background colour  cellObj.setAttribute("bgcolor", "red");   // and text  cellTextObj.data = "Second row, third column";  </script> 

Copyright Melonfire , 2000. Все права защищены.

Хорошо Сформированный

Другое очень популярное использование JavaScript — проверка формы — проверка данных, введенных в онлайн-форму. В следующем примере я буду использовать DOM и несколько простых JavaScript, чтобы убедиться, что флажок установлен и адрес электронной почты, введенный в текстовое поле, имеет правильный формат. Вот форма:

 <html>  <head>  </head>   <body>   <form action="somescript.cgi" method="post"  onSubmit="return check();">  Email address:  <br>  <input id="email" type="text" name="email" size="30">  <br>  <input id="spam_me" type="Checkbox" name="spam_me">Yes, I  want you to send me megabytes of useless advertisements via  email. I love buying crummy products from people who  probably flunked kindergarten.  <br>  <input type="submit">  </form>   </body>  </html> 

И вот сценарий проверки:

 <script language="JavaScript">   function checkEmail()  {   // get to the field  var obj = document.getElementById("email");   // value of field  var str = obj.value;   // define pattern to match email address  var pattern =  /^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+  (.[a-zA-Z0-9_-]+)+/;   // match the string to the pattern  var flag = pattern.test(str);   if(!flag)  {  alert ("Please enter a valid email address");  return false;  }  else  {  return true;  }   }  function checkSpam()  {  // get to the field  var obj = document.getElementById("spam_me");   // checkbox ticked?  if (obj.checked)  {  return true;  }  else  {  alert ("Please check the box");  return false;  }  }   function check()  {  // perform validation and submit form if all is well  if(checkEmail() && checkSpam())  {  return true;  }  else  {  return false;  }  }   </script> 

Как видите, форма отправляется только после получения положительного ( true ) результата из функции JavaScript check() . Эта функция, в свою очередь, вызывает функции checkEmail() и checkSpam() , которые сначала получают ссылки на их соответствующие элементы формы, а затем проверяют их значения на достоверность.

Copyright Melonfire , 2000. Все права защищены.

В рамке

Также интересно посмотреть, как DOM работает с фреймами. Рассмотрим следующий пример, который устанавливает два фрейма, « left.html » и « right.html ».

 <html>  <head>  </head>   <frameset  cols="20%,*">    <frame name="left" src="left.html" scrolling="auto"    frameborder="no">    <frame name="right" src="right.html"  scrolling="auto"    frameborder="no">  </frameset>   </html> 

Чтобы проиллюстрировать, как перемещаться по фреймам, я собираюсь написать простой скрипт, который меняет цвет фона правого фрейма при щелчке соответствующей ссылки в левом фрейме. Вот правильный кадр,

 <html>  <head>  </head>   <body id="body">  </body>  </html> 

и вот левый кадр — обратите внимание, как каждая ссылка вызывает changeFrameBackground() с цветом в качестве параметра.

 <html>  <head>  </head>   <body>   <a href="javascript:changeFrameBackground('red')">Red</a>  <br>  <a href="javascript:changeFrameBackground('blue')">Blue</a>  <br>  <a href="javascript:changeFrameBackground('green')">Green</a>  <br>  <a href="javascript:changeFrameBackground('black')">Black</a>   </body>  </html> 

Наконец, давайте посмотрим на функцию, которая выполняет всю работу.

  <script language="JavaScript">   var bodyObj = top.right.document.getElementById("body");   function changeFrameBackground(col)  {  bodyObj.setAttribute("bgcolor", col);  }   </script> 

Поскольку это набор фреймов, необходимо добавить префикс вызова метода document.getElementById() со ссылкой на соответствующий фрейм. Этот префикс необходим для определения DOM, какой кадр вызывается, и для получения ссылки на правильное дерево документа.

Как только ссылка на тэг <body> правого фрейма получена, изменение цвета фона фрейма выполняется простым setAttribute() .

Разветвление

DOM также поставляется с набором встроенных методов, предназначенных для управления деревом DOM, добавления и удаления узлов из него на лету. Как вы уже видели, узел в дереве DOM может быть либо HTML-тегом, либо фрагментом текста — и DOM поставляется с методами для добавления обоих этих типов узлов в дерево посредством программного кода.

Я начну с метода createElement() , который используется для создания нового тега HTML. Следующий фрагмент кода создает <img> в качестве узла и присваивает ему имя « imageObj ».

 <script language="JavaScript">  var imageObj = document.createElement("img");  </script> 

После того, как узел создан, ему могут быть присвоены атрибуты с помощью setAttribute() . Например, фрагмент кода

 <script language="JavaScript">  imageObj.setAttribute("src", "logo_n.gif");  imageObj.setAttribute("width", "50");  imageObj.setAttribute("height", "50");  </script> 

эквивалентен тегу

 <img src="logo_n.gif" width="50" height="50"> 

После того, как узел был создан, следующий заказ — добавить его в дерево документов — задача, выполняемая методом appendChild() . Метод appendChild() используется для добавления вновь созданного узла в определенное место в дереве.

Следующий фрагмент кода прикрепит узел « imageObj » как дочерний элемент элемента, идентифицируемого как « heading1 ».

 <script language="JavaScript">  document.getElementById("heading1").appendChild(imageObj);  </script> 

Copyright Melonfire , 2000. Все права защищены.

Dumbing It Down

Точно так же, как вы можете создавать HTML-теги как узлы, DOM также позволяет создавать новые текстовые узлы на дереве с помощью метко названного createTextNode() . Вот пример:

  <script language="JavaScript">  var insultObj = document.createTextNode("Could you *be* any dumber?");  </script> 

Опять же, метод appendChild() вступает в игру, чтобы присоединить новый текстовый узел к соответствующей ветви дерева документа.

 <script language="JavaScript">  document.getElementById("heading1").appendChild(insultObj);  </script> 

Посмотрим, как это получится на примере из реальной жизни. Я собрал простую HTML-страницу, которая не содержит ничего, кроме набора тегов <p> и некоторого кода JavaScript. JavaScript создаст новый текстовый узел и новый <img> и добавит их в дерево документа в качестве дочерних элементов <p> , используя фрагменты кода, которые я только что продемонстрировал.

 <html>  <head>  </head>   <body>   <p id="heading1"></p>   <script language="JavaScript">   // set up the image  var imageObj = document.createElement("img");  imageObj.setAttribute("src", "logo.gif");  imageObj.setAttribute("width", "50");  imageObj.setAttribute("height", "50");  document.getElementById("heading1").appendChild(imageObj);   // set up the text node  var insultObj = document.createTextNode("Could you *be* any dumber");  document.getElementById("heading1").appendChild(insultObj);   // use this for testing  var pObj = document.getElementById("heading1");   // returns IMG  // alert (pObj.childNodes[0].nodeName);   // returns #text  // alert (pObj.childNodes[1].nodeName);   </script>   </body>  </html> 

Хотя страница содержит только один <p> , запуск сценария добавит <img> и строку текста в дерево документа, которое будет сразу же видно в браузере.

Конечно, DOM поставляется с кучей других методов — вот краткий список, вместе с объяснением их функции.

  • removeNode() — удаляет узел (и / или все его дочерние removeNode() ) из дерева документа
  • replaceNode() — заменить узел другим узлом
  • cloneNode() — дублировать существующий узел
  • swapNode() — поменять местами позиции двух узлов в дереве документа
  • insertBefore() — вставляет узел в определенную точку дерева документа

Большинство из них говорят сами за себя, и они используются не так часто, поэтому я не планирую обсуждать их подробно — они включены сюда для полноты картины.

Выводы

Если вы хотите узнать больше о DOM, вам будет доступен ряд ресурсов в Интернете. Вот краткий список:

Официальные спецификации W3C DOM, http://www.w3.org/DOM/

Ресурсы для разработчиков Mozilla.org: http://www.mozilla.org/docs/ и

http://www.mozilla.org/docs/web-developer/

Пример кода DOM по адресу http://www.mozilla.org/docs/dom/samples/

Интересная статья о переходе от проприетарных DOM к стандарту W3C, на http://sites.netscape.net/ekrockhome/standards.html

Структурное (логическое) представление DOM по адресу http://www.xml.com/1999/07/dom/xml_dom.gif

XML введение в DOM, по адресу http://www.xml101.com/dom/

И, прежде чем я уйду, последний комментарий. Хотя новый DOM может показаться гораздо менее гибким и простым в использовании, чем те, к которым привыкли разработчики патентованных моделей, факт остается фактом: он предлагает одно очень важное преимущество: стандартизацию. Этот DOM был написан таким образом, что каждый элемент на странице наконец доступен для разработчика через стандартные правила навигации и может управляться с помощью стандартных методов и свойств объекта.

В краткосрочной перспективе может быть трудно — даже сложно — перекодировать веб-страницы в соответствии с новым DOM; Тем не менее, я считаю, что эти усилия стоит потратить, поскольку они сразу же гарантируют, что ваши страницы будут доступны для просмотра во всех браузерах, соответствующих стандартам. Следует отметить, что большая часть путаницы в прошлом (и в результате обилие проприетарных интерфейсов DOM) была вызвана отсутствием четкого руководства со стороны W3C; Теперь, когда спецификация DOM была завершена и выпущена, будущие версии всех основных браузеров должны полностью ее поддерживать, и мы надеемся, что мы увидим конец несовместимости браузеров, которая преследовала разработчиков в прошлом.

Здесь надеемся!

Примечание. Все примеры в этой статье были протестированы на Mozilla (сборка 18). Примеры являются только иллюстративными и не предназначены для производственной среды. YMMV!
Copyright Melonfire , 2000. Все права защищены.