Каков наилучший способ вырезать только якорные HTML-теги в javascript, учитывая строку html? - PullRequest
0 голосов
/ 27 декабря 2010

Допустим, есть строка HTML, с тегами сценария, простым текстом и т.

Какой лучший способ удалить только теги <a>?

Я использовал некоторые методы здесь, но они для всех тегов. Уберите HTML из текста JavaScript

Ответы [ 4 ]

3 голосов
/ 27 декабря 2010

Использование jQuery:

var content = $('<div>' + htmlString + '</div>');
content.find('a').replaceWith(function() { return this.childNodes; });
var newHtml = content.html();

Добавление оберточного тега <div> позволяет нам вернуть нужный HTML-код.

Я написал более подробное объяснение вмой блог.

3 голосов
/ 27 декабря 2010

Этот подход сохранит существующие узлы DOM, сводя к минимуму побочные эффекты, если у вас есть элементы в привязках, к которым прикреплены события.

function unwrapAnchors() {
    if(!('tagName' in this) || this.tagName.toLowerCase() != 'a' || !('parentNode' in this)) {
        return;
    }
    var childNodes = this.childNodes || [], children = [], child;
    // Convert childNodes collection to array
    for(var i = 0, childNodes = this.childNodes || []; i < childNodes.length; i++) {
        children[i] = childNodes[i];
    }
    // Move children outside element
    for(i = 0; i < children.length; i++) {
        child = children[i];
        if(('tagName' in child) && child.tagName.toLowerCase() == 'a') {
            child.parentNode.removeChild(child);
        } else {
            this.parentNode.insertBefore(child, this);
        }
    }
    // Remove now-empty anchor
    this.parentNode.removeChild(this);
}

Для использования (с jQuery):

$('a').each(unwrapAnchors);

Для использования (без jQuery):

var a = document.getElementsByTagName('a');
while(a.length) {
    unwrapAnchors.call(a[a.length - 1]);
}
0 голосов
/ 27 декабря 2010

Вот нативное (не библиотечное) решение, если производительность беспокоит.

function stripTag(str, tag) {
    var a, parent, div = document.createElement('div');
    div.innerHTML = str;
    a = div.getElementsByTagName( tag );
    while( a[0] ) {
        parent = a[0].parentNode;
        while (a[0].firstChild) {
            parent.insertBefore(a[0].firstChild, a[0]);
        }
        parent.removeChild(a[0]);
    }
    return div.innerHTML;
}

Используйте это так:

alert( stripTag( my_string, 'a' ) );
...