天天看点

jQuery 学习笔记(二)

要点

  1. 掌握索引值的获取方法
  2. 必须掌握动态设置class的方法
  3. 理解链式编程的基本思路
  4. 掌握表单相关方法
  5. 必须掌握节点的添加删除操作
  6. 掌握jQuery的事件委托语法
  7. 掌握键盘事件和键码(13)的使用

一、动态设置class的方法

1.1、索引值方法

在JS中,一堆元素的排序是按照索引值来排列的,索引值是从0开始,并且用index来表示.

在JQ中,**index()**是一个方法(函数),所以必须加括号!用来获取当前元素在父级中的索引值。

语法:

代码举例:

// 原生方法
var btns = document.getElementsByTagName("button");
for (var i = 0; i < btns.length; i++) {
    btns[i].setAttribute("myindex", i);
    btns[i].onclick = function () {
      	console.log(this.getAttribute("myindex"));
    };
}

// JQ index方法
$("button").click(function(){	
  var index = $(this).index();
  console.log(index);
})
           

索引值可以说是JS里面非常重要的一个组成部分,经常使用于以下几种状况:导航栏、tab栏、焦点图等等功能的实现。

1.2、 addClass与removeClass方法

语法:

// 给某个元素添加类名,理论上,一个标签可以添加无数多个类名,用空格分开
$(selector).addClass(“className1  className2  className3”)

// 给某个元素移除类名
$(selector).removeClass(“className1  className2  className3”)
           

练习(Tab栏)

提供html与css代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Tab栏</title>
    <style type="text/css">
        div,
        span,
        ul,
        li,
        h2,
        body {
            padding: 0;
            margin: 0;
            list-style: none;
        }

        .all {
            width: 440px;
            border: 1px solid #000;
            padding: 10px;
            margin: 80px auto;
        }

        .all h2 {
            height: 30px;
            text-align: center;
            display: flex;
            justify-content: space-between;
        }

        .all h2 span {
            width: 100px;
            height: 30px;
            background: #CCC;
            text-align: center;
            cursor: pointer;
        }

        .all h2 span.current {
            background: #FF3366;
        }

        .all ul li {
            display: none;
            background: #FF3366;
            height: 200px;
        }

        .all ul li.current {
            display: block
        }
    </style>
</head>
<body>
    <div class="all">
        <h2>
            <span class="current">新闻</span>
            <span>娱乐</span>
            <span>游戏</span>
            <span>财经</span>
        </h2>
        <ul>
            <li class="current">新闻</li>
            <li>娱乐</li>
            <li>游戏</li>
            <li>财经</li>
        </ul>
    </div>
</body>
</html>
           

《Tab栏》案例代码:

// 原生方法
var btns = document.getElementsByTagName("span");
var pages = document.getElementsByTagName("li");
for (var i = 0; i < btns.length; i++) {
    btns[i].index = i;
    btns[i].onmouseenter = function () {
        for (var j = 0; j < btns.length; j++) {
            btns[j].className = "";
            pages[j].className = "";
        }
        this.className = "current";
        pages[this.index].className = "current";
    };
}

// JQ方法
$("span").hover(function () {
    var index = $(this).index();
    $(this).addClass("current").siblings().removeClass("current");
    $("li").eq(index).addClass("current").siblings().removeClass("current");
});
           

1.3、 toggleClass

语法:

// 切换某个元素的类名(添加或删除)
$(selector).toggleClass(“className”)
           

练习(百度风云榜)

提供html和css代码:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>百度风云榜</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            border: 0;
            list-style: none;
        }

        ul {
            padding: 10px;
            margin: 100px auto;
            border: 1px solid #000;
            width: 100px;
        }

        ul>li {
            cursor: pointer;
        }

        span {
            background: url(images/close.gif) no-repeat left center;
            padding-left: 20px;
        }

        span.open {
            background-image: url(images/open.gif);
        }

        ol {
            display: none;
            margin-left: 20px;
        }
    </style>
</head>
<body>
    <ul>
        <li>
            <span>音乐</span>
            <ol>
                <li>你好毒</li>
                <li>该死的温柔</li>
                <li>演员</li>
            </ol>
        </li>
        <li>
            <span>电影</span>
            <ol>
                <li>釜山行</li>
                <li>战狼</li>
                <li>杀破狼</li>
            </ol>
        </li>
        <li>
            <span>小说</span>
            <ol>
                <li>天龙八部</li>
                <li>三生三世</li>
                <li>小时代</li>
            </ol>
        </li>
    </ul>
</body>
</html>
           

