前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >04-老马jQuery教程-DOM节点操作及位置和大小

04-老马jQuery教程-DOM节点操作及位置和大小

原创
作者头像
老马
发布2017-12-27 10:48:57
6.1K0
发布2017-12-27 10:48:57
举报
文章被收录于专栏:老马寒门IT

1. jQuery创建DOM标签

1.1 DOM动态创建标签的方法

DOM时代我们通过document的createElement方法动态创建标签。创建标签后,动态的给他添加属性。例如代码:

代码语言:javascript
复制
// 动态创建标签
var domDiv = document.createElment('div');
// 动态创建属性
domDiv.setAttribute('id', 'box');
// 动态设置内部html标签
domDiv.innerHTML = '<span>动态span</span>';
// 动态追加到body标签中
document.body.appendChild(domDiv);

1.2 jQuery动态创建标签的方式

jQuery的构造函数本身可以接收html标签的字符串来动态创建HTML标签。

语法结构: jQuery(html, [props])

参数:

  • html:用于动态创建DOM元素的HTML标记字符串,注意标签尽量闭合。
  • props:用于附加到新创建元素上的属性、事件和方法

返回值:返回新创建标签的jQuery包装对象

代码语言:javascript
复制
// jq的 appendTo,类似DOM的appendTo方法
$("<div><p>Hello</p></div>").appendTo("body");

// 两次参数的情况
$("<div></div>", {
  "class": "test", // 设置样式类
  text: "Click me!",  // 设置内容
  click: function(){  // 设置点击事件处理程序
    $(this).toggleClass("test");
  }
}).appendTo("body"); // 追加到body标签

2. DOM节点操作

2.1 添加子节点append(content|fn)方法

  • 参数:
    • content:类型String, Element, jQuery,添加的子节点。
    • fn(index,html):返回一个HTML字符串,用于追加到每一个匹配元素的里边。接受两个参数,index参数为对象在这个集合中的索引值,html参数为这个对象原先的html值。
  • 返回值:当前父包装对象,jQuery
  • 实例:
代码语言:javascript
复制
<div id="msg">hi</div>
<script>
  $(function(){
    // 添加字符串
    $("#msg").append('<span>你好</span>');
    // 添加dom对象
    var domDiv = document.createElement('div');
    domDiv.innerHTML = "hi laoma q:515154084";
    $("#msg").append(domDiv);
    // 添加jQuery对象
    var $span = $('<span>我是 jQuery对象</span>');
    $("#msg").append($span);

    $("#msg").append(function(index, oldHtml) {
      return "<span>==" + index + "==</span>";
    });
  });
</script>

prepend(content|fn)方法跟append(content|fn)的使用方法一致,只不过一个是在最后追加子节点,一个是在最前面追加子节点(prev vs after)

2.2 追加到appendTo(content)方法

  • 参数:content: 用于被追加的内容选择器,String类型。
  • 返回值: 返回当前的jQuery包装对象。
  • 实例:
代码语言:javascript
复制
$("<div>****</div>").appendTo('body');

prependTo(content)方法,跟appendTo(content)的使用方法一致,一个是追加到最后,一个是追加到最前。

2.3 元素之后插入节点after(content|fn)方法

  • 参数
    • content:插入到每个目标后的内容,类型可以:String,DOM,jQuery
    • fn(index,html):函数必须返回一个html字符串。
  • 返回值: jQuery包装对象
  • 实例
代码语言:javascript
复制
// 字符串
$('div').after('<p>1234</p>');
// jQuery对象
$("p").after($("#msg"));
// dom对象
$("p").after($("#msg")[0]);

// 传入回调函数
$("div").after(function(index, html) {
  return '<p>' + index  + '</p>'
})

before(content|fn) 方法正好是after(content|fn)相反的方法,用法一致。

2.4 插入某个元素之后insertAfter(content)方法

参数: content:插入到每个目标后的内容,类型可以:String,DOM,jQuery。

