this.domParser.parseFromString(xmlString, 'text/xml')
Вы не анализируете свой контент как правильный тип контента. Вы хотите:
this.domParser.parseFromString(xmlString, 'text/html')
Я предполагаю, что когда вы анализируете контент как XML вместо HTML, браузер не думает, что <a>
имеет какое-то особое значение.
Рабочий пример:
class StringElementConverter {
constructor() {
this.domParser = new DOMParser();
}
toElement(xmlString) {
const parsedString = this.domParser.parseFromString(xmlString, 'text/html').firstElementChild;
if (parsedString == null) {
throw new Error(`This xml string ${xmlString} is not parsable to Node`);
}
return parsedString;
}
}
const template = `
<footer>
<slot name="prepend"></slot>
<slot name="center"></slot>
<slot name="append"></slot>
</footer>
`;
class AppFooter extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = template;
this.getElementsReferences();
this.setCopyright({
year: '2020',
author: 'Krzysztof Kaczyński',
termsReferenceUrl: 'https://www.google.com',
});
}
getElementsReferences() {
this.footer = this.shadowRoot.querySelector('footer');
}
setCopyright({ year, author, termsReferenceUrl }) {
const copyrightText = this.formattedCopyrights`Copyright © ${year} ${author}. Policy terms${termsReferenceUrl}`;
this.footer.appendChild(new StringElementConverter().toElement(copyrightText));
}
formattedCopyrights(strings, ...values) {
const policyTermsUrlText = `<a href="${values[values.length - 1]}">${strings[strings.length - 2]}</a>`;
let formattedText = '<p>';
for (let i = 0; i < values.length - 1; i++) {
formattedText += `${strings[i]}${values[i]}`;
}
formattedText += `${policyTermsUrlText}</p>`;
return formattedText;
}
}
customElements.define('kk-app-footer', AppFooter);
<kk-app-footer></kk-app-footer>