Start · Sprachen · JavaScript · Referenz · ProcessingInstruction.hasAttribute()

ProcessingInstruction.hasAttribute()

Methode

Prüft, ob eine Verarbeitungsanweisung (z. B. <code>&lt;?xml-stylesheet href="…"?&gt;</code>) ein Pseudo-Attribut mit dem angegebenen Namen besitzt, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript Experimentell – noch nicht in allen Browsern verfü Kategorie: webapi

Signatur

ProcessingInstruction.prototype.hasAttribute(name)

Beschreibung

Die Methode hasAttribute() des ProcessingInstruction-Interfaces gibt einen booleschen Wert zurück. Er zeigt an, ob die Verarbeitungsanweisung ein Attribut mit dem angegebenen Namen enthält. Gemeint sind die sogenannten Pseudo-Attribute, die im Datenteil einer Verarbeitungsanweisung stehen, etwa href und type in <?xml-stylesheet href="style.css" type="text/css"?>.

Bisher musste man für solche Prüfungen den Rohtext aus ProcessingInstruction.data selbst parsen, meist mit regulären Ausdrücken, was leicht Fehler verursacht. hasAttribute() verhält sich dagegen wie Element.hasAttribute(): Man übergibt einen Namen und erhält true oder false, ohne den Wert auslesen zu müssen.

Typische Einsatzfälle sind XML-Dokumente, die mit DOMParser oder XMLHttpRequest geladen wurden, oder das Durchlaufen von Knoten mit einem TreeWalker. Dabei prüft man vor dem Auslesen mit getAttribute(), ob ein bestimmtes Pseudo-Attribut überhaupt vorhanden ist.

Parameter

Name Typ Default Beschreibung
$name Pflicht string Name des gesuchten Pseudo-Attributs, z. B. "href" oder "type".

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Verarbeitungsanweisung ein Attribut mit diesem Namen hat, sonst false.

Beispiele

Stylesheet-Anweisung in einem XML-Dokument prüfen

const xml = `<?xml version="1.0"?>
<?xml-stylesheet href="style.css" type="text/css"?>
<root/>`;

const doc = new DOMParser().parseFromString(xml, 'application/xml');
const pi = [...doc.childNodes].find(
  (n) => n.nodeType === Node.PROCESSING_INSTRUCTION_NODE
);

if (typeof pi.hasAttribute === 'function') {
  console.log(pi.hasAttribute('href'));  // true
  console.log(pi.hasAttribute('media')); // false
} else {
  console.log('hasAttribute() wird nicht unterstützt');
}
true false

Funktionsprüfung mit Rückfallweg über pi.data

// Nutzt die native Methode, falls vorhanden, sonst eine einfache Auswertung von data
const piHasAttribute = (pi, name) => {
  if (typeof pi.hasAttribute === 'function') {
    return pi.hasAttribute(name);
  }
  const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  return new RegExp(`(^|\\s)${escaped}\\s*=\\s*(["']).*?\\2`).test(pi.data);
};

const doc = new DOMParser().parseFromString(
  '<?xml-stylesheet type="text/xsl" href="transform.xsl"?><data/>',
  'application/xml'
);
const pi = doc.firstChild;

console.log(piHasAttribute(pi, 'type'));      // true
console.log(piHasAttribute(pi, 'alternate')); // false
true false

Alle Stylesheet-Anweisungen ohne media-Angabe finden

const xml = `<?xml-stylesheet href="a.css" media="print"?>
<?xml-stylesheet href="b.css"?>
<doc/>`;
const doc = new DOMParser().parseFromString(xml, 'application/xml');

const walker = doc.createTreeWalker(doc, NodeFilter.SHOW_PROCESSING_INSTRUCTION);
const ohneMedia = [];

while (walker.nextNode()) {
  const pi = walker.currentNode;
  if (pi.target === 'xml-stylesheet' && pi.hasAttribute?.('media') === false) {
    ohneMedia.push(pi.data);
  }
}

console.log(ohneMedia);
[ 'href="b.css"' ]

// Wichtig · Fallstricke

  • Kompatibilität: Attribut-Methoden für ProcessingInstruction sind neu bzw. experimentell und in vielen Browsern noch nicht verfügbar. Deshalb vorher mit typeof pi.hasAttribute === 'function' oder optionaler Verkettung (pi.hasAttribute?.(…)) prüfen. ProcessingInstruction.data und target funktionieren dagegen überall.
  • Pseudo-Attribute sind keine echten Attribute: Die Werte stehen als Text in data. Wenn man data ändert, ändern sich auch die gemeldeten Attribute. Ist die Syntax fehlerhaft, zum Beispiel wenn Anführungszeichen fehlen, wird ein Attribut unter Umständen nicht erkannt.
  • Die XML-Deklaration zählt nicht: <?xml version="1.0"?> erscheint nicht als ProcessingInstruction-Knoten im DOM.
  • In HTML-Dokumenten, die mit text/html geparst werden, werden <?…?>-Konstrukte traditionell als Kommentare behandelt. Die Methode ist deshalb vor allem bei XML-Dokumenten sinnvoll.
  • Soweit bekannt, wird wie bei Element.hasAttribute() nur true oder false zurückgegeben. Zum Auslesen des Werts dient getAttribute().