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

1. jQuery创建DOM标签

1.1 DOM动态创建标签的方法

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

// 动态创建标签
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包装对象

// 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

  • 实例:

<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包装对象。
  • 实例:
$("<div>****</div>").appendTo('body');

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

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

  • 参数
    • content:插入到每个目标后的内容,类型可以:String,DOM,jQuery
    • fn(index,html):函数必须返回一个html字符串。
  • 返回值: jQuery包装对象
  • 实例
// 字符串
$('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后面。

$("p").insertAfter("#foo");

insertBefore(content)跟此方法相反。

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

  • 概述:

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

  • 参数:
    • html, String类型,HTML标记代码字符串,用于动态生成元素并包裹目标元素
    • element, Element类型,用于包装目标元素的DOM元素。
    • fn: 生成包裹结构的一个函数,返回包裹结构html
  • 返回值:jQuery包装对象
  • 实例
<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结构上替换他们的父元素。

<!-- 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元素
  • 示例

$("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类型,生成包裹结构的一个函数
  • 示例

// 把所有段落内的每个子内容加粗
$("p").wrapInner("<b></b>");
// 把所有段落内的每个子内容加粗
$("p").wrapInner(document.createElement("b"));
<!-- 用原先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

// 替换掉所有的p,以下两种方法都可以
$("p").replaceWith("<b>Paragraph. </b>");
$("<b>Paragraph. </b>").replaceAll("p");

2.10 清空子元素

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

$("p").empty();

2.11 删除节点

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

// 删除所有的p标签
$("p").remove();

2.12 复制节点

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

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

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

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

<!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类型

  • 示例
获取第一段落内部区域高度。
<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类型

  • 示例
<!-- 获取第一段落内部区域宽度。 -->
<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 时,计算边距在内。

  • 示例

<!-- 获取第一段落外部高度。 -->
<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 时,计算边距在内。

  • 示例

获取第一段落外部宽度。
<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 返回用于设置高度的一个函数。接收元素的索引位置和元素旧的高度值作为参数。

  • 示例

//第一种:无参数描述:
// 获取第一段的高
$("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类型

  • 实例:

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。 为精确计算结果,请在补白、边框和填充属性上使用像素单位。
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 属性的对象
// 获取第二段的偏移
// <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的动画系统详解。


对应视频地址:http://qtxh.ke.qq.com
老马qq: 515154084
老马微信:请扫码

微信:Flydragon_malun
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343