<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>11.1 Навигация по DOM в ExtJS</title>
    <meta name="css" content="/doc/ext/ext_examples.css"/>
    <meta name="js" content="/js/EXT4/ext-all.js;/doc/ext/150.js"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="62"/>
    <link rel="stylesheet" type="text/css" href="/doc/ext/ext_examples.css"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / 11.1 Навигация по DOM в ExtJS</h1>
          <ol class="tags big">
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <div class="myContent"><p>
  Этот раздел - одно из немногих исключений в ExtJS, который вызвал
  полное непонимание. После jQuery или Prototype здесь все кажется
  сделаным через через ж.. А может и не кажется, а так и есть на
  самом деле.<br/>
</p>
<p>
  jQuery, который теперь не знает только ленивый использует для
  навигации по DOM простой и лаконичный синтаксис, например:
</p>
<pre class="brush: js">
  var ex=$('#ex1');
</pre>
<p>
  Результатом этой операции в jQuery является не объект DOM, а
  объект jQuery, в котором инкапсулированы и сам DOM-элемент и
  методы и свойства для манипуляции этим объектом. Например -
  кроссброузерная установка атрибутов (ID, class, style…) установка
  и получения параметров элемента (height, width, visibility…) и
  т.д. Отчасти в четкой и ясной навигации по DOM кроется один из
  секретов популярности jQuery. В ExtJS все то же самое предельно
  запутано и неудобно.
</p>
<p>
  Для того чтобы получить набор узлов DOM, в ExtJS используется не
  одна функция, а целая куча всякого говна. И результат этих
  функций - несколько разных объектов ExtJS, или наборы
  DOM-элементов. Еще одна особенность ExtJS - то что большинство
  объектов и методов имеют разные варианты написания. Иногда это
  просто синонимы, а иногда они методы и объекты с дополнительными
  параметрами и свойствами.
</p>
<p>
  Ниже приведу сводку методов.
</p>
<table>
  <tbody>
    <tr>
      <td style="width:30%">
        <strong>Методы</strong>
      </td>
      <td>
        <strong>параметры</strong>
      </td>
      <td>
        <strong>результат</strong>
      </td>
    </tr>
    <tr>
      <td style="width:30%">
         Ext.get(el)<br/>
         Ext.fly(el)
      </td>
      <td>
        el - ID или DOM-элемент
      </td>
      <td>
        Объект Ext.core.Element
      </td>
    </tr>
    <tr>
      <td>
         Ext.select(selector)<br/>
         Ext.core.Element.select(selector, unique, root)
      </td>
      <td>
        <span id="ext-gen">selector</span> - строковое значение
        CSS/XPath-селектора,<br/>
        или массив значений CSS/XPath-селекторов
      </td>
      <td>
        Объект Ext.CompositeElementLite<br/>
        или Ext.CompositeElement
      </td>
    </tr>
    <tr>
      <td>
         Ext.query(selector)<br/>
         Ext.DomQuery.select(selector,root)
      </td>
      <td>
        <span id="ext-gen2">selector</span> - строковое значение
        CSS/XPath-селектора,<br/>
        или массив значений CSS/XPath-селекторов
      </td>
      <td>
        Массив DOM-узлов
      </td>
    </tr>
    <tr>
      <td>
         Ext.getBody(),Ext.getDoc(), Ext.getHead()
      </td>
      <td>
         -
      </td>
      <td>
        Метод позволяет получить Body, Document, Head как объект
        Ext.core.Element
      </td>
    </tr>
    <tr>
      <td>
         Ext.getDom(el)
      </td>
      <td>
        el - ID или DOM-элемент
      </td>
      <td>
        DOM-узел
      </td>
    </tr>
  </tbody>
</table>
<p>
   Ext.core.Element (он же Ext.Element) - объект в котором
  инкапсулирован DOM и набор методов для манипуляции с ними.
  Фактически это основной метод работы с DOM
</p>
<p>
   Ext.CompositeElementLite и Ext.CompositeElement - еще один
  класс, в котором согласно документации инкапсулировано, то же что
  и Ext.core.Element.
</p>
<p>
  На всякий случай. Все примеры на этой странице вызываются по
  готовности DOM. Код ниже
</p>
<pre class="brush: js">
&lt;script&gt; Ext.onReady(function(){   // Выполнить аргумент - функцию по готовности DOM. 
});
&lt;/script&gt;
</pre>
<h2>
  1 Ext.get
