Просмотрела исходик 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; }; } )(); |
продолжение №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; |
продолжение №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; |
продолжение №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 = { //... }; |
продолжение №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 */ } ); |
завершительное сообщение
// Создание объекта запроса с учетом кросс-браузерности. Количество вызовов: 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. ); |
Часовой пояс GMT +3, время: 21:59. |