前端第72天JQDOM课件

一,文档结构

```js
var $sup = $('.sup');
console.log($sup.children());  // 子们
console.log($sup.parent());  //
console.log($sup.prev());  // 上兄弟
console.log($sup.next());  // 下兄弟
console.log($sup.siblings());  // 兄弟们
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文档结构</title>
</head>
<body>
<div class="box"></div>
<div class="sup">
    <div class="sub"></div>
    <div class="sub"></div>
    <div class="sub"></div>
</div>
<div class="ele"></div>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    var $sup = $('.sup');
    console.log($sup.children());  // 子们
    console.log($sup.parent());  //
    console.log($sup.prev());  // 上兄弟
    console.log($sup.next());  // 下兄弟
    console.log($sup.siblings());  // 兄弟们
</script>
</html>

二,文档操作

1. 操作步骤

```js
// 1.创建页面元素
var $box = $('<div class="box"></div>')
// 2.设置页面元素
$box.text('文本');
$box.click(fn);
// 3.添加到指定位置
$box.appendTo($('body'));
```

2. 内部操作

```js
// append(): 父 加 子 到最后
// prepend():  父 加 子 到最前
// appendTo(): 子 加到 父 到最后
// prependTo():  子 加到 父 到最前
```

3. 兄弟

```js
$('.box').after('<b></b>');  // 在box后添加一个b标签
$('.box').before('<b></b>');  // 在box前添加一个b标签
```

4. 包裹(添加父级)

```js
$('.box').wrap('<div></div>');  // 为box添加一个div父级
```

5. 替换

```js
$('.box').repleaceWith($('.ele')); // 把box替换为ele
$('p').repleaceAll($('b')); // 用p替换所有的b
```

6. 删除

```js
// 1.清空所有子级
$('.box').empty(); // 将box的子级全部删除, 操作的返回值为 自身
    
// 2.不保留事件的删除
// remove()操作的返回值为 自身
$('.box').remove().appendTo($('body'));  // 删除自身再添加到body,原来box已有的事件不再拥有

// 3.保留事件的删除
// detach()操作的返回值为 自身
$('.box').detach().appendTo($('body'));  // 删除自身再添加到body,原来box已有的事件依然拥有
   
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文档操作</title>
    <style>
        .ele1 {
            border: 1px solid black;
        }
        .ele2 {
            border: 1px solid orange;
        }
        .ele2 .div {
            background-color: pink;
        }
        .ele2 .div span {
            float: right;
            cursor: pointer;
        }

        .ele3 {
            width: 200px;
            height: 200px;
            background-color: cyan;
        }
    </style>
</head>
<body>
    <p class="p1">你是P</p>
    <div class="ele1">
        <p>原文本</p>
    </div>

    <div class="ele2"></div>

    <div class="ele3"><span>1</span><span>2</span><span>3</span></div>

    <div class="ele4">ele4 ele4 ele4</div>

    <!--需求: .wrap-ele5>.ele5 -->
    <div class="ele5">
        <div class="wrap"></div>
    </div>

    <!--repleaceWith-->
    <div class="container">
        <div class="inner first">Hello</div>
        <div class="inner second">And</div>
        <div class="inner third">Goodbye</div>
    </div>

    <!--repleaceAll-->
    <p>Hello</p><p>cruel</p><p>World</p>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    // 一.内部插入
    var $p1 = $('.p1');
    var $ele1 = $('.ele1');

    // 父添加子
    // $p1就是一个对象, 所以不管操作几次,或是如何操作, 最终只有一种位置结果
    $ele1.append($p1);  // 父 加 子 到最后
    $ele1.append($p1);

    $ele1.prepend($p1);  // 父 加 子 到最前

    $p1.appendTo($ele1); // 子 加到 父  到最后
    $p1.prependTo($ele1); // 子 加到 父  到最前
</script>
<script>
    // 二.操作文档三步骤
    // 1.创建页面元素对象
    // 2.设置页面元素对象(样式|属性|内容|事件...)
    // 3.添加到指定位置
    $ele2 = $('.ele2');

    // 1.
    var $div = $('<div class="div">我是div</div>');
    // 2.
    // $div.on('click', function () {
    //    alert('div被点击了!');
    // });
    // 委派添加事件
    $ele2.on('click', 'div', function () {
        alert('div被点击了!');
    });
    // 3.
    // $ele2.append($div);
    // 将div中假如一个span标签,在将自身添加到ele2中
    $div.append("<span>x</span>").appendTo($ele2);

    // 需求: 点击span的小x,删除$div
    // 思路: 给span绑定一个点击事件 => 操作让父级$div删除
    /* ① 通过选择器找到目标span
    $('.ele2 span').click(function (ev) {
        // 阻止冒泡
        ev.stopPropagation();
        // 删除操作
        // console.log(this)
        // 原生js操作 父删子
        // this.parentElement.parentElement.removeChild(this.parentElement);
        // jq操作 自删
        $(this).parent().remove();
    })
    */
    // ② 通过事件委派直接绑定给目标span
    $ele2.on('click', 'span', function (ev) {
        ev.stopPropagation();
        $(this).parent().remove();
    });
</script>

<script>
    // 三.删除操作

    // 1.清空所有子级
    // empty()操作的返回值为 自身
    $('.ele3').append("<span>4</span>").click(function () {
        // 打印子级所有文本
        // $(this).children().text() | $(this).text()
        console.log($(this).text())
    }).empty().text("00000");

    // 2.不保留事件的删除
    // remove()操作的返回值为 自身
    // $('.ele3').remove().appendTo($('body'));

    // 3.保留事件的删除
    // detach()操作的返回值为 自身
    // $('.ele3').detach().appendTo($('body'));

</script>

<script>
    // 四.兄弟结构操作
    $('.ele4').after('<b>after ele4</b>').before('<i>before ele4</i>')
</script>

<script>
    // 五.包裹操作(为自身添加父级)
    /*
    $('.ele5').wrap(function () {
        // this指的是ele5
        var _this = this;
        return $('.wrap').attr('class', function () {
             // this指的是wrap
            return this.className + "-" + _this.className;
        });
    }).empty();
    */
    var $wrap = $('.wrap');
    var $ele5 = $('.ele5').empty();
    $ele5.wrap($wrap);
    var tg_class = $wrap.attr('class') + "-" + $ele5.attr('class');
    console.log(tg_class)
    $ele5.parent().attr('class', tg_class);

</script>

<script>
    // 六.替换

    // 把third用裁剪的first来替换
    $('.third').replaceWith($('.first'));

    // 用b标签替换所有的p标签
    $("<b>Paragraph. </b>").replaceAll("p");
</script>

<!--DOM操作需求:
1.一个输入框,一个提交按钮,提交留言到一个列表中
2.每条留言可以删除
3.每条留言可以修改
-->
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文档操作案例</title>
    <style>
        input {
            vertical-align: middle;
        }
        ul, p {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        .msg, .show {
            width: 260px;
            /*background-color: red;*/
        }
        .show li:hover {
            background-color: #aaa;
        }
        .show {
            margin-top: 14px;
        }
        .show li {
            line-height: 40px;
            position: relative;
        }
        .show span {
            cursor: pointer;
            position: absolute;
            right: 10px;
            top: 0;
        }
    </style>
</head>
<body>
    <div class="msg">
        <input class="inp" type="text"><input class="btn" type="button" value="留言">
    </div>
    <ul class="show">
        <!--<li>-->
            <!--<p>第一条留言</p>-->
            <!--<span>&times;</span>-->
        <!--</li>-->
        <!--<li>-->
            <!--<p>一楼说的对</p>-->
            <!--<span>&times;</span>-->
        <!--</li>-->
    </ul>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    // 提交按钮的事件
    $('.btn').click(function () {
        // 输入框的内容
        var msg = $('.inp').val();
        // 输入框有内容才提交
        if (msg.length != 0) {
            addMsg(msg);
        }

        // 只要留言按钮点击后, 就应该清空输入框
        $('.inp').val("");
    });

    function addMsg(msg) {
        $('<li></li>')
            .append('<p>' + msg + '</p>')  // 为li添加子级p, p内容为留言内容
            .append('<span>&times;</span>')  // 为li添加子级span, 内容就是x
            .appendTo($('.show'))  // 将li添加到父级show最后
            .on('click', 'span', function (ev) {  // 通过li为子级span委派点击事件
                ev.stopPropagation();
                console.log(this); // span
                $(this).parent().remove();  // span找到父级li,进而删除当前li
            })
            .on('click', function () {  // 为li添加点击事件 => 进入编辑状态
                console.log(this);  // li
                // 将当前li的p内容取出 => 给编辑状态下的输入框
                var txt = $(this).children('p').text();
                // 如何才可以变为编辑方式 => 将p替换为input
                // $(this).children('p').replaceWith($('<input>').val(txt));
                $('<input>').val(txt)  // 进入编辑状态,新建input输入框,内容是当前留言p的内容
                    .attr('autofocus', 'true')  // ?
                    .replaceAll($(this).children('p'))  // 来替换显示内容的p标签
                    .blur(function () {  // 为当前编辑框添加失去焦点的事件
                        var edit_txt = $(this).val();  // 存储修改后的文本
                        if (edit_txt.length == 0) edit_txt = "null";  // 修改后的内容为空的安全处理
                        $('<p></p>').text(edit_txt).replaceAll(this);  // 将编辑完成后的input重新替换为p标签来显示
                    })
            })

    }

</script>
</html>

 

三.表单

```js
// form
// 属性
// action: 请求的后台接口
// method: get|post请求方式, get拼接接口方式传输数据(不安全), post携带数据包传输数据(安全)
```

- 表单元素类型

```html
<div class="row">
    <!--普通输入框-->
    <label>用户名: </label>
    <input type="text" id="usr" name="usr">
</div>
<div class="row">
    <!--密文输入框-->
    <label>密码: </label>
    <input type="password" id="pwd" name="pwd">
</div>
<div class="row">
    <!--按钮-->
    <input type="button" value="普通按钮">
    <button class="btn1">btn按钮</button>
</div>
<div class="row">
    <!--提交按钮, 完成的是表单数据的提交动作, 就是为后台提交数据的 动作-->
    <input type="submit" value="提交">
    <button type="submit">btn提交</button>
</div>
<div class="row">
    <!--单选框-->
    <!--注; 通过唯一标识name进行关联, checked布尔类型属性来默认选中--><input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female">
    哇塞<input type="radio" name="sex" value="wasai" checked>
</div>
<div class="row">
    <!--复选框-->
    <!--注: 用户不能输入内容,但是能标识选择的表单元素需要明确value值-->
    篮球<input type="checkbox" name="hobby" value="lq">
    足球<input type="checkbox" name="hobby" value="zq">
    乒乓球<input type="checkbox" name="hobby" value="ppq">
    其他<input type="checkbox" name="hobby" value="other">
</div>
<div class="row">
    <!--文本域-->
    <textarea></textarea>
</div>
<div class="row">
    <!--下拉框-->
    <select name="place">
        <option value="sh">上海</option>
        <option value="bj">北京</option>
        <option value="sz">深圳</option>
    </select>
</div>
<div class="row">
    <!--布尔类型属性-->
    <!--autofocus: 自动获取焦点-->
    <!--required: 必填项-->
    <!--multiple: 允许多项-->
    <input type="text" autofocus required>
    <input type="file" multiple>
    <input type="range">
    <input type="color">
</div>
<div class="row">
    <!--重置-->
    <input type="reset" value="重置">
</div>
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>form表单</title>
    <style>
        label {
            display: inline-block;
            width: 80px;
            text-align: right;
        }
        textarea {
            width: 300px;
            height: 200px;
            /*horizontal | vertical*/
            resize: none;
            font-size: 30px;
        }
    </style>
</head>
<body>
    <!--什么是form表单: form组合标签, 用来接收前端用户录入的数据信息 提交 给后台语言-->
    <!--表单元素:
    input: 基本上都是输入框, 通过type全局属性决定input类型, 默认为text
    label: 普通文本框(类似于span), 一般用来为紧跟其后的input框做文本提示
    -->

    <!--form属性:
    action: 后台处理请求的接口(往哪提交数据)
    method: 请求方式
        -- get: 将数据拼接在请求的接口之后, 拼接的长度是有限的,所有传输数据的大小也是有限的,且不安全
        -- post: 将数据作为数据包打包有请求携带给后台, 没有数据大小的限制, 安全
    -->
    <form action="" method="get">
        <div class="row">
            <!--普通输入框-->
            <label>用户名: </label>
            <input type="text" id="usr" name="usr">
        </div>
        <div class="row">
            <!--密文输入框-->
            <label>密码: </label>
            <input type="password" id="pwd" name="pwd">
        </div>
        <div class="row">
            <!--按钮-->
            <input type="button" value="普通按钮">
            <button class="btn1">btn按钮</button>
        </div>
        <div class="row">
            <!--提交按钮, 完成的是表单数据的提交动作, 就是为后台提交数据的 动作-->
            <input type="submit" value="提交">
            <button type="submit">btn提交</button>
        </div>
        <div class="row">
            <!--单选框-->
            <!--注; 通过唯一标识name进行关联, checked布尔类型属性来默认选中--><input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female">
            哇塞<input type="radio" name="sex" value="wasai" checked>
        </div>
        <div class="row">
            <!--复选框-->
            <!--注: 用户不能输入内容,但是能标识选择的表单元素需要明确value值-->
            篮球<input type="checkbox" name="hobby" value="lq">
            足球<input type="checkbox" name="hobby" value="zq">
            乒乓球<input type="checkbox" name="hobby" value="ppq">
            其他<input type="checkbox" name="hobby" value="other">
        </div>
        <div class="row">
            <!--文本域-->
            <textarea></textarea>
        </div>
        <div class="row">
            <!--下拉框-->
            <select name="place">
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="sz">深圳</option>
            </select>
        </div>
        <div class="row">
            <!--布尔类型属性-->
            <!--autofocus: 自动获取焦点-->
            <!--required: 必填项-->
            <!--multiple: 允许多项-->
            <input type="text" autofocus required>
            <input type="file" multiple>
            <input type="range">
            <input type="color">
        </div>
        <div class="row">
            <!--重置-->
            <input type="reset" value="重置">
        </div>
    </form>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    // 取消btn1的默认动作
    $('.btn1').click(function () {
        return false;
    });

    // 取消表单的默认提交动作 => type="submit"所有标签的提交事件都取消了
    $('form').submit(function () {
        // return false;
    })
</script>
</html>

四,正则

```js
// 定义
var re = /\d{11}/ig
// 1.正则的语法书写在//之间
// 2.i代表不区分大小写
// 3.g代表全文匹配

// 匹配案例
"abcABCabc".search(/[abc]/); // 在字符串abcABCabc匹配单个字符a或b或c,返回匹配到的第一次结果的索引, 没有匹配到返回-1
"abcABCabc".match(/\w/); // 进行无分组一次性匹配, 得到得到结果构建的数组类型[a, index:0, input:"abcABCabc"], 没有匹配到返回null
"abcABC".match(/\w/g); // 进行全文分组匹配, 得到结果为结果组成的数组[a, b, c, A, B, C]
"abcABC".match(/(abc)(ABC)/);
// RegExp.$1取第一个分组
// RegExp.$2取第二个分组

```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>正则</title>
</head>
<body>

</body>
<script>
    // 正则: 有语法规则的字符串, 用来匹配目标字符串
    // 定义正则

    // 第一种: 通过构造函数来创建正则对象, 特殊字符需要转义
    // var re = new RegExp('\\d');
    // 第二种
    var re = /\d{2}/;

    // 可以用正则的字符串方法
    var res = "#abc1abc56".search(re);
    console.log(res);
    // str.search(): 可以匹配正则, 匹配成功返回匹配的索引, 反之返回-1


    var target = 'abc123你好ABC';
    var re = /((abc)((123)你好ABC))/;
    var res = target.match(re);
    console.log(res);
    // 取第四个分组
    console.log(res[4]);
    console.log(RegExp.$4);

    // str.match()
    // 匹配失败返回null, 匹配成功,如果非全文匹配, 返回匹配到的信息的数组形式
    // i: 不区分大小写  eg: /a/i 可以匹配a | A
    // g: 匹配匹配      eg: /a/g 可以匹配abcABCabc中的两个a
    console.log("abcABCabc".match(/(abc)ABCabc/g))
    console.log(RegExp.$1)
</script>
</html>

五,from案例

!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>form案例</title>
    <style>
        .red {
            color: red;
            font-size: 12px;
        }
    </style>
</head>
<body>
<!--
http://api.map.baidu.com/place/v2/search

① query:搜索地点 (如:<input type="text" placeholder="如:肯德基" name="query">)
② region:区域中文名 (如:上海)
③ output:返回数据类型 (如:json /xml)
④ ak:密钥 (如:6E823f587c95f0148c19993539b99295)
-->
<form action="http://api.map.baidu.com/place/v2/search">
    地点(肯德基):<input class="query" type="text" name="query"> <span></span> <br>
    区域(上海):<input type="text" name="region"> <br>
    <select name="output">
        <option value="json">json</option>
        <option value="xml">xml</option>
    </select> <br>
    <input type="hidden" name="ak" value="6E823f587c95f0148c19993539b99295">
    <input type="submit" value="搜索">
</form>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script>
    $('.query').blur(function () {
        if ($(this).val().search(/.+/) == -1) {
            $(this).next().text("请输入内容").addClass('red')
        }
    })
    $('.query').focus(function () {
        $(this).next().text("")
    })
</script>
</html>

 

posted @ 2018-12-28 17:18  凌、云  阅读(118)  评论(0编辑  收藏  举报