Signatur
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
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');
}
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
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);
// Wichtig · Fallstricke
- Kompatibilität: Attribut-Methoden für
ProcessingInstructionsind neu bzw. experimentell und in vielen Browsern noch nicht verfügbar. Deshalb vorher mittypeof pi.hasAttribute === 'function'oder optionaler Verkettung (pi.hasAttribute?.(…)) prüfen.ProcessingInstruction.dataundtargetfunktionieren dagegen überall. - Pseudo-Attribute sind keine echten Attribute: Die Werte stehen als Text in
data. Wenn mandataä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 alsProcessingInstruction-Knoten im DOM. - In HTML-Dokumenten, die mit
text/htmlgeparst werden, werden<?…?>-Konstrukte traditionell als Kommentare behandelt. Die Methode ist deshalb vor allem bei XML-Dokumenten sinnvoll. - Soweit bekannt, wird wie bei
Element.hasAttribute()nurtrueoderfalsezurückgegeben. Zum Auslesen des Werts dientgetAttribute().