jQuery选择器

2016-12-01   |     |     |  

$符号

$是著名的jQuery符号。实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名:

选择器

选择器通用形式是:$(‘’)

jquery 和 DOM对象转换

var div = $('#abc'); // jQuery对象var divDom = div.get(0); // 假设存在div,获取第1个DOM元素var another = $(divDom); // 重新把DOM包装为jQuery对象

jquery对象

选择器选择出来的是jquery对象,可以直接访问它的属性

var ps = $('p[name=abc]');
ps.name
ps.class
ps.innerHTML
……

基本选择器

按tag查询 : $(‘tag’)

var ps = $('p'); // 返回所有<p>节点
ps.length; // 数一数页面有多少个<p>节点

按id查询 : $(‘#id’)

根据id查询,直接在前面加上一个#就好了

var div = $('#abc');

如果不存在,返回[],不用判断undefinednull

按class查询: $(‘.class’)

多个class可以直接加,不用加空格

var a = $('.red.green'); // 注意没有空格!

按属性查询:$(‘[attr = xxx]’)

var email = $('[name=email]'); // 找出<??? name="email">

如果含有特殊字符则要用“”‘’括起来

按前缀查 : ^=

var icons = $('[name^=icon]'); // 找出所有name属性值以icon开头的DOM

按后缀查:$=

var names = $('[name$=with]'); // 找出所有name属性值以with结尾的DOM

组合查询

组合查找就是把上述简单选择器组合起来使用。如果我们查找$(‘[name=email]’),很可能把表单外的<div name=”email”>也找出来,但我们只希望查找<input>,就可以这么写:

var emailInput = $('input[name=email]'); // 不会找出<div name="email">

同样的,根据tag和class来组合查找也很常见:

var tr = $('tr.red'); // 找出<tr class="red ...">...</tr>

多项选择器:,

多项选择器就是把多个选择器用,组合起来一块选:

$('p,div'); // 把<p>和<div>都选出来
$('p.red,p.green'); // 把<p class="red">和<p class="green">都选出来

层级选择器: 空格

$('ul.lang li');

这种层级选择器相比单个的选择器好处在于,它缩小了选择范围,因为首先要定位父节点,才能选择相应的子节点,这样避免了页面其他不相关的元素。

子选择器:>

子选择器$(‘parent>child’)类似层级选择器,但是限定了层级关系必须是父子关系,就是<child>节点必须是<parent>节点的直属子节点

过滤器

过滤器一般不单独使用,它通常附加在选择器上,帮助我们更精确地定位元素。观察过滤器的效果:

$('ul.lang li'); // 选出JavaScript、Python和Lua 3个节点

$('ul.lang li:first-child'); // 仅选出JavaScript$('ul.lang li:last-child'); // 仅选出Lua$('ul.lang li:nth-child(2)'); // 选出第N个元素,N从1开始
$('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素
$('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素

表单相关选择器

针对表单元素,jQuery还有一组特殊的选择器:


  • :input:可以选择<input>,<textarea>,<select><button>

  • :file:可以选择<input type=”file”>,和input[type=file]一样;

  • :checkbox:可以选择复选框,和input[type=checkbox]一样;

  • :radio:可以选择单选框,和input[type=radio]一样;

  • :focus:可以选择当前输入焦点的元素,例如把光标放到一个<input>上,用$(‘input:focus’)就可以选出;

  • :checked:选择当前勾上的单选框和复选框,用这个选择器可以立刻获得用户选择的项目,如$(‘input[type=radio]:checked’)

  • :enabled:可以选择可以正常输入的<input>、<select>等,也就是没有灰掉的输入;

  • :disabled:和:enabled正好相反,选择那些不能输入的。

查找和过滤

find

最常见的查找是在某个节点的所有子节点中查找,使用find()方法,它本身又接收一个任意的选择器。

var ul = $('ul.lang'); // 获得<ul>var dy = ul.find('.dy'); // 获得JavaScript, Python, Schemevar swf = ul.find('#swift'); // 获得Swift 
var hsk = ul.find('[name=haskell]'); // 获得Haskell

对于位于同一层级的节点,还可以通过next()prev()方法,

filter

filter()方法可以过滤掉不符合选择器条件的节点:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var a = langs.filter('.dy'); // 拿到JavaScript, Python, Scheme

或者传入一个函数,要特别注意函数内部的this被绑定为DOM对象,不是jQuery对象:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell

langs.filter(function () {return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点
}); // 拿到Swift, Scheme

map

map()方法把一个jQuery对象包含的若干DOM节点转化为其他对象:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var arr = langs.map(function () {return this.innerHTML;
}).get(); // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell']

此外,一个jQuery对象如果包含了不止一个DOM节点,first()、last()和slice()方法可以返回一个新的jQuery对象,把不需要的DOM节点去掉:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var javascript = langs.first(); // JavaScript,相当于$('ul.lang li:first-child')
var haskell = langs.last(); // Haskell, 相当于$('ul.lang li:last-child')
var sub = langs.slice(2, 4); // Swift, Scheme, 参数和数组的slice()方法一致

练习

Gender:

输入值后,用jQuery获取表单的javascriptON字符串,key和value分别对应每个输入的name和相应的value,例如:{“name”:”Michael”,”email”:…}

function getjavascripton(){
    var javascripton = {};
    var element = $('#test-form :input');   //:input可以选<input>,<textarea>,<select>和<button>;

    //element.filter('input :unchecked');
    for(var i = 0;i < element.length;i++)
    {
        var tmp = element[i];
        //if(tmp.type !== 'submit') //gender永远选的是f,因为这里是2个input
        if(tmp.type !== 'submit' && (tmp.type !== "radio" || tmp.checked))
            javascripton[tmp.name] = tmp.value;

    }

    javascripton = javascriptON.stringify(javascripton);   //变成字符串
    alert(javascripton);
    return false;
}

更好的实现:

    function getjavascripton(){
    var javascripton = {};
    $('#test-form :input[type!=submit]').map(function(){  //直接过滤了submit
        if(this.type !== "radio" || this.checked){   //过滤了那个没有被选中的radio
            javascripton[this.name] = this.value;
        }
    });
    javascripton = javascriptON.stringify(javascripton);
    alert(javascripton);
    return false;
}