10

ページで jQuery を使用しています。Chrome 開発者ツールを使用すると、コンソールで jQuery18007779947370290756 と jQuery オブジェクトが見つかりました。jQuery18007779947370290756 にはいくつかのメソッドしか含まれていません。jQuery には、さらに多くのメソッドが含まれています。jQuery18007779947370290756 とは何ですか? 内部ページなのでURLはわかりません。私が含めるライブラリは jquery-1.8.0.min.js と jquery-ui-1.8.23 だけで、JSONP 呼び出しはありません。

'beforeunload'window オブジェクトにグローバル イベントを追加したようです。window[expando]に格納されます。ただし、いくつかのイベントを などの他の DOM オブジェクトに追加するbuttonと、それらは jQuery.cache に格納されます。jQuery.cache と window[jQuery1800xxxxxxxxxxxxxxxx] のスクリーン ショットを次に示します。その 2 つのクリック イベントの GUID が両方とも 8 である理由がわかりません。これらの 2 つのクリック イベントは 2 つのボタンにバインドされています。とクリックイベントハンドラーは同じ機能です。

ここに画像の説明を入力

4

2 に答える 2

7

jQuery は、要素にデータを格納するときに、このプロパティを要素に追加します。このプロパティはwindow要素上にあるため、コードのどこかで次と同等のことを行っています。

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

jQuery イベントもdataバックグラウンドでモジュールを使用することに注意してください。これは、windowオブジェクトにイベントを追加していることが原因である可能性もあります。

通常のノード (つまり、nodeTypeプロパティを持つ要素) の場合、この値はGUID (data.js#61) に設定され、そのオブジェクトに保存するデータはグローバル jQuery キャッシュに保存されます。

ただし、window要素にはプロパティがないため、 I'm a plain JS objectnodeTypeのルートをたどります。これにより、データがオブジェクト自体に直接保存されます ( の場合、jQueryのバグである可能性があります)。window

キャッシュの場所 (グローバルまたはオブジェクト上) の選択は、data.js の L39-45 で行われます。

// 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 要素の場合、値にはdata.js#61で GUID が割り当てられます。

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;
}​

奇妙な値はで、これはdata.js#14jQuery.expandoで定義され、次のように初期化されます。

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

(基本的に、「jQuery」の後に「.」が削除された jQuery バージョン (この場合は 1800)、次に乱数)。

于 2012-12-07T20:21:26.417 に答える
7

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 ]。もしそうならelemwindowこれです。

たとえば、jquery-latest.js の 4770 行目には

if ( (cache = elem[ expando ]) === cachedkey ) {
于 2012-12-07T20:17:47.253 に答える