# 一、元素节点(1)

# 1、获取元素

  在 jQuery 中通常我们直接使用$()即可,它类似于原生 js 中document.querySelector()document.querySelectorAll()的结合体。

  在复杂的应用场景中,我们还可以使用 jQuery 入门中讲到的 jQuery 选择器

$('.list li').eq(0)

$('.list').length
原生 js 实现
document.querySelector('.list li:nth-child(1)')

document.querySelectorAll('.list').length

# 2、节点的获取

  提前说明一下,下面第一个表示(注释掉的部分)表示原生的写法,第二个表示 jQuery 的写法。

/* 兄弟(关键字:相邻) */
// 1、上铺的兄弟
console.log(box.prev()) // 除此之外还有 prevAll()

// 2、下铺的兄弟
console.log(box.next()) // 除此之外还有 nextAll()

/* 父子(关键字:相邻)🚩 */
// 1、父节点
console.log(box.parent()) // 除此之外还有 parents()

// 2、子节点
console.log(box.children(selector))
console.log(box.find('li'))
原生 js 实现
/* 兄弟(关键字:相邻) */
// 1、上铺的兄弟
console.log(box.previousElementSibling)

// 2、下铺的兄弟
console.log(box.nextElementSibling)

/* 父子(关键字:相邻)🚩 */
// 1、父节点
console.log(box.parentNode)

// 2、子节点集合 `HTMLCollection`
console.log(box.children)

  值得说明的是,jQuery 还有比原生方法更强大的是:

  • 它可以直接获取所以的兄弟、父子节点(prevAll()nextAll()parents()),而不是单单获取一个节点
  • 相应的 jQuery 还提供了获取周围节点 siblings()方法,这在原生 js 中是没有的
// 周围的兄弟
console.log(box.siblings())
siblings()方法的 🤔 原生实现

  说白了就是,原生 js 没有 jQuery 的隐式迭代功能。

function siblings(element) {
  var siblingsArr = []
  var parent = element.parentNode
  var children = parent.children
  for (var i = 0; i < children.length; i++) {
    if (children[i] !== element) {
      siblingsArr.push(children[i])
    }
  }
  return siblingsArr
}

# 二、节点操作

# 试一试

tolist 案例实现

# 1、创建新节点

// 方式1(链式)
var odiv = $('<div>').addClass('box').html('节点内容')

// 方式2
var odiv = $(`<div class="box">节点内容</div>`)
原生 js 实现
// 1、createElement
var odiv = document.createElement('div')
odiv.className = 'box'
odiv.innerHTML = '节点内容'

// 2、模板字符串
var odiv = `<div class="box">节点内容</div>`

# 2、插入子节点

  jQuery 提供的写法有两种使用方式,但个人推荐使用第一种 😂,第二种为我注释掉的部分

  • 在末尾插入
// 1、在末尾插入
$('#box').append(odiv)
// $(odiv).appendTo($('#box'))

$('#box').prepend(odiv)
// $(odiv).prependTo($('#box'))

// 2、指定位置插入
$('#box').before(odiv)
// odiv.insertBefore($('#box'))

$('#box').after(odiv)
// odiv.insertAfter($('#box'))
原生 js 实现

  在原生 js 的 DOM 方法中,只有下面两个常用的方法(不过说实话,也够用了 😂)

// 1、在末尾插入
box.appendChild(odiv)

// 2、指定位置插入
box.insertBefore(odiv, child) // 在child的前面插入

  jQuery 中的 append()方法相较于原生的 appendChild()方法更加 NB 的一点就是,append()方法还可以传入字符串,而不仅限于 node 节点。

$('#box').append(`<div class="box">节点内容</div>`)
原生 js 实现
document.getElementById('box').innerHTML += '<div class="box">节点内容</div>'

# 3、删除子节点

  • jQuery 方式
// 1、删除当前节点
$('#box').remove()

// 2、删除指定子节点
$('#parent').find('#child').remove()
原生 js 实现
// 1、删除当前节点
box.remove()

// 2、删除指定子节点
box.removeChild(odiv)

  除此此外,jQuery 还提供了一个清空方法empty()

其实该方法是变相的删除所有节点,使用 innerHTML 也可以实现同样的效果

// 清空所以子节点
$('#box').empty()
// $('#box').html("")
原生 js 实现
box.innerHTML = ''

# 4、替换子节点

// 替换节点
$('#box #child').replaceWith(odiv)
odiv.replaceAll($('#box #child'))
原生 js 实现
// 替换当前节点(将A替换为B)
$(A).replaceWith(B)
// $(B).replaceAll(A);

// 替换子节点
// Node.prototype.replaceChild()
box.replaceChild(odiv, child)

# 5、克隆节点

  jQuery 中的 clone()就直接是克隆完整节点,相当于原生中的 clone(true)

并且 jQuery 中的 true 表示的是是否复制事件处理程序

