Skip to content

Instantly share code, notes, and snippets.

@Dionid
Created October 28, 2015 18:25
Show Gist options
  • Save Dionid/c8244bccabb5506ab3ac to your computer and use it in GitHub Desktop.
Save Dionid/c8244bccabb5506ab3ac to your computer and use it in GitHub Desktop.
JQuery light functions
window.$ =
# Получаем элемент по селектору
# Если родитель не передан - родителем является document
$: (root, selector) ->
if arguments.length is 1
selector = root
root = document
# Если передали не селектор, а Node - возвращаем его же
return selector if $.isNode(selector)
# массив или NodeList - возвращаем первый элемент из списка
if $.isArray(selector)
if selector.length
return selector[0]
return undefined
# Если селектор не строка - ошибка
throw TypeError("Selector is not a string") unless $.isString(selector)
return root?.querySelector selector
# Получаем все элементы по селектору
# Если родитель не передан - родителем является document
$$: (root, selector) ->
if arguments.length is 1
selector = root
root = document
# Если передали не селектор, а Node
# - возввращаем массив с единственным элементов
return [selector] if $.isNode(selector)
# массив или NodeList - возвращаем его же
return selector if $.isArray(selector)
# Если селектор не строка - ошибка
throw TypeError("Selector is not a string") unless $.isString(selector)
root?.querySelectorAll selector
# is string
isString: (string) -> typeof string is 'string'
# is Array or NodeList
isArray: (list) ->
list? and ((list instanceof NodeList) or Array.isArray(list))
# is Node
isNode: (node) -> node? and (node instanceof Node)
# Приводим аргументы в массив
argsToArray: (args) -> Array.prototype.slice.call(args)
# Аналог jQuery(document).ready()
ready: (callback) ->
document.addEventListener 'readystatechange', ->
callback?() if document.readyState is "complete"
# Вешаем обработчик (handler) события (event)
# - на элемент - если передан конкретный элемент
# - на элемент - если передан селекторв, возвращающий один элемент
# - на несколько элементов - если передано несколько элементов
# - на несколько элементов - если передан селектор, возвращающий список
# элементов
on: (element, event, handler) ->
for el in $.$$(element)
el?.addEventListener event, handler, false
# Удаляем обработчик события
# См. $.on()
off: (element, event, handler) ->
for el in $.$$(element)
el?.removeEventListener event, handler, false
# Прогулка по DOM-дереву
# Если передан селектер - вернет родителя по селектору или null
# Если селектор не передан - вернет родителя
parent: (element, selector) ->
return $.$(element)?.parentNode unless selector
_has = (collection, el) ->
for e in collection
return true if e is el
return false
all = $.$$(selector)
cur = $.parent(element)
while cur and !_has(all, cur)
cur = $.parent(cur)
return cur
# Аттрибуты
# Существует класс у элемента
# (или первого элемента в стеке)
hasClass: (element, className) ->
element = $.$(element)
return false if !element
return " #{element.className} "
.replace(/[\n\t]/g, " ")
.indexOf(" #{className} ") >= 0
# Добавляем класс ко все элементам
addClass: (element, className) ->
elements = $.$$(element)
for element in elements
unless $.hasClass(element, className)
element?.className =
"#{element.className} #{className}"
.replace(/\s+/g, " ")
.trim()
# Удаляем класс у всех элементов
removeClass: (element, className) ->
elements = $.$$(element)
re = new RegExp("(^|\\s)#{className}(\\s|$)", "g")
for element in elements
element?.className =
element.className
.replace(re, "$1")
.replace(/\s+/g, " ")
.trim()
# Переключаем класс
toggleClass: (element, className) ->
args = $.argsToArray(arguments)
if $.hasClass(element, className)
$.removeClass(element, className)
else
$.addClass(element, className)
# Элемент виден или нет
isVisible: (element) ->
window.getComputedStyle($.$(element))?.display is none
# Высота элемента включая маргины
outerHeight: (element) ->
element = $.$(element)
compStyle = getComputedStyle(element)
marginTop = parseFloat(compStyle.marginTop)
marginBottom = parseFloat(compStyle.marginBottom)
element.offsetHeight + marginTop + marginBottom
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment