Получить все ссылки в виде массива в jQuery - PullRequest
9 голосов
/ 23 января 2009

Мой код выглядит так:

<ul id="ulList">
  <li class="listClass" id="id1"><a href="http://link1">Link 1</a></li>
  <li class="listClass" id="id2"><a href="http://link2">Link 2</a></li>
  <li class="listClass" id="id3"><a href="http://link3">Link 3</a></li>
</ul>

Теперь мне нравится получать следующее:

Все ссылки в виде массива

Все идентификаторы li в виде массива

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 6 ]

19 голосов
/ 23 января 2009
var ids = new Array();
var hrefs = new Array();
$('#ulList li').each(function(){
  ids.push($(this).attr('id'));
  hrefs.push($(this).find('a').attr('href'));
})
13 голосов
/ 16 января 2013

Я знаю, что это старая версия, но так как мне нравятся вкладыши, которые jQuery позволяет вам писать, я решил добавить:

var allLinks = $('#ulList a').map(function(i,el) { return $(el).attr('href'); }).get();
var allIds = $('#ulList li').map(function(i,el) { return $(el).attr('id'); }).get();
6 голосов
/ 06 марта 2012

Наткнулся на этот вопрос и придумал более повторный ответ:

$.fn.collect = function(fn) {
    var values = [];

    if (typeof fn == 'string') {
        var prop = fn;
        fn = function() { return this.attr(prop); };
    }

    $(this).each(function() {
        var val = fn.call($(this));
        values.push(val);
    });
    return values;
};

var ids = $('#ulList li').collect('id');
var links = $('#ulList a').collect('href');

Вы также можете передать функцию в коллекцию следующим образом:

var widths = $('#ulList li').collect(function() {
    return this.width();
});
4 голосов
/ 23 января 2009

Это должно работать.

var ids = [],
    hrefs = []
;   
$('#ulList')
    .find('a[href]')  // only target <a>s which have a href attribute
        .each(function() {
            hrefs.push(this.href);
        })
    .end()
    .find('li[id]')   // only target <li>s which have an id attribute
        .each(function() {
            ids.push(this.id);
        })
;

// ids = ['id1', 'id2', 'id3']
// hrefs = ['http://link1', 'http://link2', 'http://link3']
1 голос
/ 14 июня 2016

Если вам нравится один лайнер и вы не любите создавать пустой массив.

[]
  .slice
  .call($('#ulList a'))
  .map(el => el.getAttribute('href'))
1 голос
/ 01 февраля 2011
var links = [], ids = [];
var $ul = $('#ulList');
var $lis = $ul.children('li');
var $as = $lis.children('a');

for(var count = $lis.length-1, i = count; i >= 0; i--){
    ids.push($lis[i].id);
    links.push($as[i].href);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...