Создание массива с jQuery идентификаторами объектов для обработки на бэкэнде Django - PullRequest
6 голосов
/ 11 февраля 2011

У меня есть некоторый javascript, который создает li на основе объекта, возвращенного из бэкэнда после поиска AJAX.Пользователь может продолжать поиск устройств, и когда они выбраны, они добавляются на текущую страницу (как li).Каждый раз, когда создается новый li, я хочу отправить идентификаторы объектов, которые уже были выбраны.

Когда создаются li, их идентификаторы называются «device - ###» где ###это идентификатор устройства в базе данных, поэтому мне нужно удалить эту часть.

Вот javascript, который доставляет мне проблемы:

        var children = $('#temp_inventory').children();
        var count = children.length;
        var devices = [];
        var i = 0;
        while (i<=count){
            devices[i] = children[i].id.substr(4);
            i++;
        };

Я получаю следующую ошибку:

Uncaught TypeError: Object #<HTMLLIElement> has no method 'attr'

Я также пробовал не-jQuery способом:

devices[i] = children[i].id.substr(4);

И я получаю эту ошибку:

Uncaught TypeError: Cannot read property 'id' of undefined

Когда я добавляю alert(children[i].id.substr(4));, я получаю предупреждение с ожидаемым номером.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Частично проблема заключается в том, что ваш цикл использует <= вместо <.Помните, что последний элемент в списке, который использует индекс с нуля, равен length - 1.

. Для создания массива идентификаторов вы можете использовать map() (docs) метод вместо.

var devices = $('#temp_inventory').children().map(function() {
    return this.id.substr(4);
}).get();

Метод .map() заполняет объект jQuery (который является объектом, подобным массиву) значениями, которые вы возвращаете в функции.

Тогда метод get() (документы) дает вам массив этих значений вместо jQueryobject.

Вы также можете использовать метод toArray() (документы) , который делает то же самое.

var devices = $('#temp_inventory').children().map(function() {
    return this.id.substr(4);
}).toArray();
3 голосов
/ 11 февраля 2011

Я думаю, вы можете захотеть,

while (i<count){
  devices[i] = children[i].id.substr(4);
  i++;
};

, иначе последняя итерация будет выходить за пределы последнего элемента в массиве.

Более краткий способ сделать это, используя $.map()

var devices = $.map($('#temp_inventory').children(), function(elem) {
  return elem.id.substr(4);   
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...