如何筛选jQuery对象
1,DOM对象和jQuery对象的区别
- DOM对象(DOM元素)是浏览器的网页页面中渲染出来的元素
- jQuery对象是对0个,1个或多个原生DOM对象的封装,是一个类数组
- jQuery对象和原生DOM对象之间可以相互转换
$(domObject) : jQuery Object
$(xxx).get(0) : DOM Object
$(xxx)[0] : DOM Object
- 检测DOM对象还是jQuery对象的方法:
obj.jquery
,obj.nodeType
2,创建元素
var div = $('<div>hello word</div>');
console.log($('div')); //在没有放到页面之前无法选中
div.appendTo('body'); //追加到body的最后面
console.log($('div')); //在没有放到页面之后可以选中
3,设置元素属性
$(function()
{
//方法一:声明一个空元素,然后再设置属性
var link1 = $('<a>',{
text:'baidu',
href:'http://www.baidu.com',
target:'_blank_',
title:'goto baidu'
});
link1.appendTo('body');
//方法二:非空元素的情况,用attr实现
var link2 = $('<a>baidu</a>').attr({
// text:"baidu",
href:'http://www.baidu.com',
target:'_blank_',
title:'goto baidu'
});
link2.appendTo('body');
})
4,检查和获取元素
//用length属性检查元素数量
var elements1 = $('li');
console.log(elements1.length); //值为9
//提取元素:方法1
//[index] 返回DOM元素
//get([index]) 返回DOM元素或元素集合
console.log(elements1[0]); //获取item-1
console.log(elements1.get(0)); //获取item-1
// console.log(elements1[]); //!!这样不可以,会报错!!
console.log(elements1.get()); //获取item-1~item-9 返回一个数组
console.log(elements1[-1]); //这样不可以,返回值是undefined
console.log(elements1.get(-1)); //获取item-9
console.log(elements1[100]); //越界,返回值是undefined
console.log(elements1.get(100));//越界,返回值是undefined
console.log(elements1.toArray());//跟get()一样
//提取元素:方法2
//eq(index) 返回jQuery对象
console.log(elements1.eq(0)); //获取item-1
console.log(elements1.eq()); //什么都不返回,跟get()不一样
console.log(elements1.eq(-1)); //获取item-9
console.log(elements1.eq(100)); //什么都不返回
console.log(elements1.first()); //获取第一个元素item-1
console.log(elements1.last()); //获取最后一个元素item-9
注意1:api官方文档
注意2:尽量使用方法而不是筛选器获取jQuery对象,因为方法的效率比较高
5,通过关系查找jQuery对象
- 通过父子关系查找
//children([selector]) 直接子元素 不返回文本节点
console.log($('#box3').children());
//contents([selector]) 直接子元素 返回文本节点(包括换行)
console.log($('#box3').contents());
//children([selector]) 直接子元素(selector) 不返回文本节点
console.log($('#box3').children('ul'));
//contents([selector]) 直接子元素(selector),返回文本节点(不包括换行)
console.log($('#box3').contents('ul'));
//find(selector) 后代元素 包括子元素和孙子元素
console.log($('#box3').find('.item3')); //注意:.item3
//parent([selector]) 直接父元素
console.log($('#info').parent());
//parents([selector]) 祖先元素 包括父元素和祖父元素等
console.log($('#info').parents());
//parent([selector]) 直接父元素(selector)
console.log($('.item3').parent('div')); //直接父元素如果是div,能找到,否则找不到
//parents([selector]) 祖先元素(selector) 包括父元素和祖先元素
console.log($('.item3').parents('div')); //找到所有div元素
//parentsUntil([selector]) 到selector为止(不包含selector),不包括selector
console.log($('#info').parentsUntil('#box2'));
//closest(selector) 从当前元素开始向上逐级查找,并返回最先匹配的元素
console.log($('#info').closest('#box2'));
// closest与parents的区别:
// closest是从当前元素开始匹配的,parents是从父元素开始匹配的
// closest向上找,找到匹配的就停止,parents会找到所有的父元素,并返回一个集合
// closest返回1个或0个,parents能返回多个
- 通过兄弟姐妹关系查找
//next([selector]) 当前元素之后紧邻的同辈元素
console.log($('.item4').next('li'));
//nextAll([selector]) 当前元素之后所有的同辈元素
console.log($('.item4').nextAll('li'));
//nextUntil([selector]) 当前元素之后所有的同辈元素 selector为止(不包括selector)
//如果不写selector,那么效果和.nextAll()一致
console.log($('.item4').nextUntil('.item7'));
//prev([selector]) 当前元素之前紧邻的同辈元素
console.log($('.item4').prev('li'));
//prevAll([selector]) 当前元素之前所有的同辈元素
console.log($('.item4').prevAll('li'));
//prevUntil([selector]) 当前元素之前所有的同辈元素 selector为止
console.log($('.item4').prevUntil());
//siblings([selector]) next + prev
console.log($('.item6').siblings('li'));
6,筛选和遍历jQuery对象
- 添加/过滤元素
//add(selector) 增加元素
console.log($('.item1,.item2,.item3'));
console.log($('.item1').add('.item2').add('.item3'));
//not(selector) 过滤元素 方法一
console.log($('li').not('.item4'));
//filter(selector) 过滤元素 方法二
//与not相反
console.log($('li').filter('.item4'));
//使用函数
console.log($('li').not(function(index)
{
return $(this).hasClass('item4');
}));
console.log($('li').filter(function(index)
{
return $(this).hasClass('item4');
}));
//has(selector) 过滤元素 方法三
//筛选包含特定对象的元素
console.log($('li').has('ul'));
- 获取子集,转换元素
//slice(start[,end]) 获取子集
console.log($('li').slice(3,5)); //左闭右开 NO.3 NO.4
console.log($('li').slice(-2)); //左闭右开 NO.8 NO.9
//map(callback) 转化元素
//将一个jQuery对象装换为另一个jQuery对象
console.log();
console.log($('div').map(function(index,domElement)
{
return this.id;
// return null; 返回值不会加入到集合中
// return undefined; 返回值不会加入到集合中
//return domElement.id; 和this.id是一样的效果
}));
- 遍历元素
//each(iterator) 遍历元素
console.log($('div').each(function(index,domElement)
{
if(this.id === 'box2')
{
// return true; //相当于continue
return false; //相当于break
}
this.title = this.id; //this.innerText和this.innerHTML一样
}))
7,其他操作
//is(selector) 存在元素,返回ture,反之返回false
console.log($('#box3').children().is('p'));
console.log($('#box3').children().is('img'));
//end() 将匹配元素集还原到之前的操作状态
//end方法之前必须是以一个破坏性操作,否则会返回一个空对象
//破坏性操作:map(),children(),not(),filter(),next(),find(),parent()
console.log(
$('#box3').find('.item4').css('color','red') //这个操作之后jQuery对象已经点位在item4上了
.end().find('.item6').css('color','blue') //所以,必须先执行end(),把对象重新定位到box3上
);
//addBack([selector]) 在进行破坏性操作之后,把原来的元素也包含进来
//.item7,.item8都会设置颜色样式
console.log($('.item7').nextUntil('.item9').addBack().css('color','orange'));
对jQuery对象的属性,特性,以及数据的操作
1,特性和属性的区别
//特性:attribute:值为string,要已经写在标签内的内容,否则取出来就是未定义
//属性:properties:值为string,boolean,number,object
var checkbox = document.getElementById('check');
console.log(checkbox.getAttribute('tabindex')); //获取特性
console.log(checkbox.tabIndex); //获取属性(驼峰形式)
console.log(checkbox.getAttribute('style')); //获取特性
console.log(checkbox.style); //获取属性
console.log(checkbox.getAttribute('checked')); //获取特性
console.log(checkbox.checked); //获取属性 checked,selected等布尔类型的属性要用获得属性的方法!!
// 特性与属性的区别:
//1. 如果attribute是本来在DOM对象中就存在的,attribute和properties的值就会同步;
//2. 如果attribute是本来在DOM对象中就存在,但是类型为Boolean,那么attribute和properties的值就不会同步;
//比如checkbox的checked属性
//3. 如果attribute不是DOM对象内建的属性(比如是自己瞎写的),attribute和properties的值不会同步;
//4. 特性不区分大小写,属性区分大小写
//特例1:虽然会同步,但是值不一样
//img的src属性:绝对地址
//img的src特性:相对地址
//特列2:虽然会同步,属性名和特性名不一样
//属性名:className 由于class是js的保留字,无法直接用于属性
//特性名:getAttribute('class')
知识点:一般情况下,操作特性就可以了,只是在某些特定情况下,需要操作属性(比如checked,selected等布尔类型的属性)
2,获取,设置,删除特性
//!!特性不区分大小写!!
var img = $('img');
console.log(img.attr('title')); //获取第一个元素的特性
console.log(img.attr('title','123')); //设置所有元素的特性 !!这里需要注意,并不是第一个,而是所有img元素
//同时操作复数个特性
img.attr(
{
title:'new title',
alt:'new alt',
tabindex:2 //会自动转换为字符串
});
//使用操作特性
// previousValue:更改前的特性值
img.attr('title',function(index,previousValue)
{
console.log(previousValue);
return previousValue + 'new';
});
// removeAttr(name)删除特性
img.removeAttr('title'); // 删除title特性
img.removeAttr('alt tabindex'); // 删除alt,tabindex特性
3,获取,设置,删除属性
//!!属性区分大小写!!
var img = $('img'),
checkbox = $('#check');
//获取属性
console.log(checkbox.prop('checked')); //返回值false
console.log(checkbox.prop('Checked')); //返回值undefined,因为属性区分大小写
console.log(checkbox.checked); //返回值undefined,因为checkbox是一个jQuery对象
console.log(checkbox.get(0).checked); //返回值false,因为把jQuery对象转换成了DOM对象
console.log(checkbox.attr('checked')); //返回值undefined,因为特性不存在
console.log(img.prop('class')); //返回值img-jQuery,可以直接获取classname
console.log(img.prop('className')); //返回值img-jQuery,跟上面是一样的
console.log(checkbox.prop('tabindex')); //返回值1
console.log(checkbox.get(0).tabindex); //返回值undefined,因为在DOM里面一定要用驼峰形式获取
console.log(checkbox.get(0).tabIndex); //返回值1
//改变属性
console.log(checkbox.prop('tabindex',2)); //改变tabindex的值为2
//!!建议用prop来更改是否被选中,因为attr会改变HTML的结构!!
console.log(checkbox.prop('checked',true)); //改变checked的值为true
//删除属性 一次只能删除一个属性
checkbox.removeProp('title'); //title的值变为undefined,这是为了防止直接删除内置属性的话,浏览器报错
4,在元素中存取数据
- 获取数据
<img id ="log" src="logo.jpg"
alt="jQuery logo" class="img-jQuery" title="jQuery logo"
data-id='1' data-data1='html data1' />
var img = $('img'),
checkbox = $('#check');
//获取数据
console.log(img.data('data1')); // img标签中有data-data1特性,这种形式可以获取到它的值
console.log(checkbox.data('description')); //返回值undefined,因为还没有对这个属性的数据设置过任何值
checkbox.data('description','some desc'); //设置值为some desc
console.log(checkbox.data('description')); //返回值some desc,因为已经对这个属性的数据设置了值为some desc
checkbox.data('lastdesc','some desc');
console.log(checkbox.data('lastdesc')); //返回值为some desc
console.log(checkbox.data('lastDesc')); //返回值为undefined
console.log(checkbox.data('last-desc')); //返回值为undefined
checkbox.data('firstDesc','some desc');
console.log(checkbox.data('firstdesc')); //返回值为undefined
console.log(checkbox.data('firstDesc')); //返回值为some desc
console.log(checkbox.data('first-desc')); //返回值为some desc
checkbox.data('mid-desc','some desc');
console.log(checkbox.data('middesc')); //返回值为undefined
console.log(checkbox.data('midDesc')); //返回值为some desc
console.log(checkbox.data('mid-desc')); //返回值为some desc
checkbox.data('Cen-desc','some desc');
console.log(checkbox.data('cendesc')); //返回值为undefined
console.log(checkbox.data('cenDesc')); //返回值为undefined
console.log(checkbox.data('CenDesc')); //返回值为some desc 首字母要一样
console.log(checkbox.data('cen-desc')); //返回值为undefined
console.log(checkbox.data('Cen-desc')); //返回值为some desc 首字母要一样
//总结1:如果用驼峰或者“-”形式来命名数据,那么获取数据时驼峰和“-”形式都可以用
//总结2:如果不用驼峰或者“-”形式来命名数据,那么获取数据时一定要和命名的名字一样才行
- 修改数据
var img = $('img');
//更改数据 单个操作
img.data('data1','new data1');
//更改数据 多个操作
img.data({
data3:'new data3',
data4:'new data4',
data5:'new data5'
});
- 删除数据
var img = $('img');
img.data({
data3:'new data3',
data4:'new data4',
data5:'new data5'
});
//删除数据
// img.removeData('data1'); //这种情况是删除不掉的,因为在HTML标签内本来就存在data1
// console.log(img.data());
// img.removeData('data3 data4'); //删除方法1 空格
// console.log(img.data());
// img.removeData(['data3','data4']); //删除方法2 数组
// console.log(img.data());
img.removeData(); //删除方法3 删除全部
- 判断数据是否存在
var img = $('img');
img.data({
data3:'new data3',
data4:'new data4',
data5:'new data5'
});
//!!注意:如果上面这一段代码被删除的话,那下面的值都是false
//因为hasData方法的判断不包括HTML标签里的data
//判断是否有数据 jQuery.hasData(element) 注意这里是DOM元素
console.log($.hasData(img)); //返回值false jQuery元素
console.log($.hasData(img.get(0))); //返回值true DOM元素
网友评论