Created
October 28, 2015 18:25
-
-
Save Dionid/c8244bccabb5506ab3ac to your computer and use it in GitHub Desktop.
JQuery light functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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