
Активный участник

Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012
Откуда: Украина, Львов
Помог: 127 раз(а)

|
Решил все же написать небольшой туториал по JavaScript. А точнее несколько основных функций часто используемых в jQuery.
Наверное всех интересует что скрывается за магической функцией $. вот что
CODE ( javascript):
скопировать код в буфер обмена
function select(selector, context){ if(!selector) return []; if(selector === 'body' && !context && document.body) return [document.body]; else if(selector.nodeType) return [selector]; else if(typeof selector === 'string'){ var context = context || document; return Array.prototype.slice.call(context.querySelectorAll(selector)); } else { return []; } }
В результате мы получим массив из элементов. Использовать приблизительно можно так
select('#id .classname tagname');
Что же теперь имея набор элементов нужно его обойти. Для этого напишем нашу функцию each
CODE ( javascript):
скопировать код в буфер обмена
var each = (function(){ var foreach = Array.prototype.forEach || function (callback, thisArg) { var T, k; if (this == null) { throw new TypeError(' this is null or not defined'); } var O = Object(this); var len = O.length >>> 0; if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } if (arguments.length > 1) { T = thisArg; } k = 0; while (k < len) { var kValue; if (k in O) { kValue = O[k]; callback.call(T, kValue, k, O); } k++; } }; return function(array, callback){ foreach.call(array, callback); } })();
Вызов примерно такой
дальше нужно как-то вешать события на эти элементы. Но перед этим как описать функцию on я опишу проблему с получением объекта event в callback функции
CODE ( javascript):
скопировать код в буфер обмена
function fixEvent(e) { e = e || window.event; e.target = e.target || e.srcElement; if(!e.preventDefault) { e.preventDefault = function() { e.returnValue = false; } } if(!e.stopPropagation) { e.stopPropagation = function() { e.cancelBubble = true; } } return e; }
Данная функция в первую очередь предназначена для старых версий IE. Вот сама функция on
CODE ( javascript):
скопировать код в буфер обмена
function on(el, type, filter, callback) { if(!callback){ callback = filter; filter = false; } var fn = function(event) { event = fixEvent(event); var element = filter ? delegate(el, filter, event.target) : this; if(element) callback.call(element, event); delete element; }; if(document.addEventListener) el.addEventListener(type, fn, false); else if(document.attachEvent) el.attachEvent('on' + type, fn); else el['on' + type] = fn; }
Здесь есть еще один параметр filter для делегирования событий как в jQuery. Если его указать, то вызывается функция delegate. Вот ее код
CODE ( javascript):
скопировать код в буфер обмена
function delegate(el, filter, target){ var finded = el.querySelectorAll(filter); var i, l = finded.length; for(i = 0; i < l; i++) { if(finded[i].contains(target)) return finded[i]; } return false; }
Пример вызова
CODE ( javascript):
скопировать код в буфер обмена
on(document, 'click', 'input', function(e){ e.preventDefault(); e.stopPropagation(); console.log(e.value); });
Функцию удаления элемента
Функция очистки элемента
Вот 3 функции для работы с классом элемента. По названиям можно узнать что они выполняют
CODE ( javascript):
скопировать код в буфер обмена
function hasClass(el, name) { if(el.classList) { return el.classList.contains(name); } else { return new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)").test(el.className); } } function addClass(el, name) { if(!hasClass(el, name)) { if (el.classList) { el.classList.add(name); } else { el.className = el.className ? [el.className, name].join(' ') : name; } } } function removeClass(el, name) { if(hasClass(el, name)) { if (el.classList) { el.classList.remove(name); } else { var c = el.className; el.className = c.replace(new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)", "g"), ""); } } }
Довольно часто нужно обрабатывать data-* атрибуты. Вот простая функция которая умеет работать с ними
CODE ( javascript):
скопировать код в буфер обмена
function data(el, name, value){ if(typeof value != 'undefined') { if(el.dataset) el.dataset[name] = value; else el.setAttribute('data-' + name, value); } else { if(el.dataset) return el.dataset[name]; else return el.getAttribute('data-' + name); } }
Пример вызова
Также часто нужно получить отца элемента по селектору (функция closest)
CODE ( javascript):
скопировать код в буфер обмена
function matchesSelectorIe8(selector) { var elems = this.parentNode.querySelectorAll(selector), count = elems.length; for(var i = 0; i < count; i++) { if(elems[i] === this) { return true; } } return false; } function closest(elem, selector) { var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector || matchesSelectorIe8; while(elem) { if(matchesSelector.call(elem, selector)) { return elem; } else { elem = elem.parentElement; } } return false; }
На данный момент все. Надеюсь кому-то пригодится
|