把所有匹配的元素插入到另一个、指定的元素元素集合的后面。实际上,使用这个方法是颠倒了常规的$(A).after(B)的操作,即不是把B插到A后面,而是把A插到B后面。

代码语言:javascript
复制
$("p").insertAfter("#foo");

insertBefore(content)跟此方法相反。

2.5 包裹节点wrap(html|element|fn)方法

  • 概述:

把所有匹配的元素用其他元素的结构化标记包裹起来。 这种包装对于在文档中插入额外的结构化标记最有用,而且它不会破坏原始文档的语义品质。这个函数的原理是检查提供的第一个元素(它是由所提供的HTML标记代码动态生成的),并在它的代码结构中找到最上层的祖先元素--这个祖先元素就是包裹元素。当HTML标记代码中的元素包含文本时无法使用这个函数。因此,如果要添加文本应该在包裹完成之后再行添加。

  • 参数:
    • html, String类型,HTML标记代码字符串,用于动态生成元素并包裹目标元素
    • element, Element类型,用于包装目标元素的DOM元素。
    • fn: 生成包裹结构的一个函数,返回包裹结构html
  • 返回值:jQuery包装对象
  • 实例
代码语言:javascript
复制
<script>
// 把所有的段落用一个新创建的div包裹起来
$("p").wrap("<div class='wrap'></div>");
// 用ID是"content"的div将每一个段落包裹起来
$("p").wrap(document.getElementById('content'));
// 用原先div的内容作为新div的class,并将每一个元素包裹起来
</script>

 <!-- HTML 代码: -->
<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>
<script>
// jQuery 代码:
$('.inner').wrap(function() {
  return '<div class="' + $(this).text() + '" />';
});
</script>

<!-- // 结果: -->
<div class="container">
  <div class="Hello">
    <div class="inner">Hello</div>
  </div>
  <div class="Goodbye">
    <div class="inner">Goodbye</div>
  </div>
</div>

2.6 去掉父节点包裹unwrap()方法

这个方法将移出元素的父元素。这能快速取消 .wrap()方法的效果。匹配的元素(以及他们的同辈元素)会在DOM结构上替换他们的父元素。

代码语言:javascript
复制
<!-- HTML 代码: -->
<div>
    <p>Hello</p>
    <p>cruel</p>
    <p>World</p>
</div>
<script>
  // jQuery 代码:
  $("p").unwrap()
</script>
<!-- 结果: -->
    <p>Hello</p>
    <p>cruel</p>
    <p>World</p>

2.7 集合包装wrapAll(html|ele)方法

  • 概述

将所有匹配的元素用单个元素包裹起来。这于 .wrap()是不同的,.wrap()为每一个匹配的元素都包裹一次。这种包装对于在文档中插入额外的结构化标记最有用,而且它不会破坏原始文档的语义品质。这个函数的原理是检查提供的第一个元素并在它的代码结构中找到最上层的祖先元素--这个祖先元素就是包装元素。

  • 参数
    • html, String类型,HTML标记代码字符串,用于动态生成元素并包装目标元素
    • elem, Element类型,用于包装目标元素的DOM元素
  • 示例
代码语言:javascript
复制
$("p").wrapAll("<div></div>");
// 用一个生成的div将所有段落包裹起来
$("p").wrapAll(document.createElement("div"));

2.8 包裹内部子元素wrapInner(htm|element|fnl)方法

  • 概述

将每一个匹配的元素的子内容(包括文本节点)用一个HTML结构包裹起来 这个函数的原理是检查提供的第一个元素(它是由所提供的HTML标记代码动态生成的),并在它的代码结构中找到最上层的祖先元素--这个祖先元素就是包装元素。

  • 参数
    • html, String类型,HTML标记代码字符串,用于动态生成元素并包装目标元素
    • element,Element类型,用于包装目标元素的DOM元素
    • fn,Function类型,生成包裹结构的一个函数
  • 示例
