问题:
- jQuery对象和DOM对象的区别?
- jQuery对象如何转成DOM对象? DOM对象如何转为jQuery对象?
- jQuery选择器接口的使用?
$(d),d可以是:对象,function,字符串(id,HTML元素标签等),空(创建jQuery对象);
带着以上问题去学习jQuery源码。
console.log($('#box')); // 查询
console.log($('<a>')); // 创建
// jQuery原型上扩展属性
jQuery.fn = jQuery.prototype = {
jQuery: version,
length: 0,
selector: '',
init: function(selector, context) {
context = context || document;
var index = 0, elem, match;
if(typeof selector === 'string') { //创建DOM节点,或者查询DOM节点
if(selector.charAt(0) === '<' && selector.charAt(selector.length-1) === '>' && selector.length >=3) {
match = [selector];
}
if(match) { //创建DOM节点
jQuery.merge(this, jQuery.parseHTML(selector, context));
}
else { // 查询DOM节点
elem = document.querySelectorAll(selector);
var elems = Array.prototype.slice.call(elem);
this.length = elems.length;
for(; index < elems.length; index++) {
this[index] = elems[index];
}
this.context = context;
this.selector = selector;
}
}
else if(selector.nodeType) { // selector为对象,DOM节点,将DOM对象转为jQuery对象,设置length,数组[0],context属性
this.length = 1;
this.context = this[0] = selector;
return this;
}
else if (toString.call(selector) === '[object Function]') {
// 将传入的function加入到funtionList,待页面加载完毕,执行funtionList里function
}
},
css: function() {
console.log('style...');
}
};
jQuery.extend({
isPlainObject: function(obj) {
return toString.call(obj) === "[object Object]";
},
isArray: function(obj) {
return toString.call(obj) === "[object Array]";
},
// 合并数组
merge: function(first, second) {
var l = second.length;
var i = first.length;
var j = 0;
if(typeof l === 'number') {
for(; j<l; ) {
first[i++] = second[j++];
}
}
else {
while(second[j] !== undefined) {
first[i++] = second[j++];
}
}
first.length = i;
return first;
},
// 创建DOM元素,以数组形式返回
parseHTML: function(data, context) {
if(!data || typeof data !== 'string') {
return null;
}
// 过滤标签
var parse = rejectExp.exec(data);
//console.log(parse);
return [context.createElement(parse[1])];
}
});