Website-Suche

Wie ändert man HTML-Attribute in einem rohen String mit jQuery oder Javascript?


Ich möchte eine Reihe von Anker-Tags nehmen und sicherstellen, dass sie alle in einem neuen Tab geöffnet werden.

Ich weiß, ich sollte so etwas wie $ ('a').attr('target', '_blank'); machen, aber der Haken ist, dass das HTML, das ich versuchen zu ändern, in einer String-Variablen ist.

Siehe Beispiel:

Ich habe eine Menge rohen HTML-Code in einem String wie diesem:

var rawHTML = 'Hello there, <a href="http://www.google.com">this</a> is a link.'

Wie kann ich das in etwa Folgendes umwandeln:

processedHTML = 'Hello there, <a href="http://www.google.com" target="_blank">this</a> is a link.'

Antwort #1

Mit jQuery können Sie den String an ein Element außerhalb des DOM anhängen

Sie können dann jQuery-Methoden auf diesem neuen Element verwenden, um das HTML zu ändern und dann die modifizierte Zeichenkette zurückzugeben:

var rawHTML = 'Hello there, <a href="http://www.google.com">this</a> is a link.';
// create element and set string as it's content
var $div = $('<div>').html(rawHTML);
// modify attributes
$div.find('a').attr('target', '_blank');
// return modified content to string
var processedHTML = $div.html();

Antwort #2

In reinem JavaScript können wir dies tun, indem wir die Methoden document.createElement, Element.getElementsByTagName und Element.setAttribute sowie die Getter- und Setter-Eigenschaft Element.innerHTML verwenden.

Beachten Sie, dass Element.getElementsByTagName eine aktive HTMLCollection zurückgibt, weshalb wir das links-Objekt bevor wir die html-Zeichenkette einfügen, instanziieren können. Um über die Sammlung zu iterieren, rufen wir eine Array-Methode mit der Sammlung als this-Kontext auf.

Dies reduziert einen Teil des Overheads von jQuery.

function blankify (html) {
  var root = document.createElement('span'),
      links = root.getElementsByTagName('a');
  
  root.innerHTML = html;
  
  Array.prototype.forEach.call(links, function (e) {
    e.setAttribute('target', '_blank');
  });
  
  return root.innerHTML;
}

console.log(blankify('Hello there, <a href="http://www.google.com">this</a> is a link.'));

Und nur weil, hier ist eine recht flexible jQuery-Methode. Funktioniert im DOM und ist kettebar.

jQuery.prototype.blankify = function () {
  return this.find('a').attr('target', '_blank'), this;
};

console.log($('<span/>', {
  html: 'Hello there, <a href="http://www.google.com">this</a> is a link.'
}).blankify().html());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>