代码语言:javascript
复制
// 把所有段落内的每个子内容加粗
$("p").wrapInner("<b></b>");
// 把所有段落内的每个子内容加粗
$("p").wrapInner(document.createElement("b"));
代码语言:javascript
复制
<!-- 用原先div的内容作为新div的class,并将每一个元素包裹起来 -->
<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>
<script>
$('.inner').wrapInner(function() {
  return '<div class="' + $(this).text() + '" />';
});
</script>

<!-- 结果: -->
<div class="container">
  <div class="inner">
    <div class="Hello">Hello</div>
  </div>
  <div class="inner">
    <div class="Goodbye">Goodbye</div>
  </div>
</div>

2.9 替换阶段

  • 方法:replaceAll(selector),用匹配的元素替换掉所有 selector匹配到的元素。
  • 方法:replaceWith(content),用于将匹配元素替换掉的内容。可以是String\DOM\jQuery
代码语言:javascript
复制
// 替换掉所有的p,以下两种方法都可以
$("p").replaceWith("<b>Paragraph. </b>");
$("<b>Paragraph. </b>").replaceAll("p");

2.10 清空子元素

empty()方法,删除匹配的元素集合中所有的子节点

代码语言:javascript
复制
$("p").empty();

2.11 删除节点

remove()方法从DOM中删除所有匹配的元素。

代码语言:javascript
复制
// 删除所有的p标签
$("p").remove();

2.12 复制节点

clone([Even[,deepEven]])方法可以对节点进行克隆。

  • Even:一个布尔值(true 或者 false)指示事件处理函数是否会被复制。
  • deepEven:一个布尔值,指示是否对事件处理程序和克隆的元素的所有子元素的数据应该被复制。
代码语言:javascript
复制

$("b").clone().prependTo("p");

上传视频标签文本框特效案例:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>视频标签案例</title>
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  <style>
    html, body, div {
      padding: 0;
      margin: 0;
    }

    .label-wrap {
      width: 300px;
      /* height: 30px; */
      line-height: 30px;
      padding: 10px;
      border: 1px solid #ccc;
      overflow: hidden;
      margin: 100px auto;
    }

    .label-wrap .txt-lb {
      border: none;
      outline: none;
      height: 30px;
      line-height: 30px;
      width: 60px;
      float: left;
    }

    .label-wrap .lb-span {
      float: left;
      border: 1px solid #ccc;
      padding: 0 10px;
      margin-right: 10px;
    }
  </style>
  <script src="./lib/jquery-1.12.4.js"></script>
</head>
<body>
  <div class="label-wrap">
    <span class="lb-span">jQuery<i class="glyphicon glyphicon-remove"></i></span>
    <input type="text" class="txt-lb">
  </div>
  <script>
    $(function(){

      // 当文本框按下按键时处理
      $('.txt-lb').on('keydown', function(e) {
        // 判断用户是否按下了回车: e.which == 13 回车键
        if( e.which == 13 ) {
          inputToLabel();
        } else if( e.which == 8) {
          // 按下了删除键
          // 把最后一个lb-sapn标签删除,把里面文本放到文本上去。
          if($(this).val().length <= 0) {
            var txt = $('.label-wrap span:last').text();
            $(this).val(txt);
            $('.label-wrap span:last').remove();

            // 取消默认行为,取消后退键删除字符的默认行为
            e.preventDefault();
            e.stopPropagation();
          }
        }
      });

      // 给整个div绑定一个点击事件,进行给文本获取焦点
      $('.label-wrap').on('click', function(e) {
        $('.txt-lb').focus();
      })

      // 当文本框失去焦点到时候,给div添加span标签。另外input清空
      $('.txt-lb').on('blur', function(e) {
        inputToLabel();
      });

      // 删除label按钮点击事件
      $('.label-wrap').on('click', 'i', function(e) {
        $(this).parent().remove();
      });

      //  将文本框中的文本生成 label样式的标签。
      function inputToLabel() {
        // 判断文本框不为空,则进行添加标签操作
        if($(".txt-lb").val().length > 0 ) {
          // 当前文本框的 文本生成一个span标签放到文本框之前
          var $lb = $('<span class="lb-span">' + $(".txt-lb").val() +'<i class="glyphicon glyphicon-remove"></i></span>');
          // 在文本框前面追加一个lb对象
          $(".txt-lb").before($lb);
          $(".txt-lb").val(''); // 设置value为空
        }
      }
    });
  </script>
