Go to comments

jQuery DOM操作 插入、删、增、包裹

一、插入

插入到指定元素之前

.insertBefore()

.before()


插入到指定元素之后

.insertAfter()

.After()


在父级子元素最后面插入

.appendTo()

.append()


在父级子元素最前面插入

.prependTo()

.prepend()


1、插入到指定元素之前

先回顾 js 原生的  parentNode.insertBefore(A, B)

insert A 

Before B

意思插入的 A,在 B 的前面


.insertBefore()

jQuery 简化了一下原生的 insertBefore(A, B),直接把前面选中 .content 插入到的 .box1 前面(a插入到b前面)

<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<meta charset="UTF-8">
<title>插入到指定元素之前</title>
<style>
.wrapper{border:1px solid #ccc;width:200px;padding:10px;}
.wrapper div{width:200px;height:100px;}
.wrapper .box1{background:orange;}
.wrapper .box2{background:red;}
.content{background:yellow;width:200px;height:50px;}
</style>
</head>
<body>

<div class="wrapper">
  <div class="box1">box1</div>
  <div class="box2">box2</div>
</div>
<div class="content">content</div>

<script>

$('.content').insertBefore('.box1');

</script>
</body>
</html>

插入前 .content 原来样式是 height: 50,插入后样式变成 height: 100

<div class="wrapper">

  <div class="content">content</div>

  <div class="box1">box1</div>

  <div class="box2">box2</div>

</div>


.before()

.insertBefore() 另外一种实现形式 .before() 方法,

两个方法的功能是一样的,只不过要调换一下,前面是 .box1 后面是 .content

$('.box1').before($('.content'));


注意,

.before() 方法的参数不能是"字符串"的 css选择器,

必须填 jQuery 对象,如果填字符串 ".content",会当做字符串数据放 .box1 前面


为什么一个功能要提供两种方法?

这和 jQuery 链式调用这种方式的习惯有关,看谁是主语,想针对谁进行链式操作,就可以把谁放前面


比如像操作谁就把谁放到前面

1. .css() 方法操作的 .content

$('.content').insertBefore('.box1').css({color:'red'});

2. css() 操作的是 .box1

$('.box1').before($('.content')).css({color:'red'});


2、插入到指定元素之后

.insertAfter()

 $('.content').insertAfter('.box1')   是把 .content 插入到 .box1 元素之后

<div class="wrapper">
  <div class="box1">box1</div>
  <div class="box2">box2</div>
</div>
<div class="content">content</div>

<script>

$('.content').insertAfter('.box1');

</script>

insertAfter 成哥的基础课留过作业

<div class="wrapper">

  <div class="box1">box1</div>

  <div class="content">content</div>

  <div class="box2">box2</div>

</div>


.After()

.after() 与 .insertAfter() 是一样的

$('.box1').after($('.content'));


这些方法都相当于剪切操作,

选中谁以后,让他的位置发生一些变化,减切过去了


3、在父级子元素最后面插入

.appendTo()

 $('.content').appendTo('.wrapper')  是让 .content 添加到 .wrapper 里面

<div class="wrapper">
  <div class="box1">box1</div>
  <div class="box2">box2</div>
</div>
<div class="content">content</div>

<script>

$('.content').appendTo('.wrapper');

</script>

<div class="wrapper">

  <div class="box1">box1</div>

  <div class="box2">box2</div>

  <div class="content">content</div>

</div>


.appendTo() 相当于原生的 appendChild

1. appendTo 从英语的叫角度是添加到

2. js 原生的 parendNode.appendChild() 方法前面是父级


.append()

.append() 和原生的 appendChild 一样,但是参数要用 jQuery 对象,不能用字符串

$('.wrapper').append($('.content'));

功能和 appendTo 一样

<div class="wrapper">

  <div class="box1">box1</div>

  <div class="box2">box2</div>

  <div class="content">content</div>

</div>


参数不用 jQeruy 对象写"字符串",意思就变成了创建一个"字符串",然后插入进去

$('.wrapper').append('.content');

<div class="wrapper">

  <div class="box1">box1</div>

  <div class="box2">box2</div>

  .content

</div>

<div class="content">content</div>


.appendTo() 和 .append() 是在父级子元素最后加元素

下面的 .prependTo() 和 .prepend()  是在父级子元素前面加


4、在父级子元素最前面插入

.prepend()

在父级子元素最前面插入

<div class="wrapper">
  <div class="box1">box1</div>
  <div class="box2">box2</div>
</div>
<div class="content">content</div>

<script>

$('.wrapper').prepend($('.content'));

</script>

<div class="wrapper">

  <div class="content">content</div>

  <div class="box1">box1</div>

  <div class="box2">box2</div>

</div>


.prependTo()

效果与 .prepend() 是一样的

$('.content').prependTo('.wrapper');


二、删除

这两个方法都是删除元素的意思,但是两个方法的区别在事件上

.remove()

.detach()


.remove()

选中 $('div') 然后 .remove() 删除,删除后返回的是删掉的 div,其实就是剪切掉了

<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<meta charset="UTF-8">
<title>.remove()</title>
<style>
div{width:100px;height:100px;background:orange;}
</style>
</head>
<body>

<div></div>

<script>

console.log($('div').remove()); // jQuery.fn.init [div, prevObject: jQuery.fn.init(1)]

</script>
</body>
</html>

归根结底还是链式操作,最后还是返回选中的 div


先绑定一个事件,删除后再插回到 body,会发现事件没有了

$('div').click(function(){
  alert('弹出');
});

$('div').remove().appendTo($('body'));


.detach()

detach 删除就不一样,删除后再添加回去事件还在

$('div').click(function(){
  alert('弹出');
});

$('div').detach().appendTo($('body'));

.remove() 和 .detach() 就是这点区别


三、又回到 $()

之前 $() 用来选择元素,现在用来创建元素,直接映射原生的 document.createElement() 方法

结构可以写的很复杂有点像 .html(),只不过 .html() 是在什么里面添加,$() 是凭空创建


$() 创建完的 dom 对象返回的是包装好的 jQuery 对象

$('<div></div>').appendTo($('body'));


可以写单标签,也不会报错

$('<div/>').appendTo($('body'));


可以把结构写的很复杂

$('<div><span style="color:red">红色</span></div>').appendTo($('body'));


也是可以写两个同级的标签,随心所欲的写

$('<div><span style="color:red">红色</span></div><p>p标签</p>').appendTo($('body'));


四、包裹

.wrap()

.wrapInner()

.wrapAll()

.unWrap()


.wrap()

wrap 是包裹层、包装的意思,.wrap() 方法给选中的元素添加一个父级,把标签包起来,参数可以是字符串

<div class="demo" style="background-color:aqua;height:100px;"></div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrap('<div style="background-color:orange;padding:10px;"></div>');

</script>

<div style="background-color:orange;padding:10px;">

  <div class="demo" style="background-color: aqua;height:100px;"></div>

</div>


参数也可以是创建一个 jQuery 对象的方式

$('.demo').wrap($('<div style="background-color:orange;padding:6px;"></div>'));

<div style="background-color:orange;padding:6px;">

  div class="demo" style="background-color: aqua;height:100px;"></div>

</div>


参数还可以用原生 dom

<div class="demo" style="background-color: aqua;height:100px;"></div>
<div class="box" style="background-color:orange;padding:6px;"></div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrap($('.box'));

</script>

<div class="box" style="background-color:orange;padding:6px;">

  <div class="demo" style="background-color: aqua;height:100px;"></div>

</div>

<div class="box" style="background-color:orange;padding:6px;"></div>


注意,

是复制不是剪切,.box 标签还在原位置


参数除了jQuery对象、字符串还可以填函数,

$('.demo') 前面选一堆,然后函数循环,每次返回值包裹父级

<div class="demo" style="background-color:aqua;height:100px;"></div>
<div class="demo" style="background-color:aqua;height:100px;"></div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrap(function(index){
  // index是索引
  return '<div class="wrapper_' + index + '"></div>';
});

</script>

<div class="wrapper_0">

  <div class="demo" style="background-color:aqua;height:100px;"></div>

</div>

<div class="wrapper_1">

  <div class="demo" style="background-color:aqua;height:100px;"></div>

</div>


参数直接写"字符串标签"也能起到循环包裹的作用,只不过填函数能让包裹更灵活一些

$('.demo').wrap('<div style="padding:10px;"></div>');


.wrapInner()

.warp() 可以理解是 warpOuter,

.wrapInner() 是给内部的标签包裹一层

<div class="demo">
  <span></span>
  <span></span>
</div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrapInner('<div></div>');

</script>

在写高级插件的时候可以用

<div class="demo">

  <div>

    <span></span>

    <span></span>

  </div>

</div>


两组 .demo 元素,$('.demo') 选中的是一个集合,还是内置循环,分别把 span 和 p 包裹

<div class="demo">
  <span></span>
  <span></span>
</div>

<div class="demo">
  <p></p>
  <p></p>
</div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrapInner('<div></div>');
    
</script>

<div class="demo">

  <div>

    <span></span>

    <span></span>

  </div>

</div>

<div class="demo">

  <div>

    <p></p>

    <p></p>

  </div>

</div>


参数的形式和 wrap 是一样,填函数也是没问题的

$('.demo').wrapInner(function(index){
  return '<div class="wrapper_' + index + '"></div>';
});

<div class="demo">

  <div class="wrapper_0">

    <span></span>

    <span></span>

  </div>

</div>

<div class="demo">

  <div class="wrapper_1">

    <p></p>

    <p></p>

  </div>

</div>


.wrapAll()

该方法更宏伟壮观一些包裹一堆,如果选中 $('.demo') 用 .wrap() 方法,会分别给两个 .demo 加父级


使用 .wrapAll() 方法会给选中的 .demo 统一加上一个父级

<div class="demo">
  <span></span>
  <span></span>
</div>

<div class="demo">
  <p></p>
  <p></p>
</div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrapAll('<div></div>');

</script>

给选中的.dome统一加上爹(父级)

<div>

  <div class="demo">

    <span></span>

    <span></span>

  </div>

  <div class="demo">

    <p></p>

    <p></p>

  </div>

</div>


fullpage 插件会用到 .wrapAll()

<div class="wrapper">

  <div class="section"></div>

  <div class="section">

      <div>

          <div class="item"></div>

          <div class="item"></div>

          <div class="item"></div>

      </div>

  </div>

  <div class="section"></div>

</div>


如果不按规矩写,也不会报错

<div class="wrapper">
  <div class="demo"></div>
  <div class="demo"></div>
</div>
<div class="demo"></div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrapAll('<div></div>');

</script>

.wrapAll 的内部逻辑是,以第一个选中的 div 为基准,把剩下的 div 并到一块去

<div class="wrapper">

  <div class="demo"></div>

  <div class="demo"></div>

  <div class="demo"></div>

</div>


把第一个选中的 div 放到前面

<div class="demo"></div>
<div class="wrapper">
  <div class="demo"></div>
  <div class="demo"></div>
</div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').wrapAll('<div></div>');

</script>

<div>

  <div class="demo"></div>

  <div class="demo"></div>

  <div class="demo"></div>

</div>

<div class="wrapper"></div>


.unwrap()

解绑


把直接父级删除

<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<meta charset="UTF-8">
<title>.unWrap()</title>
</head>
<body>

<div class="wrapper">
  <div class="box">
    <div class="content">
      <div class="demo"></div>
    </div>
  </div>
</div>

<script>

$('.demo').unwrap();

</script>
</body>
</html>

<div class="wrapper">

  <div class="box">

    <div class="demo"></div>

  </div>

</div>


不停的删除父级,到 body 标签就停止了

<div class="wrapper">
  <div class="box">
    <div class="content">
      <div class="demo"></div>
    </div>
  </div>
</div>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>

$('.demo').unwrap();
$('.demo').unwrap();
$('.demo').unwrap();
$('.demo').unwrap();

// <div class="demo"></div>

</script>



Leave a comment 0 Comments.

Leave a Reply

换一张