</h2>
<p>
   1.1 Ext.get позволяет определить елемент DOM и полуцчить
  сообтветствующий ему Ext.core.Element пo id. Пример и код см.ниже
</p>
<div id="ex1" class="domexample"/>
<pre>
var ex1 = Ext.get('ex1');   // Выделили DOM-элемент с id=ex1 <br/>ex1.createChild('&lt; div&gt;Ex1&lt; /div&gt;');    // Разместили в нем HTML
</pre>
<p>
  Что произошло?<br/>
  <strong>А.</strong> Методом get() нашел элемент с id=«ex1» (он
  над примером кода, подсвечен срым цветом) и создал новый объект
  <u class="external" title="ext/ext4/docs/index.html#/api/Ext.core.Element-method-insertHtml">
   Ext.Element</u>, в котором находится и сам элемент DOM и
  дполнительно инкапсулировано около сотни методов и свойств для
  манипуляции с ним.<br/>
  <strong>В.</strong> Забегая вперед, для иллюстрации примеров
  исползовал метод createChild объекта Ext.Element, который
  добавляет в найденный элемент HTML-код. При создании дочернего
  элемента ExtJS сгенерировал ID и добавил ID к созданому дочернему
  ID. Для красоты в реальном JS я подсветил красным цветом то что
  вставялется динамически.
</p>
<p>
   1.2 Точно так же в get в качестве параметров можно добавить и
  DOM-елемент.
</p>
<div id="ex2" class="domexample"/>
<pre>
Ext.get(document.getElementById('ex2')).createChild('&lt;div&gt;Ex2&lt;/div&gt;');
</pre>
<h2>
  2 Ext.select
</h2>
<p>
  Этот метод отдаленно похож на метод навигации в jQuery. Он
  позволяет получить объект Ext.CompositeElement по CSS/Xpath 
  -селектору заданному строкой. Ниже я приведу то что совпадает в
  обоих библиотеках. Т.е. получение по CSS/Xpath-селекторам объекта
  ExtJS.Element, с которым можно проводить какие-то дальнейшие
  манипуляции. Все остальное придется вынести в отдельную часть.
</p>
<blockquote class="domexample">
  <p>
    blockquote:
  </p>
</blockquote>
<pre class="brush: js">
Ext.select('blockquote').createChild('select by tag «blockquote»');. .. .. .. ..
</pre>
<blockquote>
  <p>
    blockquote:
  </p>
</blockquote>
<div class="ex4 domexample">
   div.ex4:
</div>
<pre class="brush: js">
Ext.select('.ex4').createChild('select by class «ex4»');. .. .. .. ..
</pre>
<div class="ex4">
   div.ex4:
</div>
<div id="ex4" class="domexample">
  div#ex4:
</div>
<pre class="brush: js">
 Ext.select('#ex4').createChild('select by id «ex4»');
…….
</pre>
<div id="ex4">
  div#ex4:
</div>
<div id="ex8" class="domexample">
  <div id="ex81" class="domexample">
    ex81
  </div>
</div>
<pre class="brush: js">
 Ext.select('#ex8 div').createChild('select    #ex8 div ');. .. .. .. ..
</pre>
<div id="ex8" class="domexample">
  <div id="ex81" class="domexample">
    ex81
  </div>
</div>
<p>
  Метод Ext.select позволяет использовать селекторы CSS2-CSS3,
  анаолгично jQuery и до кучи имеет собственные методы выборки.
  Приведу их без проверки, в надежде что меня не обманули
</p>
<pre class="brush: js">
 Ext.select('span &gt; b'); // выборка всех  элементов b явл. прямыми потомками span
</pre>
<pre class="brush: js">
 Ext.select('span + b'); // выборка всех  элементов b перед которыми стоит span
</pre>
<pre class="brush: js">
 Ext.select('div:first');          // выборка первого div
</pre>
<pre class="brush: js">
 Ext.select('div:last');           // выборка последнего div
</pre>
<pre class="brush: js">
 Ext.select('div:even');           // выборка четных div
</pre>
<pre class="brush: js">
 Ext.select('div:odd');            // выборка нечетных div
</pre>
<pre class="brush: js">
 Ext.select('div[title]');         // выборка всех div с атрибутом title
</pre>
<pre class="brush: js">
 Ext.select('div[title='bar']');   // выборка всех div с атрибутом title=my
</pre>
<pre class="brush: js">
 Ext.select('div[title!='bar']');  // выборка всех div с атрибутом title не равного 'bar'