《百度风云榜》案例代码:

$('span').click(function(){
  // 让当前列表切换收放
  $(this).toggleClass('open').siblings('ol').slideToggle();
  // 让其他列表收起
  $(this).parent().siblings().children('ol').slideUp().siblings('span').removeClass('open');
})

// 代码优化:
// 链式编程的原理:每一个方法都会去找最近的一个对象(事件源)
$('span').click(function(){
  $(this).toggleClass('open')// "当前span"
    	 .siblings('ol')// 将事件源"当前span"变成了"当前ol"
          .slideToggle()// "当前ol"
          .parent()// 将"当前ol"变成了"当前父级li"
          .siblings()// 将"当前父级li"变成了"其他父级li"
          .children('ol')// 将"其他父级li"变成了"其他父级的ol"
          .slideUp()// "其他父级的ol"
          .siblings('span')// 将"其他父级的ol"变成了"其他父级的span"
          .removeClass('open');// "其他父级的span"
})
           

二、表单相关方法

2.1、val获取表单中的值

获取input 或 textarea 的值我们可以通过以下方式获取:

// ()内部写入文本可以实现修改功能
$('input').val()
$('textarea').val()
           

获取select下拉框的值

<select id="selectBrowser">
    <option value="1">pc</option>
    <option value="2">phone</option>
    <option value="3">pad</option>
</select>
<script>
    $("#selectBrowser").change(function(){
        console.log($(this).val());
    })
</script>
           

2.2、trim去除前后空格

表单输入时去除前后空格,我们可以用:

$.trim()
           

代码示例:

// 通常来说提交表单时,输入框的值是不允许为空的,并且包括空格,这样的数据是无意义的,此时需要做校验,提示用户重新输入
var val = $('input').val();
if( $.trim(val)=="" ){
  	alert('请重新输入');
}
           

三、节点控制

3.1、什么是节点

关于节点,其实在body里面,任何标签、文字、图片、空格、换行等都是节点,既然是节点,就拥有增、删、改、查这几个功能。

节点node nodeType nodeName nodeValue
元素节点 1 标签名(大写) null
属性节点 2 属性名 属性值
文本节点 3 #text 文本内容
CDATA节点 4 #cdata-section CDATA区域内容
实体引用名称节点 5 引用名称 null
实体名称节点 6 实体名称 null
处理指令节点 7 target entire content cluding the target
注释节点 8 #comment 注释内容
文档节点 9 #document null
文档类型节点 10 doctype的名称 null
文档片段节点 11 #document-fragment null
DTD声明节点 12 符号名称 null

3.2、增加子节点(重点)

语法:

// 在某个元素的子级中,往后面添加节点
$(element).append('子节点')
// 在某个元素的子级中,往前面添加节点
$(element).prepend('子节点')
           

代码举例:

<input type="text">
  <button class="before">往前添加</button>
<button class="after">往后添加</button>
<ul>
  <li>我本来就存在</li>
</ul>

<script>
  // 点击增加一个li标签在ul的最前
  $('.before').click(function(){
    var val = $.trim($('input').val());
    if(val)$('ul').prepend('<li>'+val+'</li>');
    $('input').val("");
  })

  // 点击增加一个li标签在ul的最后
  $('.after').click(function(){
    var val = $.trim($('input').val());
    if(val)$('ul').append('<li>'+val+'</li>');
    $('input').val("");
  })
</script>
           

3.3、增加同级节点(重点)

语法:

// 在element之前添加兄弟节点
$(element).before('兄弟节点') 
// 在element之后添加兄弟节点
$(element).after('兄弟节点') 
           

代码举例:

<button>兄弟前添加</button>
<button>兄弟后添加</button>
<div>
  <p class="brother"></p>
</div>

<script>
  // 点击增加一个标签在p.brother之前
  $('button').eq(0).click(function(){
    $('.brother').before('<p>我是前p</p>');
  })

  // 点击增加一个标签在p.brother之后
  $('button').eq(1).click(function(){
    $('.brother').after('<p>我是后p</p>');
  })
</script>
           

3.4、节点的删除(重点)

语法:

// 将element节点中的子级节点包括内容清空
$(element).empty();
// 删除element节点包括内容
$(element).remove();
           

代码举例:

$('button').eq(0).click(function(){
  $('ul').empty();  // 清空ul中的内容
})

$('button').eq(1).click(function(){
  $('ul').remove(); // 直接删除ul
})
           

3.5、节点的替换

语法:

// 用后者替代前者
$(element1).replaceWith(element2);
           

代码举例:

