我爱编程

实现一个jQuery的API

2018-02-23  本文已影响0人  怎么昵称

某统计网站的数据统计 ,使用jQuery的比例占70%左右。我们来看看jQuery 到底做了哪些事情,给开发者带来多么大的方便,能得到这么多的喜爱呢?

探索一下jQuery内部到底做了什么?

 <div class="" id="sss">选项1</div>
 <div class="" id="sss">选项2</div>
 <div class="" id="sss">选项3</div>
 <div class="" id="sss">选项4</div>
 <div class="" id="sss">选项5</div>
.red{
  color: red;
}
window.jQuery = function (nodeOrSelector) {
    var nodes = {}
    if (typeof nodeOrSelector === 'string') {
        let temp = document.querySelectorAll(nodeOrSelector)

        for (let i = 0; i < temp.length; i++) {
            nodes[i] = temp[i]
        }
        nodes.length = temp.length
        console.log(nodes)//得到一个纯净的原型链

    } else {
        if (nodeOrSelector instanceof Node) {
            nodes = {
                0: nodeOrSelector,
                length: 1
            }
        }
    }


    nodes.addClass = function (value) {
        for (let i = 0; i < nodes.length; i++) {
            nodes[i].classList.add(value)
        }
    }
   

    nodes.setText = function (text) {
        var texts = []
        if (text === undefined) {
            console.log(nodes)
            for (let i = 0; i < nodes.length; i++) {

                texts.push(nodes[i].textContent)
            }
            console.log(texts)
            return texts
        } else {
            for (let i = 0; i < nodes.length; i++) {
                console.log(nodes[i])
                nodes[i].textContent = text
            }
        }
    }
    return nodes
}

window.$ = jQuery

var $div = $('div')
$div.addClass('red') // 可将所有 div 的 class 添加一个 red
$div.setText() // 可将所有 div 的 textContent 变为hi hi

首先我们知道 window.$= jQuery,这表明 $就是jQuery
一般来说,怎么使用jQuery获取元素 ,回想一下有哪些常用的方式呢?

  1. 获取ul 的子级li元素
$('ul>li')   
  1. 获取所有的<div>元素
$('div')

3.获取id为item3的元素

 $(item3)
  1. 获取class为xx的元素
$('.xx')

首先写获取的元素,一定要搞清楚 获取的元素的性质和各自的特点。
$(item2) ,传入的参数 item2 是一个元素的id,就代表一个node 节点
其中id选择器获取的元素只有一个, 因为 id 是唯一的。
除此之外,像class,html中可以有相同的class名,和标签,不唯一。

上述代码中,html 代码中多个<div>
获取div , 获取的是多个元素, 所以用document.querySelectorAll()

nodeOrSelector instanceof Node
$(item2), item2 代表的元素是Node 构造函数构造的,也说明只传入了一个节点。

nodes是伪数组时,最好后面返回的数据也是伪数组(对象)的形式。

对比jQuery 获取文本时, 当text() 传入参数, 则是设置元素的文本
不传参,就是获取元素的文本内容
对于两种形式, 都存在,才能保证与jQuery本身的方法一致。
所以需要判断 传入的参数是否 为undefined
undefined 就是指传入的参数名已存在, 但是没赋值的一种判断。

如果 $div.addClass('red')传入的参数是 字符串, 就直接传入。
当 $div.addClass(['red','yellow']) ,参数是一个数组,就必须遍历数组,array.forEach(function(){})将每一个class样式传给每一个元素。

确定一下主题, 我们平常用到的jQuery ,相比js而言, 不用写一长串的API获取元素, 使用更加简洁。但是了解内部以后, 会知道原来jQuery在我们执行获取时, 其实内部调用了很多方法, 获取到元素

那么 经过事先一个jQuery部分功能的API , 我们知道jQuery在自己要获取一个或多个元素时, 内部就会自动去查找符合条件的元素返回。当使用jQuery方法时, jQuery会找到jQuery对象的方法, 执行相关操作。

jQuery 本质就是一个构造函数, 接收一个参数, 参数可能是节点或者是选择器, 返回一个方法对象去操作节点。

在轻松简单表象的背后,jQuery得到的青睐也是付出了努力的不是吗?哈哈end

上一篇 下一篇

猜你喜欢

热点阅读