Что такое jQuery18007779947370290756

Я использую jQuery на своей странице, когда я использую инструмент разработчика Chrome, я нашел jQuery18007779947370290756 и объект jQuery в консоли. jQuery18007779947370290756 содержит только несколько методов. jQuery содержит намного больше методов. так что это jQuery18007779947370290756? У меня нет URL страницы, так как это внутренняя страница. lib я включаю только jquery-1.8.0.min.js и jquery-ui-1.8.23 и нет вызовов JSONP.

Похоже, если бы я добавил глобальное событие 'beforeunload' к объекту window. и он сохраняется в окне [expando]. Однако, если я добавил некоторые события в другой объект DOM, например button, и они хранятся в jQuery.cache. вот экранный снимок формы jQuery.cache и окна [jQuery1800xxxxxxxxxxxxxxxx] Я не уверен, почему руководство для этих двух событий щелчка - это 8. Эти события с двумя щелчками привязаны к двум кнопкам. и обработчик события клика - это одна и та же функция.

enter image description here

Ответ 1

jQuery добавляет это свойство к элементам, когда вы храните данные на них. Поскольку это свойство находится в элементе window, где-то в вашем коде вы делаете что-то эквивалентное:

$(window).data('something', 1);

Обратите внимание, что события jQuery также используют модуль data за кулисами, поэтому это также может быть связано с тем, что вы добавляете событие в объект window.

Для обычных узлов (т.е. элементов с свойством nodeType) это значение установлено в GUID (data.js # 61), а данные, которые вы хотите сохранить на этом объекте, хранятся в глобальном кеше jQuery.

Однако элемент window не имеет свойства nodeType, поэтому он идет по маршруту, я являюсь простым JS-объектом; который приводит к тому, что данные будут храниться непосредственно на самом объекте (что в случае window может быть ошибкой с jQuery).

Выбор местоположения кеша (глобальный или объект) выполнен в L39-45 в data.js:

// We have to handle DOM nodes and JS objects differently because IE6-7
// can't GC object references properly across the DOM-JS boundary
isNode = elem.nodeType,

// Only DOM nodes need the global jQuery cache; JS object data is
// attached directly to the object so GC can occur automatically
cache = isNode ? jQuery.cache : elem,

В случае обычных элементов DOM этому значению присваивается идентификатор GUID в data.js # 61:

elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;

Но в случае обычных объектов JS (и window в этом случае) объект строится в 68 - 74:

cache[id] = {};

// Avoids exposing jQuery metadata on plain JS objects when the object
// is serialized using JSON.stringify
if (!isNode) {
    cache[id].toJSON = jQuery.noop;
}​

Странное значение jQuery.expando, которое определено в data.js # 14 и инициализируется следующим образом:

"jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" )

(в основном, "jQuery", а затем версия jQuery с "." удалена (1800 в вашем случае), а затем случайное число).

Ответ 2

глядя на http://code.jquery.com/jquery-latest.js, я нашел там место, которое создает что-то вроде того, что мы видим.

Вокруг строки 1522:

// Unique for each copy of jQuery on the page
// Non-digits removed to match rinlinejQuery
expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),

Возможно, это используется так, чтобы объект отображался.

Посмотрев на него, я больше уверен, что это ответ.

посмотрите http://jsfiddle.net/USAcv/

Кроме того, для разных версий jQuery это выглядит несколько иначе:

jQuery16406568800362638323  v1.6.4
jQuery18007779947370290756  v1.8.0
jQuery1820604904827339435   v1.8.2

вы можете видеть, что версия находится в первой части числовых чисел.

Я также обнаружил, что существуют места, в которых создается elem[ expando ]. если elem - window, то это он.

например, в строке 4770 jquery-latest.js он имеет

if ( (cache = elem[ expando ]) === cachedkey ) {