最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • jQuery 中的设计模式

    正文概述 掘金(RiverCui)   2021-05-05   543

    链式风格

    也叫jQuery风格

    window.jQuery()是我们提供的全局函数

    特殊函数jQuery

    jQuery(选择器)用于获取对应的元素,但它却不返回这些元素。

    相反,它返回一个对象,称为jQuery构造出来的对象,这个对象可以操作相应的元素。

    jQuery 中的设计模式

    jQuery 中的设计模式

    jQuery是构造函数吗?

    因为jQuery函数确实构造出了一个对象

    不是

    因为不需要写new jQuery()就能构造一个对象

    以前讲的构造函数都要结合new才行,比如var obj = new Object()

    结论

    jQuery是一个不需要加new的构造函数

    jQuery不是常规意义上的构造函数

    这是因为jQuery用了一些技巧

    术语

    jQuery对象

    jQuery对象指代jQuery函数构造出来的对象,也就是那个api

    jQuery对象不是说jQuery这个对象

    举例

    Object是个函数,Object对象表示Object构造出的对象

    Array是个函数,Array对象/数组对象表示Array构造出来的对象

    Function是个函数,Function对象/函数对象表示Function构造出来的对象

    手写jQuery

    源码

    命名风格

    下面代码令人误解

    const div = $('div#test')

    我们会误以为div是一个DOM,实际上div是jQuery构造的api对象

    改成这样

    const $div = $('div#test')

    $div.appendChild不存在,因为它不是DOM对象

    $div.find存在,因为它是jQuery对象

    链式风格

    $('<div><span>1</span></div>')

    返回值并不是新增的元素,而是api对象

    $('<div><span>1</span></div>').appendTo(document.body)

    appendTo可以把新增的元素放到另一个元素里,类似上面这样操作

    总结

    感觉DOM是不可见的,不需要知道DOM的任何细节,只需要使用简洁的API即可

    一个好的封装,能让使用者完全不知道内部细节,只是通过闭包实现的

    如果想知道细节怎么办

    举例1
    const $div = $('div#test')
    

    $div并不是DOM对象,而是jQuery构造的api对象

    如何从$div中得到div呢?

    $div.get(0) 获取第0个元素 //div
    $div.get(1) 获取第1个元素 //undefined
    $div.get(2) 获取第2个元素 //undefined
    $div.size() 得到元素的个数
    $div.length 也可以得到元素的个数
    $div.get() 获取所有元素组成的数组 //[div]
    
    举例2
    const $div = $('.red') //假设有3个div.red
    

    $div不是DOM对象们,而不是jQuery构造的api对象

    如何从$div中得到div呢?

    一样的

    $div.get(0) 获取第0个元素 //div
    $div.get(1) 获取第1个元素 //div
    $div.get(2) 获取第2个元素 //div
    $div.size() 得到元素的个数
    $div.length 也可以得到元素的个数
    $div.get() 获取所有元素组成的数组 //[div,div,div]
    

    $div.get(0)太麻烦,使用更简单的$div[0]

    重新开始写链式风格

    $('#xxx') //返回值并不是元素,而是一个api对象
    $('#xxx').find('.red') //查找#xxx里的.red元素
    $('#xxx').parent() //获取新爸爸
    $('#xxx').children() //获取儿子
    $('#xxx').siblings() //获取兄弟
    $('#xxx').index() //获取排行老几(从0开始)
    $('#xxx').next() //获取弟弟
    $('#xxx').prev() //获取哥哥
    $('.red').each(fn) //遍历并对每个元素执行fn
    
    $('body') // 获取document.body
    $('body').append($'<div>1</div>') //添加小儿子
    $('body').append('<div>1</div>') //更方便
    $('body').prepend(div或$div) //添加大儿子
    $('#test').after(div或$div) //添个弟弟
    $('#test').before(div或$div) //添个哥哥
    
    $div.remove()
    $div.empty()
    
    $div.text(?) //读写文本内容
    $div.html(?) //读写HTML内容
    $div.attr('title',?) //读写属性
    $div.css({color: 'red'}) //读写style //$div.style更好,但是jQuery是用的css
    $div.addClass('blue')/removeClass/hasClass // 添加 / 移除 / 检查是否有
    $div.on('click',fn)
    $div.off('click',fn)
    

    注意:$div可能对应了多个div元素

    后续

    使用原型

    把共有属性(函数)全都放到$.prototype

    $.fn=$.prototype //名字太长

    然后让api.__proto__指向$fn

    设计模式

    jQuery用到了哪些设计模式

    不用new的构造函数,这个模式没有专门的名字

    $(支持多种参数),这个模式叫做重载

    用闭包隐藏细节,这个模式没有专门的名字

    $div.text()既可读也可写,getter/setter

    $.fn$.prototype的别名,这叫别名

    jQuery针对不同浏览器使用不同代码,这叫适配器

    设计模式是什么?

    设计模式就是对通用代码取个名字


    起源地下载网 » jQuery 中的设计模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元