</pre>
<pre class="brush: js">
 Ext.select('div[title^='bar']');  // выборка всех div с атрибутом title начинающихся с 'bar'
</pre>
<pre class="brush: js">
 Ext.select('div[title$='my']');   // выборка всех div с атрибутом title заканчивающихся на 'bar'
</pre>
<pre class="brush: js">
 Ext.select('div[title*='my']');   // выборка всех div с атрибутом title содержащим 'bar'
</pre>
<pre class="brush: js">
 Ext.select('input:checked]');     // выборка всех input c checked = true
</pre>
<pre class="brush: js">
 Ext.select('div{display=none}');  // выборка всех div с CSS-стилем display=none
</pre>
<pre class="brush: js">
 Ext.select('div{display!=none}'); // выборка всех div с CSS-стилем display!=none
</pre>
<pre class="brush: js">
 Ext.select('div{height%=2}');     // выборка всех div с CSS-стилем в котором высота делится на два
</pre>
<pre class="brush: js">
 Ext.select('div:not(form)')              // выборка div, не содержащих формы
</pre>
<pre class="brush: js">
 Ext.select('div:has(a)')            // выборка div, содержащих ссылку
</pre>
<pre class="brush: js">
 Ext.select('input:checked')           // выборка включенных чекбоксов
</pre>
<p>
  Полностью можно найти <u class="external" title="ext/ext4/docs/index.html#/api/Ext.DomQuery">в
  документации</u>
</p>
<h2>
   3. Ext.fly
</h2>
<p>
  Метод Ext.fly аналогичен методу Ext.get), с той разницей что он
  оптимизирован под сборку мусора. Разработчики рекомендуют
  использовать его в тех случаях, когда нет необходимости в
  многократном использовании полученного элемента DOM
</p>
<div id="ex5" class="domexample">
  div#ex5:
</div>
<pre class="brush: js">
Ext.fly('ex5').createChild('select by id «ex5»');
…….
</pre>
<div id="ex5">
  div#ex5:
</div>
<p>
  Для метода select можно организовать то же самое, но для этого
  нужно указать дополнительный параметр <u class="external" title="ext/ext4/docs/index.html#/api/Ext.core.Element-method-select">
  unique</u>.
</p>
<h2>
   4. Ext.query
</h2>
<p>
  Этот метод аналогичен select, но на выходе выдает не объект
  Ext.Element, а набор DOM-элементов
</p>
<div class="domexample ex20"/>
<div class="domexample ex20"/>
<pre class="brush: js">
var ex20=Ext.query('.ex20');
for (var i in ex20) ex20[i].innerHTML='&lt;strong&gt;.ex20'+i+'&lt;/strong&gt;';
…….

</pre>
<div class="ex20"/>
<div class="ex20"/>
<h2>
   5. getBody,getDoc, getHead
</h2>
<p>
  Все это даю без тестовых примеров:
</p>
<ul>
  <li>Ext.getBody() - возвращает body как Ext.Element
  </li>
  <li>getDoc() - возвращает весь документ как Ext.Element
  </li>
  <li>getHead() - возвращает head как Ext.Element
  </li>
  <li>getDom(param) - возвращает узел (node) DOM, и принимает на
  входе - id, DOM, Ext.Element
  </li>
</ul>
<h2>
   6. getDom
</h2>
<p>
  getDom(param) - возвращает узел DOM, и принимает на входе - id,
  DOM, Ext.Element
</p>
<h2>
  Далее
</h2>
<ol>
  <li>
    <a href="/63.htm">Навигация по DOM. Часть 2</a>
  </li>
  <li>
    <a href="/64.htm">Манипуляции с DOM. Часть 1. Установка/чтение
    стилей, классов, атрибутов</a>
  </li>
  <li>
    <a href="/65.htm">Манипуляции с DOM. Часть 2.
    Добавление/удаление и пр. операции с узлами</a>
  </li>
</ol></div>
          <ol class="tags big">
            <li class="date">2011-12-11</li>
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>docs.sencha.com/ext-js/4-0/#!/api/Ext.DomQuery</span> - <b>API Ext.DomQuery</b></a>
            </li>
            <li>
              <a href="#"><span>www.quizzpot.com/2009/04/getting-to-know-the-object-element/</span> - <b>quizzpot.com Getting to know the object Element</b></a>
            </li>
            <li>
              <a href="#"><span>www.sencha.com/learn/domquery-v11-basics/</span> - <b>sencha.com DomQuery v1.1 Basics</b></a>
            </li>
          </ol>
          <ul class="comment"/>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

