Библиотека написана на CoffeeScript


Итак, я написал небольшую библиотеку для быстрого здании Дом с API, специально для в CoffeeScript

Я чувствую, что общий код может быть сделано лучше/меньше/быстрее.

Я тоже не особо рады несколько функций, а именно:

  # Parses out css classes and id from string like:
  #   p#warning.big.yellow # => p   # attr {"id": "warning", "class": ['big', 'yellow']}
  #   #container           # => div # attr {"id": "container"}
  # @returns node name (e.g. "span")
  dotHashRe = /[.#]/
  parseElem = (elem, attr) ->
    return elem unless dotHashRe.test elem
    attr['class'] ||= []
    attr['class'] = [attr['class']] if typeof attr['class'] == 'string'
    elem     = "div#{elem}" if dotHashRe.test(elem.charAt(0))
    pieces   = elem.split(dotHashRe)
    elemType = pieces.shift()
    pos      = elemType.length
    classes  = attr['class']
    for piece in pieces
      if elem.charAt(pos) == '#'
        attr['id'] = piece
      else 
        classes.push(piece)
      pos += piece.length + 1
    delete attr['class'] unless attr['class'].length
    elemType

Это быстро, но, похоже, код можно сделать намного лучше

Библиотека (~100 ЛОК с комментариями): https://github.com/glebm/DOMBrew/blob/master/dombrew.js.coffee

С нетерпением жду предложений! :)



826
3
задан 23 июля 2011 в 08:07 Источник Поделиться
Комментарии
1 ответ

Куча случайных наблюдений. Я бы переосмыслить подход "классы". Я бы начал с что-то вроде

classes = attr['class'] || []
classes = [classes] if typeof classes == 'string'

А потом писать или удалить его в конце.

Создание hashStartRe

hashStartRe = /^[.#]/
elemType = if hashStartRe.test elem then "div" else pieces.shift()

Вероятно, будет быстрее, чем нынешние рерайтинг и называть Элем.используя метод charat(0). Это определенно легче читать. Однако, это вызывает проблемы с "терминал". (Проблемы Solveable, но вы должны быть осторожны.)

На данный момент, большой вопрос, Хотите ли вы разрешить несколько идентификаторов и идентификаторов, которые не находятся в переднем положении. Если вы ограничиваете ваше внимание на#идентификатор.класс1.class2 и не обрабатывать.класс1#типа id1#ID2, которое можно упростить, а также для петли.

Конечная точка эффективности, так как регулярные выражения так быстро на современных браузерах, вы можете хотеть рассмотреть, используя регулярное выражение /(.#)([^.#)+)/ чтобы сделать ваш разбор. Но вам нужно сесть и делать правильный анализ был быстрее. Мое чутье подсказывает, что это будет.

3
ответ дан 4 августа 2011 в 09:08 Источник Поделиться