2012-12-07 7 views
10

Używam jQuery na mojej stronie, gdy używam narzędzia deweloperskiego Chrome, znalazłem jQuery18007779947370290756 i obiekt jQuery w konsoli. jQuery18007779947370290756 zawiera tylko kilka metod. jQuery zawiera o wiele więcej metod. więc czym jest jQuery18007779947370290756? Nie mam adresu URL strony, ponieważ jest to strona wewnętrzna. Dołączona biblioteka to tylko jquery-1.8.0.min.js i jquery-ui-1.8.23 i bez wywołań JSONP.Co to jest jQuery18007779947370290756

Wygląda na to, że dodałem globalne zdarzenie 'beforeunload' do obiektu okna. i jest przechowywane w oknie [expando]. Jednak jeśli dodałem pewne zdarzenia do innego obiektu DOM, takie jak button, i są one przechowywane w jQuery.cache. tutaj jest zrzut ekranu z formularza jQuery.cache i okna [jQuery1800xxxxxxxxxxxxxxxx] Nie jestem pewien, dlaczego Guid dla tych wydarzeń z 2 kliknięciami to 8. Te 2 kliknięcia są powiązane z 2 przyciskami. i funkcja obsługi zdarzeń click są tą samą funkcją.

enter image description here

+2

Zawsze wiedziałem, że Skynet uderzy w JQuery .... ale w powadze przegrał! Nie wiem. – thatidiotguy

+17

Nie wiem, ale przynajmniej jest to darmowe. –

+7

To numer telefonu, po którym następuje numer SSN. Jakie dziwne. –

Odpowiedz

6

jQuery dodaje tę właściwość elementów podczas zapisywania danych na ich temat. Jak ten znajduje się na elemencie window, gdzieś w kodzie robisz coś równoważnego do:

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

nocie, że zdarzenia jQuery używa również moduł za kulisy data, więc to może być również dlatego, że jesteś dodanie zdarzenia do obiektu window.

Dla normalnych węzłów (tj. Elementów o właściwości nodeType) ta wartość to set to a GUID (data.js # 61), a dane, które mają być przechowywane w tym obiekcie, są przechowywane w globalnej pamięci podręcznej jQuery.

Jednak element window nie posiada własności nodeType, tak to idzie w dół drogi Jestem zwykły obiekt JS; który prowadzi dane do zapisania bezpośrednio na samym obiekcie (co w przypadku może być przyczyną błędu z jQuery).

Wybór lokalizacji cache (globalne lub obiektu) jest wykonany w L39-45 in 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, 

W przypadku normalnych elementów DOM, wartość jest przypisany identyfikator GUID w data.js#61:

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

Ale w przypadku normalnych obiektów js (i window w tym przypadku), obiekt zostanie wybudowany w 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; 
}​ 

Wartość dziwnego jQuery.expando, który jest zdefiniowany w data.js#14 i jest inicjowane:

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

(zasadniczo "jQuery", a następnie przez wersję jQuery 'S usunięto (1800 w "". twój przypadek), a następnie losowa liczba).

+0

z wyjątkiem I umieścić coś w event.data, nie użyłem .data() w jQuery. – huahua

+0

@huahua: Używanie zdarzeń jQuery wystarcza do wygenerowania tego expando, ponieważ jQuery używa danych za kulisami zdarzeń (niezależnie od tego, czy używasz 'event.data' czy nie). – Matt

7

patrząc na http://code.jquery.com/jquery-latest.js znalazłem tam jest miejsce, które jest stworzenie czegoś podobnego, co widzimy.

wokół linii 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, ""), 

Może to być wykorzystywane w sposób, który powoduje pojawienie się obiektu.

Po przeanalizowaniu tego, jeszcze bardziej przekonany, to jest odpowiedź.

spojrzeć http://jsfiddle.net/USAcv/

Również dla różnych wersji jQuery to wygląda trochę inaczej:

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

widać wersja jest w pierwszej części numerów numerycznych.

Odkryłem również, że istnieją miejsca, w których utworzono elem[ expando ]. jeśli elem jest window, to jest to.

na przykład na linii 4770 z jQuery latest.js ma

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

z wyjątkiem I umieścić coś w event.data, nie użyłem .data() w jQuery. – huahua

+0

Doskonała odpowiedź. Mam zdarzenie przechowywane w oknie [expando] – huahua