Показать сообщение отдельно
  #3 (permalink)  
Старый 23.08.2015, 19:37
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

жаль раньше этого не читал - Внутреннее устройство поисковых методов
PS: маленький но продуктивный поиск по селекторам
sel('div', sel('#root'))

(function(window, document) {
  function classOnly_find(klass, root) { // самый продуктывный поиск по класу, не учитывая getElementsByClassName, взял с yass и модифицировал
    try {
      return root.querySelectorAll('.' + selector)
    } catch (e){}

	klass = ' ' + klass + ' '

    var nodes = root.getElementsByTagName('*'),
      i = 0,
      node,
      sets = [],
      idx = 0

    while (node = nodes[i++]) {
      if ((' ' + node.className + ' ').indexOf(klass) != -1) {
        sets[idx++] = node
      }
    }

    return idx ? sets : []
  }

  function sort_elem(elems) { // сортировка елементов
    return Array.prototype.slice.call(elems)
  }

  window.sel = function(selector, root) {
    var root = root || document,
      elem = 0,
      tmp_selector = 0,
      classOnly = /^\.([\w\-]+)$/,
      idOnly = /^#([\w\-]+)$/,
      tagOnly = /^([\w\-]+)$/

    if (classOnly.test(selector)) {
      tmp_selector = selector.slice(1)
      try {
        elem = root.getElementsByClassName(tmp_selector)
        return elem.length ? sort_elem(elem) : []
      } catch (e) {
        return sort_elem(classOnly_find(tmp_selector, root))
      }
    }

    if (idOnly.test(selector)) {
      tmp_selector = selector.slice(1)
      elem = [root.getElementById(tmp_selector)]
      return elem.length ? sort_elem(elem) : []
    }

    if (tagOnly.test(selector)) {
      elem = root.getElementsByTagName(selector)
      return elem.length ? sort_elem(elem) : []
    }

    elem = root.querySelectorAll(selector)
    return elem.length ? sort_elem(elem) : []
  }
})(window, document)
Ответить с цитированием