</body>
</html>

3. DOM的CSS属性读写

3.1 简单获取元素的内部宽高(不包括边框和外边距)

  • innerHeight()

获取第一个匹配元素内部区域高度(包括补白、不包括边框)。此方法对可见和隐藏元素均有效。没有参数,返回值是Integer类型

  • 示例
代码语言:javascript
复制
获取第一段落内部区域高度。
<p>Hello</p><p>2nd Paragraph</p>
<script>
var p = $("p:first");
$("p:last").text( "innerHeight:" + p.innerHeight() );
</script>
<!-- 结果: -->
<p>Hello</p><p>innerHeight: 16</p>
  • innerWidth()

获取第一个匹配元素内部区域宽度(包括补白、不包括边框)。此方法对可见和隐藏元素均有效。没有参数,返回值是Integer类型

  • 示例
代码语言:javascript
复制
<!-- 获取第一段落内部区域宽度。 -->
<p>Hello</p><p>2nd Paragraph</p>
<script>
  var p = $("p:first");
  $("p:last").text( "innerWidth:" + p.innerWidth() );
</script>
<!-- 结果: -->
<p>Hello</p><p>innerWidth: 40</p>

3.2 获取元素的外部宽高(包括边框或外边距)

3.2.1 outerHeight([options])
  • 概述

获取第一个匹配元素外部高度(默认包括补白和边框)。 此方法对可见和隐藏元素均有效。

  • 参数: optionsBoolean默认值:'false',设置为 true 时,计算边距在内。
  • 示例
代码语言:javascript
复制
<!-- 获取第一段落外部高度。 -->
<p>Hello</p><p>2nd Paragraph</p>
<script>
  var p = $("p:first");
  $("p:last").text( "outerHeight:" + p.outerHeight() + " , outerHeight(true):" + p.outerHeight(true) );
</script>
<!-- 结果: -->
<p>Hello</p><p>outerHeight: 35 , outerHeight(true):55</p>
3.2.2 outerWidth([options])
  • 概述

获取第一个匹配元素外部宽度(默认包括补白和边框)。 此方法对可见和隐藏元素均有效。

  • 参数:optionsBoolean默认值:'false',设置为 true 时,计算边距在内。
  • 示例
代码语言:javascript
复制
获取第一段落外部宽度。
<p>Hello</p><p>2nd Paragraph</p>
<script>
  var p = $("p:first");
  $("p:last").text( "outerWidth:" + p.outerWidth() + " , outerWidth(true):" + p.outerWidth(true) );
</script>
<!-- 结果: -->
<p>Hello</p><p>outerWidth: 65 , outerWidth(true):85</p>

3.3 jQuery获取元素内容区域的宽高

3.3.1 height([val|fn])
  • 概述

取得匹配元素当前计算的高度值(px)。在 jQuery 1.2 以后可以用来获取 window 和 document 的高

  • 参数

valString 可以是: Number, Function两种类似。

  • Number: 设定CSS中 'height' 的值,可以是字符串或者数字,还可以是一个函数,返回要设置的数值。函数接受两个参数,第一个参数是元素在原先集合中的索引位置,第二个参数为原先的高度。
  • function(index, height) index:String, height:Number 返回用于设置高度的一个函数。接收元素的索引位置和元素旧的高度值作为参数。
  • 示例
代码语言:javascript
复制
//第一种:无参数描述:
// 获取第一段的高
$("p").height();
// 第二种:一个参数参数val 
// 把所有段落的高设为 20:
$("p").height(20);

// 参数function(index, height) 
// 以 10 像素的幅度增加 p 元素的高度
  $("button").click(function(){
    $("p").height(function(n,c){
    return c+10;
    });
  });
3.3.2 width([val|fn])

width的用法跟height一致,不再赘述。

3.4 获取和设置滚动条的宽高

