Заменить несколько экземпляров ссылки в JQuery - PullRequest
1 голос
/ 09 июля 2011

У меня есть несколько элементов списка, которые содержат div, который содержит ссылку.Я хотел бы удалить эту ссылку из всех элементов.Это моя текущая функция:

jQuery('.post_meta').each(function(){
    var el = jQuery('.post_meta a');
    el.html(el.html().replace(/, Slider/ig, ""));
});

Эта функция дублирует один div и добавляет его содержимое ко всем остальным.Что было бы правильным путем?

Это моя разметка:

<ul>
     <li>
         <div class="post_meta">
         <a href="#">Anything</a>, <a href="#">Slider</a>, <a href="#">Anything2</a> 
         </div>
    </li>
</ul>

Ответы [ 4 ]

1 голос
/ 09 июля 2011

Кажется, вы хотите что-то вроде этого:

$('.post_meta a').filter(function() {
    return $.trim($(this).text()) === "Slider";
}).remove();

Принимает все ссылки внутри .post_meta элементов и фильтрует их по содержанию (независимо от того, является ли текст Slider. Затем эти элементы удаляются.

Ссылка: filter, trim, remove

Обновление: По поводу вашего комментария. Удалить запятую немного сложнее, но вы можете сделать это следующим образом (после удаления ссылок):

$('.post_meta').each(function(){
    $.each($(this).contents(), function() {
        if(this.nodeType === 3) {
            this.nodeValue = this.nodeValue.replace(/,\s*,/g, ',');
        }
    });
});

Это, вероятно, не очень производительный, хотя ...

Обновление 2: Видимо, удаление запятой не сработало, потому что после удаления узла элемента у вас есть два смежных текстовых узла, а не один.

Это работает, хотя:

$('.post_meta').each(function(){
    var c = $(this).contents();
    $.each(c, function(i) {
        var prev = c[i-1];
        if(this.nodeType === 3 
           && prev 
           && prev.nodeType ===3
           && $.trim(this.nodeValue) === $.trim(prev.nodeValue)) {
            this.parentNode.removeChild(this);
        }
    });
});

DEMO

Это в основном удаляет дубликаты смежных текстовых узлов.

Почему я делаю это так сложно?

Поскольку похоже, что к ссылкам могут быть подключены обработчики событий JavaScript, и если вы получите и установите HTML, эти обработчики будут потеряны.

Если это не так и HTML-код действительно такой, вы можете сделать:

jQuery('.post_meta').html(function(i, html) {
    return html.replace('<a href="#">Slider</a>,','');
});

DEMO 2

Но, как уже было сказано, это работает только в том случае, если (а) HTML точно совпадает со строкой и (б) вы не привязываете никаких обработчиков событий к ссылкам (они будут потеряны).

0 голосов
/ 09 июля 2011

Сделайте это тогда:

var temp = $(el).find('a');

var txtVal = temp.text();

if(txtVal == "Slider")
{
    temp.remove();
}
0 голосов
/ 09 июля 2011

Я думаю, что вы хотите сделать следующее:

$(".post_meta a").remove();

Если вы хотите очистить весь другой текст, который вы можете сделать:

$(".post_meta").empty();

ОБНОВЛЕНИЕ:

Можно ли поменять разметку?Я бы предложил добавить класс к якору, который вы хотите удалить, что-то вроде:

<ul>
     <li>
         <div class="post_meta">
         <a href="#">Anything</a>, <a href="#" class="slider">Slider</a>, <a href="#">Anything2</a> 
         </div>
    </li>
</ul>

Тогда вы можете сделать:

$(".post_meta a.slider").remove();
0 голосов
/ 09 июля 2011

Вы используете каждый, но не заполняете параметры функции, они должны быть:

.each( function(index, Element) )

эль все ссылки во всех пост_мпетах

Вы можете удалить ссылки с помощью: $(el).find('a').remove(); (в каждом цикле)

Я не понимаю, что вы делаете, заменив HTML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...