正如大家所知,jQuery库是如今使用最长寿的库,它里面运用到了很多的设计模式,譬如:不用new的构造函数;jQuery()支持多种参数;用闭包隐藏细节;jQuery().text()既可读取文本也可改写文本;jQuery.prototype改写为$.fn的别名;针对不同的浏览器使用不同的代码的适配器。
给一个HTML文档,如下:
<body>
<div id="test">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
</div>
</body>
一、jQuery 如何获取元素
jQuery的基本设计思想和主要用法,就是获取元素并对其进行操作,获取元素时就使用了不用new的构造函数以及支持多种参数的重构
window.$=window.jQuery=function(selector){
let elements
if(typeof elements==='string'){
if(elements[0]==='<'){
elements=[createElement(selector)]
}else{
elements=document.querySelector(selector)
}
}else if(elements instanceof Array){
elements=selector
}
function createElement(string){
document.createElement(string)
}
const api=Object.create(jQuery.prototype)
Object.assign(api,{elements:elements,oldApi:elements.oldApi})
return api
}
$('#test') 即可获取id为test的元素;
$('#test').find('.child')//在ID为test的元素里面查找类名为child的元素。
二、jQuery 的链式操作是怎样的
链式操作就是可以对获取的元素进行一系列操作,最终可以以链条的形式写到一起。下面是一段我写的一段jQuery的构造函数
jQuery.prototype={
constructor:jQuery,
each(fn) {
for (let i = 0; i < this.elements.length; i++) {
fn.call(null, this.elements[i], i)
}
},
parent() {
let array = []
this.each(n => {
if (array.indexOf(n.parentNode) === -1) {
array.push(n.parentNode)
}
})
return jQuery(array)
},
children() {
let array = []
this.each(n => {
array.push(...n.children)
})
return jQuery(array)
},
}
我只是想说$('#test').parent().children()这就是一个链式操作,
再如$('#test').siblings().addClass('.red')//为ID为test的元素的兄弟元素添加一个red类名。
三、jQuery 如何创建元素
创建元素很简单,在上面获取元素时,我其实就实现了创建元素的操作,
$('<div>新的div</div>')即可创建一个新的div;
$('<ul><li>第一条</li><li>第二条</li></ul>')甚至可以创建一个ul无序列表。
四、jQuery 如何移动元素
移动网页元素和建立DOM库的移动元素操作差不多,
- 添加兄弟元素
$().insertBefore()将获取的元素插入到指定元素前面;
$().insertAfter()将获取的元素插入到指定元素后面;
$().before()在获取的元素前面添加元素;
$().after()在获取的元素后面添加元素。
- 添加层级元素
$().append()为获取的元素添加子级元素,默认添加在末尾;
$().appendTo()将获取的元素放到指定元素的子级里,默认添加在末尾;
$().prepend()在获取的元素内部前面添加元素;
$().prependTo()将获取的元素放到指定元素内部前面。
五、jQuery 如何修改元素的属性
修改元素属性,包括元素里面的内容,元素的自带属性
$().html()取出或设置html内容
$().text()取出或设置text内容
$().attr() 取出或设置某个属性的值
$().width()取出或设置某个元素的宽度
$().height() 取出或设置某个元素的高度
$().val() 取出某个表单元素的值
总结
jQuery的设计模式里还包括一些事件操作方法,工具方法,我这里就不一一列举,总之,jQuery设计模式就是用简单的循环语句、条件语句等来操作函数,使复杂、繁琐的步骤变成一个简单的jQuery操作对象(也就是api)。
我写的一个jQuery库链接