3.4.1 scrollTop([val])

  • 概述

获取匹配元素相对滚动条顶部的偏移。此方法对可见和隐藏元素均有效。

  • 参数: val 可以是:String, Number类型
  • 实例:
代码语言:javascript
复制
var p = $("p:first");
$("p:last").text( "scrollTop:" + p.scrollTop() );
$("div.demo").scrollTop(300);

3.4.2 scrollLeft([val])

用法通scrollTop,不再赘述。

3.5 获取位置和偏移量

3.5.1 position()
  • 概述

获取匹配元素相对父元素的偏移。此方法只对可见元素有效。从边框开始计算。

  • 返回值:Object{top,left} 返回的对象包含两个整型属性:top 和 left。 为精确计算结果,请在补白、边框和填充属性上使用像素单位。
代码语言:javascript
复制
var p = $("p:first");
var position = p.position();
$("p:last").html( "left: " + position.left + ", top: " + position.top );
// 结果:<p>Hello</p><p>left: 15, top: 15</p>
3.5.2 offset([coordinates])
  • 概述

获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性:top 和 left,以像素计。此方法只对可见元素有效。

  • 参数可以省略(获取),或者 coordinates 是Object类型,属性:{top,left} 必需。规定以像素计的 top 和 left 坐标。比如 {top:100,left:0} ,或者:带有 top 和 left 属性的对象
代码语言:javascript
复制
// 获取第二段的偏移
// <p>Hello</p><p>2nd Paragraph</p>
var p = $("p:last");
var offset = p.offset();
p.html( "left: " + offset.left + ", top: " + offset.top );
// 结果:
// <p>Hello</p><p>left: 0, top: 35</p>

// 设置最后一个段落的top和left值
$("p:last").offset({ top: 10, left: 30 });

预告: 下一篇:jQuery的动画系统详解。

对应视频地址:https://qtxh.ke.qq.com/#tuin=1eb4a0a4 老马qq: 515154084 老马微信:请扫码

微信:Flydragon_malun

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. jQuery创建DOM标签
    • 1.1 DOM动态创建标签的方法
      • 1.2 jQuery动态创建标签的方式
      • 2. DOM节点操作
        • 2.1 添加子节点append(content|fn)方法
          • 2.2 追加到appendTo(content)方法
            • 2.3 元素之后插入节点after(content|fn)方法
              • 2.4 插入某个元素之后insertAfter(content)方法
                • 2.5 包裹节点wrap(html|element|fn)方法
                  • 2.6 去掉父节点包裹unwrap()方法
                    • 2.7 集合包装wrapAll(html|ele)方法
                      • 2.8 包裹内部子元素wrapInner(htm|element|fnl)方法
                        • 2.9 替换阶段
                          • 2.10 清空子元素
                            • 2.11 删除节点
                              • 2.12 复制节点
                              • 3. DOM的CSS属性读写
                                • 3.1 简单获取元素的内部宽高(不包括边框和外边距)
                                  • 3.2 获取元素的外部宽高(包括边框或外边距)
                                    • 3.2.1 outerHeight([options])
                                    • 3.2.2 outerWidth([options])
                                  • 3.3 jQuery获取元素内容区域的宽高
                                    • 3.3.1 height([val|fn])
                                    • 3.3.2 width([val|fn])
                                  • 3.4 获取和设置滚动条的宽高
                                    • 3.4.1 scrollTop([val])
                                      • 3.4.2 scrollLeft([val])
                                        • 3.5 获取位置和偏移量
                                          • 3.5.1 position()
                                          • 3.5.2 offset([coordinates])
                                      相关产品与服务
                                      视频理解
                                      视频理解是基于腾讯领先的 AI 技术和丰富的内容运营经验,对视频内容输出涵盖人物、场景、物体、事件的高精度、多维度的优质标签内容。通过对视频内容进行细粒度的结构化解析,应用于媒资系统管理、素材检索、内容运营等业务场景中。其中一款产品是媒体智能标签(Intelligent Media Label Detection)
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档