// 克隆完整节点(含子节点)
const cloneElm = $('#box').clone()
console.log(cloneElm) // <ul id="list">...</ul>
原生 js 实现
const ulElm = document.querySelector('ul')

// 1、克隆当前节点
const cloneElm1 = ulElm.cloneNode()
console.log(cloneElm1) // <ul id="list"></ul>

// 2、克隆完整节点(含✨子节点)
const cloneElm2 = ulElm.cloneNode(true)
console.log(cloneElm2) // <ul id="list">...</ul>

# 二、jQuery 属性操作

# 1、属性使用

  • prop() 原生属性操作
<input type="checkbox" checked id="rember" />

<script>
  // 1、常规使用
  $('#rember').prop('checked', false)
  $('#rember').prop('checked')

  // 2、自定义属性
  $('#box').attr('effect', 'copy')
  $('#box').attr('effect')
  $('#box').removeAttr('effect')
</script>
  • 拓展 👏
// attr()也可以操作原生属性
$('#mybtn').attr('disabled', true)
原生 js 实现
// 1、常规使用
photo.checked = false

// 2、自定义属性
box.setAttribute('myMsg', 'welcome')
box.getAttribute('myMsg')
box.removeAttribute('myMsg')

# 2、元素样式

  关于使用原生 js 和 jQuery 对元素样式进行操作的区别,大家可以先看看下面这个错误案例:

$('ul li')[activeIndex].css('display', 'inline-block')
答案

  使用$()和原生方式获取的内容是不同的:

console.log($('ul li'))
console.log(document.querySelectorAll('ul li'))

  当使用[activeIndex]后,jQuery 中的一些封装方法就无法使用了。

// 解决方式1
$('ul li').eq(activeIndex).css('display', 'inline-block')

// 解决方式2
$('ul li')[activeIndex].style.display = 'inline-block'
  • 样式操作
// 获取
console.log($('#box').css('width'))
console.log($('#box').css('background-color'))

// 修改/添加
$('#box').css('width', '300px')
// $('#box').css('width', 300)
原生 js 实现
// 获取
console.log(box.style['background-color'])
console.log(box.style.backgroundColor)

// 修改/添加
box.style.width = '60px'
  • 隐式迭代
// 无需遍历🤔
$('ul li').css('color', 'red')
  • 批量添加
$('#box').css({ width: 200, height: 300, backgroundColor: 'green' })
原生 js 实现
box.setAttribute('style', 'width:100px;' + 'background-color:skyblue;')

# 3、class 类名

<div id="box" class="item item1 item2"></div>

<script>
  $('#box').addClass('item3')
  $('#box').removeClass('item3')

  // 显示与隐藏
  $('#box').toggleClass('itme3') // 将某个 class 移入或移出当前元素

  // 其他
  $('#box').hasClass('active') // 检查当前元素是否包含某个 class
</script>
原生 js 实现
// 1、常规
box.classList.add('item3')
box.classList.remove('item3')

// 2、切换
box.classList.toggle('itme3') // 将某个 class 移入或移出当前元素

// 3、其他
box.classList.contains() // 检查当前元素是否包含某个 class

  除了上面的这些方法,jQuery 还提供了index()方法用于获取当前 index 位置(相对于兄弟节点)

let index = $('#box li').index() // 返回当前index位置(相对于兄弟节点)
原生 js 实现

  在原生 JavaScript 中,可以使用 Array.prototype.indexOf()方法来获取一个元素在数组中的索引位置(如果不存在则返回-1)。

// 获取元素在父元素中的索引位置
function index_R(element) {
  var childList = element.parentNode.children
  var index = Array.prototype.indexOf.call(childList, element)
  return index
}

// 示例用法:
var index = index_R(document.getElementById('#box li'))
  • 应用示例
// 样式切换✍
$('ul').on('click', 'li', function () {
  $(this).addClass('active').siblings().removeClass('active')
})

# 三、jQuery 文本操作

# 1、文本操作

<div id="box">
  hello world
  <div>lencamo</div>
</div>

<script>
  // 1、打印
  console.log($('#box').html()) // 获取所有

  console.log($('#box').text()) // 不解析 html

  // 2、修改(全部覆盖)
  $('#box').html('呵呵')
</script>
原生 js 实现
<div id="box">
  hello world
  <div>lencamo</div>
</div>

<script>
  // 1、打印
  console.log(box.innerHTML) // 获取所有

  console.log(box.innerText) // 不解析 html

  // 2、修改(全部覆盖)
  box.innerHTML = '呵呵'
</script>

# 2、value 属性

<select name="" id="select">
  <option value="1">one</option>
  <option value="2" selected>two</option>
  <option value="3">three</option>
</select>

<script>
  // 1、原生方式
  // console.log(select.value)
  select.value = '3' // 注意匹配字符串

  // 2、jQuery方式
  console.log($('#select').val())
  $('#select').val('3')
</script>
更新于 : 7/8/2024, 10:21:14 AM