$('button').click(function(){
    // p替代li
    $('li').eq(1).replaceWith(`<p>这是个p标签</p>`);
})
           

四、事件委托

定义:

事件委托是利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件。

为什么使用事件委托:

  1. 考虑一个ul,在li的数量非常少的时候,为每一个li添加事件当然会使用for循环;但是数量多的时候这样做太浪费内存,长到上百上千上万的时候,为每个li添加事件就会对页面性能产生很大的影响。
  2. 给一个ul里面的几个li添加了事件但是如果动态又生成了li则刚生成的li不具备事件这时就需要用到委托。

事件委托的作用:

  1. 性能要好(为多个相同元素绑定事件)
  2. 针对新创建的元素,直接可以拥有事件(为不存在的元素绑定事件)

语法:

// 事件和函数是必填的,子级选择器选填(不填就是普通事件绑定)
$(selector).on(事件,children,function(e){...})
           

代码举例:

// 1ms之后再添加一下li元素
setTimeout(function () {
  	$('ul').append('<li>6</li>')
}, 1)
// 普通事件绑定(办不到)
// $('li').click(function(){
//     var index=$(this).index()+1
//     console.log(index);
// })
// 事件委托(重点)
$('ul').on('click', 'li', function () {
    var index = $(this).index() + 1
    // 此时this指向的是‘li’
    console.log(this, index);
})

// 事件解绑
$('ul').click(function(){
    console.log(111);
})
$("button").click(function(){
    $('ul').off('click', 'li')
})

// 另一种诡异写法(JQ项目很多这样的写法)
setTimeout(function () {
  	$('ul').append('<li οnclick="getIndex(this)">6</li>')
}, 1)
function getIndex(myThis){
    var index=$(myThis).index()+1
    console.log(index);
}
           

五、键盘事件和键码

5.1、键盘事件

我们已经讲过了很多鼠标事件,可以直接使用

$(selector).事件(function(){...});

,接下来我们来学习键盘事件,用法也是类似的:

$(selector).keydown(function(){...});// 键盘按下事件
$(selector).keyup(function(){...});// 键盘松开事件
           

5.2、键码

e.keyCode – 键码

这里提供一张键码表,但并不需要专门去记住:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nm8WpX6f-1628046221788)(.\images\keycode.png)]

六、作业:微博发布

项目链接:http://codesohigh.com/weibo/

请完成以下效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sdkdy4ad-1628046221791)(.\images\homework3.gif)]

思路提示:

  1. 聚焦(focus)、失焦(blur) 事件设置边框的颜色
  2. 输入事件(建议使用keyup)要判断 “发布” 按钮是否可点击(样式和实际flag)
  3. 聚焦事件也需要判断“发布” 按钮是否可点击(可以封装成函数)
  4. 通过keyCode可以判断回车(13或enter),可以进行发布操作(将发布功能封装成函数)
  5. 点击"发布"按钮,可以直接掉用发布方法
  6. 点击删除的效果,使用jq的事件委托

提供html+css代码(动画不做要求,主要完成功能):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>微博发布</title>
    <style>
        *{margin: 0;padding: 0;border: 0;list-style: none;}
        body{background: #efefef;}
        section{overflow: hidden;width: 800px;padding: 10px;background: #fff;margin: 100px auto 20px;}
        h4{color: #426c81;font-weight: normal;}
        textarea{width: 100%;resize: none;border: 1px solid #ccc;outline: none;margin-top: 10px;margin-bottom: 10px;height: 70px;}
        div{width: 90px;height: 30px;line-height: 30px;text-align: center;background: #ff8140;color: #fff;border-radius: 6px;float: right;opacity: 0.8;cursor: not-allowed;}
        ul{width: 800px;padding: 10px;background: #fff;margin: 0 auto;overflow: hidden;}
        li{border-bottom: 1px dashed #ccc;line-height: 30px;height: 30px;margin-top: 5px;display: flex;justify-content: space-between;align-items: center;padding: 0 10px;width: 100%;box-sizing: border-box;}
        p{width: 95%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
        span{cursor: pointer;width: 20px;height: 20px;text-align: center;line-height: 20px;background: #ccc;border-radius: 3px;}
        textarea.active{border-color: #ff8140;}
        div.active{opacity: 1;cursor: pointer;}
    </style>
</head>
<body>
    <section>
        <h4>有什么新鲜事想告诉大家?</h4>
        <textarea></textarea>
        <div>发布</div>
    </section>
    <ul>
        <!-- <li>
            <p></p>
            <span>x</span>
        </li> -->
    </ul>
</body>
</html>