Я пытаюсь понять, как jQuery создает возвращаемый объект при поиске элементов DOM. Я прошел через источник, но я не совсем уверен, что понимаю, и надеялся, что кто-то здесь может дать мне некоторое представление.
Из того, что я могу собрать, прочитав исходный код, при запросе jQuery DOM, jQuery находит соответствующие элементы DOM, а затем добавляет соответствующий элемент DOM в качестве объекта, используя индекс элемента в качестве ключа для нового объекта.
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
// Properties of context are called as methods if possible
if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
Возвращая this
, возвращается весь объект jQuery, который включает в себя все методы. Правильно ли я понял это?
Теперь появляются все функции, такие как css, find, ajax, hide и т.д. находятся в объекте jQuery.fn.
Как-то (и я думаю, что это то, где я его не вижу), эти функции вызываются не самим элементом DOM, а через access.js https://github.com/jquery/jquery/blob/master/src/core/access.js
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
используя css в качестве примера, мы имеем
jQuery.extend({
css: function( elem, name, extra, styles ) {...
jQuery.fn.extend({
css: function( name, value ) {
return access( this, function( elem, name, value ) {
var styles, len,
map = {},
i = 0;
if ( jQuery.isArray( name ) ) {
styles = getStyles( elem );
len = name.length;
for ( ; i < len; i++ ) {
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
}
return map;
}
return value !== undefined ?
jQuery.style( elem, name, value ) :
jQuery.css( elem, name );
}, name, value, arguments.length > 1 );
Я думаю, что мне не хватает, как мы получили вызов $('div').css(...)
к вызову метода jQuery.fn.extend.css, а оттуда метод доступа, вызываемый с другой подписью, к методу доступа инициализируется в основном jQuery?
Кроме того, если мы постоянно заменяем jQuery[0],jQuery[1]
, как я могу это сделать:
var divs = $('div');
var spans = $('span');
Поддерживать два разных набора тегов документа, если они возвращают один и тот же объект jQuery? Я думал, что объект будет обновлен.
Я полностью недопонимаю, как все это работает?