jq-02 选择器
一、选择器
选择器的实现比较复杂,消耗性能比较大,建议相同的选择器进行变量保存操作,避免重复使用选择器;
css选择器
可以使用所有的样式选择器;
选择器 | 说明 |
---|---|
#id | 获取id名 |
.class | 获取class类名 |
div | 获取标签名 |
div,p,li | 群组选择器 |
div.red | 获取class为red的div标签 |
div>span | 获取div下的直接子元素span; |
div span | div下的所有子元素span标签; |
div~span | 选择下面所有的; |
基本筛选选择器
选择器 | 说明 |
---|---|
:first | 第一个 |
:last | 最后一个 |
:eq(index) | 指定第一个,下标从0开始; |
:not() | 除了小括号的标签; |
:odd | 下标为奇数的标签,下标是从0开始的,所以选择的是偶数标签; |
:even | 下标为偶数的标签 |
:gt(1) | 下标大于1的元素 |
:lt(1) | 下标小于1的元素; |
:header | 所有h标签; |
:root | 选中html标签; |
:animated | 匹配所有正在执行动画效果的元素; |
$("div:not(:animated)").animate({"width":"+=200"})
//给没有在动画的div,加长
内容选择器
选择器 | 说明 |
---|---|
:contains(我) | 选择内容有我的标签 |
:empty | 选择内容为空的标签,有空格或标签都不为空; |
:parent | 选择有内容的标签; |
:has(span) | 选择有span标签的标签; |
隐藏看见
选择器 | 说明 |
---|---|
:hidden | 获取看不见的标签(在页面中不显示的标签) type="hidden" 和display:none; |
:visible | 获取可以看见的标签,页面中显示的 |
属性选择器
选择器 | 说明 |
---|---|
div[class] | 有class属性的 |
div[class=box] | div的class属性值为box的; |
div[class^=box] | 以box开头的 |
div[class$=box] | 以box结尾的 |
div[class*=box] | 包含box的; |
div[class][title] | 有class属性并且有title属性的; |
子元素选择器
选择器 | 说明 |
---|---|
ul li:first-child | 选择所有父元素中第一个li first的区别:第一个父元素下所有li中的第一个li |
ul li:last-child | 选择所有ul下的最后一个li; |
:nth-child() | 选择指定的第几个标签,从1开始 |
:first-of-type | 选择第一次出现的; |
:last-of-type | 最后一次出现的; |
:nth-of-type() | 指定的第几个标签; |
child
:是从第一个孩子开始找;
of-type
:是从第一次出现的孩子找的;
表单选择器
:input
选中所有表单标签,包括select、textarea;
选中具体某个input标签可以冒号type类型,select直接使用标签选择器;
例:
:text
选中单文本框;
.attr("checked",true)
;设置复选框被选中状态
表单对象属性
选择器 | 说明 |
---|---|
:enabled | 选中所有可用的; |
:disabled | 选中所有禁用的; |
:checked | 选中的; |
:selected | 下拉框被选中的; |
二、迭代
$.each
$.each($('li'), function(index, item) {})
// or
$('li').each(function(index, item){
// 这里的item是每个元素, 使用jquery需要再次$(item)
// 也可以$(this), this指向当前这个item
})
$.map
var arr = [1,2,3,4]
$.map(arr, function(item, index){
})
当map操作数组返回null和undefined时,不会保存在新的数组中;
$.map不能直接$(b).map(function(){})
;
var ary = [1,2,3,4]
var aa = $.map(ary,function(a,b){
if(a>3){
return null
}else{
return a
}
});
console.log(aa); //[1,2,3],4满足条件,返回空;
这里的aa是dom元素的,如果$(ary).map调用的话直接将类型转换jquery元素了;低版本浏览器会发生不兼容;标准调用方法是$.map(ary,function(){})
;
三、extend
扩展
$.extend(obj,obj1,obj2)
;将obj1和obj2扩展到obj中,一般obj是一个空对象{};
var obj3 = $.extend({},obj1,obj2)
深拷贝
复制地址和数据
原理:根据地址找到内容,并复制内容在堆中重新存储,返回新的地址;新的值修改的地址不影响旧的值;
var obj2 = $.extend(true,{},obj3)
默认是false(浅拷贝);true深拷贝;如果不用true相当于声明了两个变量(加载慢);如果用true就是拷贝;
var obj4 = {name:"zs"};
var obj6 = $.extend(true,{},obj4);
obj6.name = "ls";
console.log(obj6); //ls
console.log(obj4); //zs
浅拷贝(原生方法)
只复制地址,不复制数据;修改新变量的值,旧变量的值也一起修改了;
var obj4={name:"zs"};
var obj5=obj4;
obj5.name="ls";
console.log(obj5.name); //ls
console.log(obj4.name); //ls
原理:复制了obj4的地址,数据没有复制,所以修改了内容,obj4的地址也是那个内容,所以obj4就是obj5的内容;
四、方法
所有事件的调用:$("button").click(function(){})
;
直接去掉on;直接括号函数,
.index();元素的下标;
jquery选项卡
$("button").click(function(){
$(".box div").eq($(this).index()).addClass("active").siblings("div").removeClass();
$(this).addClass("on").siblings("button").removeClass();
})
//链式调用,可以一直写点,
//隐式循环,不用循环,隐式调用循环;
高频面试题
● $(document).ready() 方法和 window.onload 有什么区别?
● jQuery 的属性拷贝 (extend) 的实现原理是什么,如何实现深拷贝?