Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не удаляется элемент из массива. (https://javascript.ru/forum/jquery/57099-ne-udalyaetsya-ehlement-iz-massiva.html)

Blondinka 19.07.2015 16:52

Не удаляется элемент из массива.
 
Здравствуйте.
Проблема в следующем куске кода.
$(function () {
        $(".delete").on("click", function () {
            var item = $(this).parent().attr('id');//Должно быть, есть более лаконичный вариант записи.
            alert(item); //Отобразить id. Для проверки работы функции.
            channel.remove('"' + item + '"');//Удалить элемент из массива, если его значение == значению id.
            displayChannelList();//Вывести список каналов. В данном случае - элементы массива. По работе этой функции я поняла, что элемент массива не удаляется.
        });
    });

Ссылка на jsfiddle

Еще не все функции работают, нет валидации, но если у вас будут какие-либо замечания, касательно остального кода - пишите.

Sigizmund2012 19.07.2015 19:56

Blondinka,
Непонятно, что в переменной channel( по идее это должна быть коллекция jquery ). Метод remove() не удаляет элементы из массива, он удаляет элементы из DOM, читайте документацию http://api.jquery.com/remove/

Blondinka 19.07.2015 20:34

Спасибо, Sigizmund2012. Заменила remove(). Решила пойти другим путем, воспользовавшись splice() и indexOf(). Работает, но, только, 1 раз.
$(function () {
        $(".delete").on("click", function () {
            var item = channel.indexOf($(this).parent().attr('id'));
            alert(item); //Display id. Remove this code later.
            channel.splice(item,1);
            displayChannelList();
            displayChanges();
        });
    });

Цитата:

Сообщение от Sigizmund2012 (Сообщение 380428)
Blondinka,
... в переменной channel( по идее это должна быть коллекция jquery ).

Что за коллекция?

jasper-blondin 19.07.2015 21:21

Не хватает контекста. Что такое channel? И какую цель Вы преследуете?

Blondinka 19.07.2015 21:36

jasper-blondin, channel - это массив, хранящий список rss-каналов.
var channel = [
        'http://rss.cnn.com/rss/edition.rss',
        'http://cosmo.intoday.in.feedsportal.com/c/34156/f/618495/index.rss?',
        'http://www.nasa.gov/rss/dyn/breaking_news.rss'];

Текущая цель - удалить любое количество элементов массива channel без перезагрузки.

Вот весь код.

jasper-blondin 19.07.2015 21:46

Цитата:

Сообщение от Blondinka (Сообщение 380430)
Работает, но, только, 1 раз.

Кода Вы выполняете данный код (не понятно, зачем):
var item = channel.indexOf($(this).parent().attr('id'));

у Вас item получает одно и то же значение после каждого клика.
Проверьте, может у Вас item больше длины массива. Поэтому удаление больше не происходит.

Blondinka 19.07.2015 23:19

Цитата:

Сообщение от jasper-blondin (Сообщение 380435)
Кода Вы выполняете данный код (не понятно, зачем):
var item = channel.indexOf($(this).parent().attr('id'));
.

Вы хотите предложить альтернативный (не такой громоздкий) вариант?

Sigizmund2012 20.07.2015 09:16

Цитата:

Сообщение от jasper-blondin
у Вас item получает одно и то же значение после каждого клика.

Тут дело не в этом, просто функция update() создаёт новый блок с каналами и все обработчики удаляются. Решается делегированием:
$(function () {
        $(".channelList").on("click", ".delete" , function () {
            var item = channel.indexOf($(this).parent().attr('id'));
            channel.splice(item, 1);
            update();
        });
    });

Цитата:

Сообщение от Blondinka
Что за коллекция?

Вы пытаетесь использовать библиотеку, а не знаете о ней даже базовых вещей. Рекомендую книгу Берб Бибо, Иегуда Кац - "jQuery. Подробное руководство по продвинутому JavaScript", там всё разжёвано. Коллекция jquery в русском издании правда называется "обёрнутый набор".

Blondinka 20.07.2015 10:05

Sigizmund2012, спасибо за решение и за книгу.


Часовой пояс GMT +3, время: 11:03.