23.11.2018, 22:33
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
Просмотрела исходик jQuery Откорректируйте где не верно
Приветствую. Изучаю javascript и пытаюсь понять как работает jQuery. Прошу поправить мои комментарии к релизу версии 1.12. (из-за поддержки старых IE) в случае неверного истолкования.
jQuery JavaScript Library v1.12.4
Обозначения в комментариях:
-"Количество вызовов" = количество вызовов в других местах исходника
-"..." = см. исходник
Код значительно урезан с соблюдением исходной последовательности и синтаксиса, крупные блоки оставленные в оригинале если непрокомментированы
Исходный код
Разбиваю на несколько сообщений, целиком не пропускает
// 1. Мгновенно вызываемая функция (IIFE)
(function( global, factory ){определение модуля}(модуль))
// 1.1. Определение модуля
if ( typeof module === "object" && typeof module.exports === "object" ) { //... }
// 1.2. Модуль
typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
"use strict";
// Количество вызовов: 9
var deletedIds = [];
// Без комментариев
var document = window.document;
var slice = deletedIds.slice;
var concat = deletedIds.concat;
var push = deletedIds.push;
var indexOf = deletedIds.indexOf;
// Class2type карта. Количество вызовов: 4
var class2type = {};
// Количество вызовов: 2
var toString = class2type.toString;
// Количество вызовов: 6. У Sizzle своя переменная hasOwn
var hasOwn = class2type.hasOwnProperty;
/* Объект с информацией об особенностях текущего браузера. Количество вызовов: 74. У Sizzle своя переменная support */
var support = {};
var
// Количество вызовов: 2
version = "1.12.4",
/* Основная функция. Функция-конструктор, создающая в памяти браузера копию (экземпляр)
базового объекта - объект jQuery. Количество вызовов: 744 */
jQuery = function( selector, context ){return new jQuery.fn.init( selector, context );},
// Количество вызовов: 2. У Sizzle своя переменная rtrim
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// Количество вызовов: 1
rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi,
// Камелизация. Количество вызовов: 1
fcamelCase = function( all, letter ) { return letter.toUpperCase(); };
// Для освобождения памяти от дубликатов методов. Количество вызовов: 39
jQuery.fn = jQuery.prototype = { /* определение свойств экземпляра jQuery в свойстве prototype конструктора объекта jQuery */ };
// Количество вызовов: 30
jQuery.extend = jQuery.fn.extend = function() { /* функция extend() - реализация extends (JS), наследование */ };
jQuery.extend( { /* добавление следующих свойств в объект jQuery: expando, isReady, error, noop, isFunction, isArray, isWindow, isNumeric,
isEmptyObject, isPlainObject, type, globalEval, camelCase, nodeName, each, trim, makeArray, inArray, merge, grep, map, guid, proxy, now,
support */ } );
// Анализатор кода JSHint
/* jshint ignore: start */
if ( typeof Symbol === "function" ) {
jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
}
/* jshint ignore: end */
// Заполнение class2type карты
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } );
// Функция, определяющая является ли объект массивом. Количество вызовов: 3
function isArrayLike( obj ) { //... }
// Количество вызовов: 6, не включая Sizzle.js
var Sizzle = (function( window ) { /* Sizzle - кросс-браузерный движок селекторов */ })( window );
// Количество вызовов: 10
jQuery.find = Sizzle;
// Количество вызовов: 12
jQuery.expr = Sizzle.selectors;
// Количество вызовов: 0
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
// Количество вызовов: 3
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
// Количество вызовов: 2
jQuery.text = Sizzle.getText;
// Количество вызовов: 4
jQuery.isXMLDoc = Sizzle.isXML;
// Количество вызовов: 12
jQuery.contains = Sizzle.contains;
// Функция проверки dir()-проверка на наличие в результатах иных элементов, кроме DOM
Количество вызовов: 6. У Sizzle своя переменная dir
var dir = function( elem, dir, until ) { //... };
// Функция выбора потомков siblings(). Количество вызовов: 2
var siblings = function( n, elem ) { //... };
// Количество вызовов: 2
var rneedsContext = jQuery.expr.match.needsContext;
var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
// Количество вызовов: 1
var risSimple = /^.[^:#\[\.,]*$/;
// Количество вызовов: 3
function winnow( elements, qualifier, not ) { /* функция-фильтр winnow() - реализация js-функции filter() */ }
// Количество вызовов: 4
jQuery.filter = function( expr, elems, not ) { /* метод .filter()-реализация js-функции filter() */ };
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: find, filter, not, is */ } );
// Главная ссылка на корневой jQuery(document). Количество вызовов: 3
var rootjQuery,
// Проверка HTML строк. Количество вызовов: 3
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
// Количество вызовов: 5
init = jQuery.fn.init = function( selector, context, root ) { /* функция init() */ };
// Придание функции init свойства prototype конструктора объекта jQuery для последующего создания экземпляра. Количество вызовов: 1
init.prototype = jQuery.fn;
// Инициализация главной ссылки
rootjQuery = jQuery( document );
// Количество вызовов: 1
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
// Методы jQuery, гарантирующие создание уникального набора. Количество вызовов: 1
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: has, closest, index, add, addBack */ } );
// Функция выборки потомков sibling(). Количество вызовов: 2
function sibling( cur, dir ) { //... }
// Количество вызовов: 29
jQuery.each( { /* перебирающая функция jQuery.each() */ };
// Количество вызовов: 10
var rnotwhite = ( /\S+/g );
/* Функция преобразования строчно-отформатированных опций в объектно-отформатированные.
Количество вызовов: 1 */
function createOptions( options ) { //... }
// Количество вызовов: 5
jQuery.Callbacks = function( options ) { функция jQuery.Callbacks() }
jQuery.extend( { /* добавление следующих свойств в объект jQuery: Deferred, when(Deferred helper) */ } );
// Deferred, используемая в DOM, готовность. Количество вызовов: 4
var readyList;
// Количество вызовов: 0
jQuery.fn.ready = function( fn ) {
// Добавление функции обратного вызова
jQuery.ready.promise().done( fn );
return this;
};
jQuery.extend( { /* добавление следующих свойств в объект jQuery: readyWait, holdReady, ready */ } );
// Функция очистки для готовых событий DOM. Количество вызовов: 0
function detach() { //... }
// Обработчик готовых событий. Количество вызовов: 0
function completed() { //... }
// Количество вызовов: 2
jQuery.ready.promise = function( obj ) { /* jQuery.ready.promise() - метод самоочистки */ };
// Удаляем проверку готовности DOM даже если пользователь этого не делал
jQuery.ready.promise();
// Повторение свыше унаследованных свойств объекта вплоть до его собственных
var i;
for ( i in jQuery( support ) ) { break; }
support.ownFirst = i === "0";
/* Примечание: Большинство тестов поддержки определены в их соответствующих модулях. False до запуска теста. Количество вызовов: 2 */
support.inlineBlockNeedsLayout = false;
jQuery( function() { /* исполнение «как можно скорее» в случае если нужно установить body.style.zoom */ } );
( function() {
var div = document.createElement( "div" );
// Support: IE<9
support.deleteExpando = true;
try {
delete div.test;
} catch ( e ) {
support.deleteExpando = false;
}
// Null elements to avoid leaks in IE.
div = null;
} )();
// Проверка данных. Количество вызовов: 5
var acceptData = function( elem ) { //... };
// Количество вызовов: 1
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash = /([A-Z])/g;
// Подготовка данных для метода .data(). Количество вызовов: 2
function dataAttr( elem, key, data ) { //... }
// Проверка объекта кэша на пустоту. Количество вызовов: 3
function isEmptyDataObject( obj ) { //... }
// Количество вызовов: 2
function internalData( elem, name, data, pvt ) { /* правила обработки данных */ }
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: data, removeData */ } );
jQuery.extend( { /* добавление следующих свойств в объект jQuery: queue, dequeue, _queueHooks */ } );
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: queue, dequeue, clearQueue, promise */ } );
( function() {
var shrinkWrapBlocksVal;
support.shrinkWrapBlocks = function() {
if ( shrinkWrapBlocksVal != null ) { return shrinkWrapBlocksVal; }
shrinkWrapBlocksVal = false;
var div, body, container;
body = document.getElementsByTagName( "body" )[ 0 ];
if ( !body || !body.style ) { return; }
div = document.createElement( "div" );
container = document.createElement( "div" );
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;
left:-9999px";
body.appendChild( container ).appendChild( div );
if ( typeof div.style.zoom !== "undefined" ) {
div.style.cssText =
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
"box-sizing:content-box;display:block;margin:0;border:0;" +
"padding:1px;width:1px;zoom:1";
div.appendChild( document.createElement( "div" ) ).style.width = "5px";
shrinkWrapBlocksVal = div.offsetWidth !== 3;
}
body.removeChild( container );
return shrinkWrapBlocksVal;
};
} )();
|
|
23.11.2018, 22:37
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
продолжение №1
// Количество вызовов: 3
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
// Количество вызовов: 7
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
// Функция, которая определяет виден ли элемент. Количество вызовов: 5
var isHidden = function( elem, el ) { //... };
// Функция обработки различных разрешений экрана. Количество вызовов: 2
function adjustCSS( elem, prop, valueParts, tween ) { //... }
// Количество вызовов: 7
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { /* функция получения и установления значений коллекции */ }
// Количество вызовов: 3
var rcheckableType = ( /^(?:checkbox|radio)$/i );
// Количество вызовов: 2
var rtagName = ( /<([\w:-]+)/ );
var rscriptType = ( /^$|\/(?:java|ecma)script/i );
// Количество вызовов: 3
var rleadingWhitespace = ( /^\s+/ );
// Количество вызовов: 2
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
"details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
// Функция хранения контейнеров DocumentFragment. Количество вызовов: 2
function createSafeFragment( document ) { //... }
( function() {
var div = document.createElement( "div" ),
fragment = document.createDocumentFragment(),
input = document.createElement( "input" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
support.leadingWhitespace = div.firstChild.nodeType === 3;
support.tbody = !div.getElementsByTagName( "tbody" ).length;
support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML
!== "<:nav></:nav>";
input.type = "checkbox";
input.checked = true;
fragment.appendChild( input );
support.appendChecked = input.checked;
div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
fragment.appendChild( div );
input = document.createElement( "input" );
input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" );
div.appendChild( input );
support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
support.noCloneEvent = !!div.addEventListener;
div[ jQuery.expando ] = 1;
support.attributes = !div.getAttribute( jQuery.expando );
} )();
// Закрываем теги для поддержки XHTML. Количество вызовов: 12
var wrapMap = { //... };
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
// Функция возвращает все значения, связанные с ключем. Количество вызовов: 15
function getAll( context, tag ) { //... }
// Функция отмечающая скрипты как уже оцененные. Количество вызовов: 3
function setGlobalEval( elems, refElements ) { //... }
// Количество вызовов: 1
var rhtml = /<|&#?\w+;/,
// Количество вызовов: 2
rtbody = /<tbody/i;
/* Функция, меняющая выставленные значения элементов на значения по умолчанию. Количество вызовов: 1 */
function fixDefaultChecked( elem ) { //... }
// Количество вызовов: 2
function buildFragment( elems, context, scripts, selection, ignored ) { /* функция создания фрагмента */ }
( function() {
var i, eventName,
div = document.createElement( "div" );
for ( i in { submit: true, change: true, focusin: true } ) {
eventName = "on" + i;
if ( !( support[ i ] = eventName in window ) ) {
div.setAttribute( eventName, "t" );
support[ i ] = div.attributes[ eventName ].expando === false;
}
}
div = null;
} )();
// Количество вызовов: 3
var rformElems = /^(?:input|select|textarea)$/i,
// Количество вызовов: 1
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
// Количество вызовов: 2
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
// Количество вызовов: 4
function returnTrue() { return true; }
// Количество вызовов: 6
function returnFalse() { return false; }
// Функция проверки наличия фокуса. Количество вызовов: 2
function safeActiveElement() { //... }
// Количество вызовов: 7
function on( elem, types, selector, data, fn, one ) { /* метод .On() – установка обработчиков событий на выбранные элементы */ };
jQuery.event = { /* создание следующих свойств и методов для управления событиями: add, remove, trigger, dispatch, handlers, fix, props,
fixHooks, keyHooks, mouseHooks, special, simulate */ };
// Функция удаления событий. Количество вызовов: 3
jQuery.removeEvent = document.removeEventListener ?
function( elem, type, handle ) {
if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); }
} :
function( elem, type, handle ) {
var name = "on" + type;
if ( elem.detachEvent ) {
if ( typeof elem[ name ] === "undefined" ) { elem[ name ] = null; }
elem.detachEvent( name, handle );
}
};
// Количество вызовов: 7
jQuery.Event = function( src, props ) { /* jQuery.Event() - функция-конструктор, создающая в памяти браузера копию (экземпляр) базового
DOM-события - объект jQuery.Event */ };
// Количество вызовов: 0
jQuery.Event.prototype = { /* определение свойств экземпляра jQuery.Event в свойстве prototype конструктора объекта jQuery.Event */ }
/* Создание событий mouseenter/leave с помощью меток mouseover/out и отметок времени, чтобы делегирование событий работало в jQuery. То же
самое для pointerenter/pointerleave и pointerover/pointerout */
jQuery.each( {
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function( orig, fix ) { //... } );
if ( !support.submit ) { /* Делегирование submit в IE */ }
if ( !support.change ) { /* Делегирование change и отметка checkbox/radio в IE */ }
if ( !support.focusin ) { /* Поддержка focusin(focusout) в Firefox, Chrome, Safari */ }
jQuery.fn.extend( { /* добавление следующих свойств и методов в экземпляр jQuery: on, one, off, trigger, triggerHandler */ } );
// Количество вызовов: 1
var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
// Количество вызовов: 2
rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
// Количество вызовов: 1
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
rnoInnerhtml = /<script|<style|<link/i,
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rscriptTypeMasked = /^true\/(.*)/,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
safeFragment = createSafeFragment( document ),
// Количество вызовов: 3
fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
// Функция контроля за наличием tbody. Количество вызовов: 2
function manipulationTarget( elem, content ) { //... }
/* Функции замены/восстановления типа атрибута элементов для безопасного манипулирования DOM. Количество вызовов: 2 */
function disableScript( elem ) { //... }
function restoreScript( elem ) { //... }
// Функция клонирования события при клонировании элемента. Количество вызовов: 2
function cloneCopyEvent( src, dest ) { //... }
// Функция, исправляющая все проблемы клонирования IE. Количество вызовов: 1
function fixCloneNodeIssues( src, dest ) { //... }
// Количество вызовов: 8
function domManip( collection, args, callback, ignored ) { /* основная функция для манипуляций с DOM */}
// Функция удаления элементов страницы. Количество вызовов: 3
function remove( elem, selector, keepData ) { //... }
jQuery.extend( { /* добавление следующих свойств в объект jQuery: htmlPrefilter, clone, cleanData */ } );
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: domManip, detach, remove, text, append, prepend, before, after,
empty, clone, html, replaceWith */ } );
/* Создание методов:
appendTo/prependTo с помощью меток append/prepend - вставлять сразу несколько элементов,
insertBefore/insertAfter с помощью before/after - вставлять до/после каждого элемента,
replaceAll с помощью replaceWith - заменить каждый целевой элемент */
jQuery.each( {
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function( name, original ) { //... } );
// Количество вызовов: 6
var iframe,
// Количество вызовов: 2
elemdisplay = {
HTML: "block",
BODY: "block"
};
// Вызывается только внутри defaultDisplay. Количество вызовов: 2
function actualDisplay( name, doc ) { //... }
// Функция, определяющая отображаемое по умолчанию значение элемента. Количество вызовов: 4
function defaultDisplay( nodeName ) { //... }
// Количество вызовов: 2
var rmargin = ( /^margin/ );
// Количество вызовов: 4
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
// Функция обмена, перетаскивания. Количество вызовов: 3
var swap = function( elem, options, callback, args ) { //... };
// Количество вызовов: 8. У Sizzle своя переменная documentElement
var documentElement = document.documentElement;
|
|
23.11.2018, 22:39
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
продолжение №2
// Оформительский блок
( function() {
var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
container = document.createElement( "div" ), div = document.createElement( "div" );
if ( !div.style ) { return; }
div.style.cssText = "float:left;opacity:.5";
support.opacity = div.style.opacity === "0.5";
support.cssFloat = !!div.style.cssFloat;
div.style.backgroundClip = "content-box";
div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box";
container = document.createElement( "div" );
container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
"padding:0;margin-top:1px;position:absolute";
div.innerHTML = "";
container.appendChild( div );
support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
div.style.WebkitBoxSizing === "";
jQuery.extend( support, {
reliableHiddenOffsets: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return reliableHiddenOffsetsVal;
},
boxSizingReliable: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return boxSizingReliableVal;
},
pixelMarginRight: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return pixelMarginRightVal;
},
pixelPosition: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return pixelPositionVal;
},
reliableMarginRight: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return reliableMarginRightVal;
},
reliableMarginLeft: function() {
if ( pixelPositionVal == null ) { computeStyleTests(); }
return reliableMarginLeftVal;
}
} );
function computeStyleTests() {
var contents, divStyle, documentElement = document.documentElement;
documentElement.appendChild( container );
div.style.cssText = "-webkit-box-sizing:border-box;box-sizing:border-box;" +
"position:relative;display:block;" +
"margin:auto;border:1px;padding:1px;" + "top:1%;width:50%";
pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
pixelMarginRightVal = reliableMarginRightVal = true;
if ( window.getComputedStyle ) {
divStyle = window.getComputedStyle( div );
pixelPositionVal = ( divStyle || {} ).top !== "1%";
reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
div.style.marginRight = "50%";
pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
contents = div.appendChild( document.createElement( "div" ) );
contents.style.cssText = div.style.cssText =
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
contents.style.marginRight = contents.style.width = "0";
div.style.width = "1px";
reliableMarginRightVal =
!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
div.removeChild( contents );
}
div.style.display = "none";
reliableHiddenOffsetsVal = div.getClientRects().length === 0;
if ( reliableHiddenOffsetsVal ) {
div.style.display = "";
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
div.childNodes[ 0 ].style.borderCollapse = "separate";
contents = div.getElementsByTagName( "td" );
contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
if ( reliableHiddenOffsetsVal ) {
contents[ 0 ].style.display = "";
contents[ 1 ].style.display = "none";
reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
}
}
documentElement.removeChild( container );
}
} )();
// Количество вызовов: 7
var getStyles,
// Количество вызовов: 8
curCSS,
// Количество вызовов: 1
rposition = /^(top|right|bottom|left)$/;
// Функции получения реальных значений CSS свойств
// Для браузеров, поддерживающих метод getComputedStyle
if ( window.getComputedStyle ) {
//...
// Для браузеров, поддерживающих метод currentStyle, альтернатива getComputedStyle
} else if ( documentElement.currentStyle ) {
//...
}
// Функция для работы с CSS хуками. Количество вызовов: 3
function addGetHookIf( conditionFn, hookFn ) { //... }
var
// Количество вызовов: 3
ralpha = /alpha\([^)]*\)/i,
// Количество вызовов: 1
ropacity = /opacity\s*=\s*([^)]*)/i,
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
// Количество вызовов: 2
cssNormalTransform = { letterSpacing: "0", fontWeight: "400" },
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style;
|
|
23.11.2018, 22:40
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
продолжение №3
// Функция, получающая CSS-свойство, сопоставленное с потенциальным префиксом свойства поставщика. Количество вызовов: 2
function vendorPropName( name ) { //... }
// Функция, скрывающая/отображающая элементы. Количество вызовов: 2
function showHide( elements, show ) { //... }
// Функция, устанавливающая положительные числа. Количество вызовов: 2
function setPositiveNumber( elem, value, subtract ) { //... }
/* Функция, вычисляющая прибавку в ширине или высоте для исправления нерелевантных стилей. Количество вызовов: 2 */
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { //... }
// Функция, вычисляющая реальную ширину/высоту элемента. Количество вызовов: 2
function getWidthOrHeight( elem, name, extra ) { //... }
jQuery.extend( { /* добавление следующих свойств в объект jQuery: cssHooks, cssNumber, cssProps, style, css */ } );
// Создание CSS-хуков ширины и высоты.
jQuery.each( [ "height", "width" ], function( i, name ) { //... } );
// CSS-хук для кросс-браузерной поддержки прозрачности
if ( !support.opacity ) { //... }
// CSS-хук для marginRight
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
function( elem, computed ) {
//...
}
);
// CSS-хук для marginLeft
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
function( elem, computed ) {
//...
}
);
// Создание CSS-хуков, используемых анимацией для расширения свойств
jQuery.each( {
margin: "",
padding: "",
border: "Width"
}, function( prefix, suffix ) { //... } );
jQuery.extend( { /* добавление следующих свойств в объект jQuery: css, show, hide, toggle */ } );
/* Функция-конструктор, создающая в памяти браузера копию (экземпляр) базового объекта экземпляра jQuery - объект Tween. Количество вызовов:
12 */
function Tween( elem, options, prop, end, easing ) {
return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;
/* Для освобождения памяти от дубликатов методов. Определение свойств объекта Tween в свойстве prototype объекта Tween конструктора объекта
jQuery. Количество вызовов: 3 */
Tween.prototype = { //... };
/* Для освобождения памяти от дубликатов методов. Копирование свойств из свойства prototype объекта Tween конструктора объекта jQuery в
свойство prototype свойства init свойства prototype объекта Tween конструктора объекта jQuery. Количество вызовов: 0 */
Tween.prototype.init.prototype = Tween.prototype;
/* Функция, меняющая процесс получения и установки значения указанного свойства только во время анимации. Количество вызовов: 5 */
Tween.propHooks = { //... };
// Исправление на случай неработающего скроллинга. Количество вызовов: 0
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { //... };
// Функция плавности. Количество вызовов: 3
jQuery.easing = { //... };
// Очередь предстоящих функций. Количество вызовов: 20
jQuery.fx = Tween.prototype.init;
// Функция вычисления шага анимации. Количество вызовов: 2
jQuery.fx.step = {};
var
// Количество вызовов: 6
fxNow,
// Количество вызовов: 4
timerId,
// Количество вызовов: 1
rfxtypes = /^(?:toggle|show|hide)$/,
rrun = /queueHooks$/;
// Функция синхронизации анимаций, созданных синхронно. Количество вызовов: 2
function createFxNow() {
window.setTimeout( function() { fxNow = undefined; } );
return ( fxNow = jQuery.now() );
}
// Функция, создающая параметры для стандартной анимации. Количество вызовов: 4
function genFx( type, includeWidth ) { //... }
// Функция создания промежуточных кадров. Количество вызовов: 3
function createTween( value, prop, animation ) { //... }
// Функция предварительной обработки анимации. Количество вызовов: 1
function defaultPrefilter( elem, props, opts ) { //... }
// Функция настройки и фильтрации анимации. Количество вызовов: 1
function propFilter( props, specialEasing ) { //... }
/* Функция, контролирующая процесс анимации, для повышения отказоустойчивости. Количество вызовов: 10 */
function Animation( elem, properties, options ) { //... }
jQuery.Animation = jQuery.extend( Animation, { /* добавление следующих анимационного типа свойств в объект jQuery: tweeners, tweener,
prefilters, prefilter */ } );
/* Функция, задающая следующие свойства анимации, отличные от значений по умолчанию: длительность, плавность и очередь. Количество вызовов: 1
*/
jQuery.speed = function( speed, easing, fn ) { //... };
jQuery.fn.extend( { /* добавление следующих анимационного типа свойств в экземпляр jQuery: fadeTo, animate, stop, finish */ } );
// Создание параметров для стандартной анимации toggle, show, hide.
jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { //... } );
/* Создание ярлыков slideDown, slideUp, slideToggle, fadeIn, fadeOut, fadeToggle для настраиваемых анимаций toggle, show, hide. */
jQuery.each( {
slideDown: genFx( "show" ),
slideUp: genFx( "hide" ),
slideToggle: genFx( "toggle" ),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
}, function( name, props ) { //... } );
// Количество вызовов: 6
jQuery.timers = [];
/* Функция, отвечающая за фактическое исполнение анимации. Выполняет поочередно каждый таймер, сохраняя свое место, когда он удаляет
законченную анимацию. Количество вызовов: 1 */
jQuery.fx.tick = function() { //... };
// Функция, записывающая объекты timer в массив jQuery.timers. Количество вызовов: 1
jQuery.fx.timer = function( timer ) { //... };
// Продолжительность одного кадра анимации. Количество вызовов: 1
jQuery.fx.interval = 13;
// Функция, создающая точку отсчета для работы функции jQuery.fx.tick. Количество вызовов: 1
jQuery.fx.start = function() {
if ( !timerId ) {
timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
}
};
/* Функция отключения анимационного объекта, если его функция jQuery.fx.tick больше не находится в массиве jQuery.timers. Количество вызовов:
1 */
jQuery.fx.stop = function() {
window.clearInterval( timerId );
timerId = null;
};
// Функция, устанавливающая скорость анимации. Количество вызовов: 4
jQuery.fx.speeds = {
slow: 600,
fast: 200,
_default: 400
};
/* Based off of the plugin by Clint Helfers, with permission. Функция, устанавливающая задержку перед выполнением очередной функции в
очереди. Количество вызовов: 0 */
jQuery.fn.delay = function( time, type ) { //... };
// Кросс-браузерное тестирование.
( function() {
var a,
input = document.createElement( "input" ),
div = document.createElement( "div" ),
select = document.createElement( "select" ),
opt = select.appendChild( document.createElement( "option" ) );
div = document.createElement( "div" );
div.setAttribute( "className", "t" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
a = div.getElementsByTagName( "a" )[ 0 ];
input.setAttribute( "type", "checkbox" );
div.appendChild( input );
a = div.getElementsByTagName( "a" )[ 0 ];
a.style.cssText = "top:1px";
support.getSetAttribute = div.className !== "t";
support.style = /top/.test( a.getAttribute( "style" ) );
support.hrefNormalized = a.getAttribute( "href" ) === "/a";
support.checkOn = !!input.value;
support.optSelected = opt.selected;
support.enctype = !!document.createElement( "form" ).enctype;
select.disabled = true;
support.optDisabled = !opt.disabled;
input = document.createElement( "input" );
input.setAttribute( "value", "" );
support.input = input.getAttribute( "value" ) === "";
input.value = "t";
input.setAttribute( "type", "radio" );
support.radioValue = input.value === "t";
} )();
// Количество вызовов: 1
var rreturn = /\r/g,
rspaces = /[\x20\t\r\n\f]+/g;
jQuery.fn.extend( { // добавление следующих свойств в экземпляр jQuery: val } );
jQuery.extend( { // добавление следующих свойств в объект jQuery: valHooks } );
// Переопределение поведения по умолчанию для элементов radio и checkbox.
jQuery.each( [ "radio", "checkbox" ], function() { //... } );
// Количество вызовов: 6
var nodeHook,
// Количество вызовов: 2
boolHook,
// Количество вызовов: 10
attrHandle = jQuery.expr.attrHandle,
// Количество вызовов: 3
ruseDefault = /^(?:checked|selected)$/i,
// Количество вызовов: 7
getSetAttribute = support.getSetAttribute,
// Количество вызовов: 4
getSetInput = support.input;
jQuery.fn.extend( { // добавление следующих свойств в экземпляр jQuery: attr, removeAttr } );
jQuery.extend( { /* добавление следующих свойств в объект jQuery: attr, attrHooks, removeAttr */ } );
// Хуки для boolean атрибутов.
boolHook = { //... };
|
|
23.11.2018, 22:41
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
продолжение №4
// Заполнение значений boolean атрибутов.
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { //... } );
// Исправление oldIE attroperties
if ( !getSetInput || !getSetAttribute ) { //... }
/* Блок если не поддерживается getSetAttribute (браузеры IE6 / 7 не поддерживает получение / установку некоторых атрибутов с помощью get /
setAttribute) */
if ( !getSetAttribute ) { //... }
// Обеспечение кросс-браузерности, если не поддерживается style.
if ( !support.style ) { //... }
// Количество вызовов: 1
var rfocusable = /^(?:input|select|textarea|button|object)$/i,
rclickable = /^(?:a|area)$/i;
jQuery.fn.extend( { // добавление следующих свойств в экземпляр jQuery: prop, removeProp } );
jQuery.extend( { // добавление следующих свойств в объект jQuery: prop, propHooks, propFix } );
/* Обеспечение кросс-браузерности, если не поддерживается hrefNormalized. (Для некоторых атрибутов требуется специальный вызов в IE). */
if ( !support.hrefNormalized ) { //... }
// Обеспечение кросс-браузерности, если не поддерживается optSelected.
if ( !support.optSelected ) { //... }
// Нормализация названий свойств.
jQuery.each( [
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
jQuery.propFix[ this.toLowerCase() ] = this;
} );
// Обеспечение кросс-браузерности, если не поддерживается enctype (для IE6/7 encoding).
if ( !support.enctype ) {
jQuery.propFix.enctype = "encoding";
}
// Количество вызовов: 3
var rclass = /[\t\r\n\f]/g;
/* Функция устанавливает указанному атрибуту, при наличии, значение class. Количество вызовов: 7 */
function getClass( elem ) {
return jQuery.attr( elem, "class" ) || "";
}
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: addClass, removeClass, toggleClass, hasClass */ } );
// Возвращает экземпляр jQuery с включением только указанных атрибутов.
jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
function( i, name ) { //... } );
jQuery.fn.extend( { // добавление следующих свойств в экземпляр jQuery: hover } );
// Количество вызовов: 1
var location = window.location;
// Количество вызовов: 3
var nonce = jQuery.now();
var rquery = ( /\?/ );
// Количество вызовов: 1
var rvalidtokens =/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u
[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
// Функция парсинга json-данных. Количество вызовов: 2
jQuery.parseJSON = function( data ) { //... };
// Кросс-браузерный xml парсинг. Количество вызовов: 1
jQuery.parseXML = function( data ) { //... };
var
// Количество вызовов: 1
rhash = /#.*$/,
// Количество вызовов: 2
rts = /([?&])_=[^&]*/,
// Количество вызовов: 1
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
// Количество вызовов: 2
rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
// Количество вызовов: 2
prefilters = {},
transports = {},
// Избежать последовательности символов начала комментариев. Количество вызовов: 2
allTypes = "*/".concat( "*" ),
// Расположение документа. Количество вызовов: 3
ajaxLocation = location.href,
// Разбиение расположения на части. Количество вызовов: 6
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
// Функция-конструктор для jQuery.ajaxPrefilter и jQuery.ajaxTransport Количество вызовов: 2
function addToPrefiltersOrTransports( structure ) { //... }
// Основная функция контроля для prefilters и transports. Количество вызовов: 2
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { //... }
/* Функция стандартизации параметров функции ajax, чтобы увидеть, какие параметры не назначены. Количество вызовов: 3 */
function ajaxExtend( target, src ) { //... }
/* Функция обработки ответов на запрос ajax Находит правильный тип данных (посредник между типом контента и ожидаемым типом данных и
возвращает соответствующий ответ). Количество вызовов: 1 */
function ajaxHandleResponses( s, jqXHR, responses ) { //... }
// Функция сетевых преобразований с учетом запроса и исходного ответа. Количество вызовов: 1
function ajaxConvert( s, response, jqXHR, isSuccess ) { //... }
jQuery.extend( { /* добавление следующих свойств в объект jQuery: active, lastModified, etag, ajaxSettings, ajaxSetup, ajaxPrefilter,
ajaxTransport, ajax, getJSON, getScript */ } );
// Расширение параметров get/post запросов.
jQuery.each( [ "get", "post" ], function( i, method ) { //... } );
// Функция динамической загрузки скрипта. Количество вызовов: 2
jQuery._evalUrl = function( url ) {
return jQuery.ajax( {
url: url,
type: "GET",
dataType: "script",
cache: true,
async: false,
global: false,
"throws": true
} );
};
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: wrapAll, wrapInner, wrap, unwrap */ } );
// Функция, определяющая тип отображения элемента. Количество вызовов: 1
function getDisplay( elem ) {
return elem.style && elem.style.display || jQuery.css( elem, "display" );
}
// Функция, выявляющая отсоединенные или скрытые элементы. Количество вызовов: 1
function filterHidden( elem ) { //... }
// Функция проверки скрытого состояния элемента. Количество вызовов: 1
jQuery.expr.filters.hidden = function( elem ) {
return support.reliableHiddenOffsets() ?
( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && !elem.getClientRects().length ) :
filterHidden( elem );
};
// Функция проверки не скрытого состояния элемента. Количество вызовов: 0
jQuery.expr.filters.visible = function( elem ) {
return !jQuery.expr.filters.hidden( elem );
};
// Количество вызовов: 1
var r20 = /%20/g,
rbracket = /\[\]$/,
// Количество вызовов: 2
rCRLF = /\r?\n/g,
// Количество вызовов: 1
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
rsubmittable = /^(?:input|select|textarea|keygen)/i;
// Функция преобразования объекта в строку. Количество вызовов: 1
function buildParams( prefix, obj, traditional, add ) { //... }
/* Функция сериализации массива элементов формы или набора ключей/значений в строку ajax-запроса. Количество вызовов: 2 */
jQuery.param = function( a, traditional ) { //... };
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: serialize, serializeArray */ } );
|
|
23.11.2018, 22:42
|
Новичок на форуме
|
|
Регистрация: 23.11.2018
Сообщений: 9
|
|
завершительное сообщение
// Создание объекта запроса с учетом кросс-браузерности. Количество вызовов: 1
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? function() {
if ( this.isLocal ) { return createActiveXHR(); }
if ( document.documentMode > 8 ) { return createStandardXHR(); }
return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
createStandardXHR() || createActiveXHR();
} : createStandardXHR;
// Количество вызовов: 1
var xhrId = 0,
// Количество вызовов: 4
xhrCallbacks = {},
// Количество вызовов: 2
xhrSupported = jQuery.ajaxSettings.xhr();
/* Отмена открытых запросов, если страница не загрузилась по каким-либо причинам, либо при закрытии окна (вкладки) браузера. */
if ( window.attachEvent ) {
window.attachEvent( "onunload", function() {
for ( var key in xhrCallbacks ) { xhrCallbacks[ key ]( undefined, true ); }
} );
}
// Для проверки поддержки браузером кросс-доменных запросов. Количество вызовов: 1
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
// Для проверки поддержки браузером технологии ajax. Количество вызовов: 1
xhrSupported = support.ajax = !!xhrSupported;
if ( xhrSupported ) {
// Функция, создающая объект для обработки ajax-запроса Количество вызовов: 1
jQuery.ajaxTransport( function( options ) { //... }
}
// Функция создания объекта XHR. Количество вызовов: 3
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch ( e ) {}
}
// Функция создания объекта XHR. Количество вызовов: 2
function createActiveXHR() {
try {
return new window.ActiveXObject( "Microsoft.XMLHTTP" );
} catch ( e ) {}
}
/* Установка значений по умолчанию для следующих настроек ajax-запроса: accepts, contents, converters */
jQuery.ajaxSetup( { //... } );
// Настройка индивидуального и глобального кэша для ajax-запросов типа script.
jQuery.ajaxPrefilter( "script", function( s ) {
if ( s.cache === undefined ) { s.cache = false; }
if ( s.crossDomain ) {
s.type = "GET";
s.global = false;
}
} );
// Создание объекта для обработки ajax-запроса типа script
jQuery.ajaxTransport( "script", function( s ) { //... } );
// Количество вызовов: 2
var oldCallbacks = [],
// Количество вызовов: 3
rjsonp = /(=)\?(?=&|$)|\?\?/;
// Установка значений по умолчанию для следующих настроек ajax-запроса: jsonp, jsonpCallback
jQuery.ajaxSetup( {
jsonp: "callback",
jsonpCallback: function() {
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
this[ callback ] = true;
return callback;
}
} );
// Выявление, нормализация и установка callbacks для ajax-запросов типа json, jsonp
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { //... }
// Функция разбора строки в массив узлов DOM. Количество вызовов: 2
jQuery.parseHTML = function( data, context, keepScripts ) { //... };
// Сохранение копии прежнего метода загрузки. Количество вызовов: 2
var _load = jQuery.fn.load;
// Функция загрузки URL на страницу. Метод .load(). Количество вызовов: 0
jQuery.fn.load = function( url, params, callback ) { //... };
/* Присоединение для общепринятых ajax-событий функции обработчика для одного или нескольких событий */
jQuery.each( [
"ajaxStart",
"ajaxStop",
"ajaxComplete",
"ajaxError",
"ajaxSuccess",
"ajaxSend"
], function( i, type ) {
jQuery.fn[ type ] = function( fn ) { return this.on( type, fn ); };
} );
// Функция проверки наличия элемента в jQuery.timers. Количество вызовов: 0
jQuery.expr.filters.animated = function( elem ) {
return jQuery.grep( jQuery.timers, function( fn ) {
return elem === fn.elem;
} ).length;
};
// Функция, получающая корреспондирующее с элементом окно. Количество вызовов: 2
function getWindow( elem ) {
return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 ?
elem.defaultView || elem.parentWindow : false;
}
/* Функция, устанавливающая местоположение выбранного элемента относительно границ текущего документа. Количество вызовов: 1 */
jQuery.offset = { //... };
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: offset, position, offsetParent */ } );
// Создание scrollLeft и scrollTop методов
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { //... } );
// CSS-хуки для свойств top и left
jQuery.each( [ "top", "left" ], function( i, prop ) { //... } );
// Создание innerHeight, innerWidth, height, width, outerHeight и outerWidth методов
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { //... } );
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: bind, unbind, delegate, undelegate */ } );
// Функция, определяющая количество выбранных элементов. Метод .size() Количество вызовов: 0
jQuery.fn.size = function() { return this.length; };
// Замена функции jQuery.fn.andSelf, которая больше не может использоваться
jQuery.fn.andSelf = jQuery.fn.addBack;
/* Проверка наличия js-скрипта «require.js» (библиотеки управления зависимостями JavaScript для улучшения скорости и качества кода) */
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() { return jQuery; } );
}
// Карта к jQuery на случай перезаписи. Количество вызовов: 1
var _jQuery = window.jQuery,
// Карта к $ на случай перезаписи. Количество вызовов: 0
_$ = window.$;
/* Функция, отключающая использование $ в качестве переменной jQuery, без потери функциональности библиотеки jQuery. Количество вызовов: 0 */
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) { window.$ = _$; }
if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; }
return jQuery;
};
/* Зачастую если noGlobal является undefined, то jQuery добавит себя к глобальному window объект, за исключением случая когда загрузчик
модуля – CommonJS */
if ( !noGlobal ) { window.jQuery = window.$ = jQuery; }
// Завершение блока Модуля
return jQuery;
})
// Закрытие круглых скобок, в которые обернута IIFE.
);
|
|
|
|