我创建了一个 Web 组件,在其中声明了创建版权字符串的方法:

'<p>Copyright © 2020 Krzysztof Kaczyński<a href="https://www.google.com">. Policy terms</a></p>'

然后我把这个字符串转换成HTMLParagraphElement并附加到footer元素。 当我打开网络浏览器时,我没有看到任何错误,并且可以看到我的版权元素。 如果我检查这个元素,它看起来也正确,但如果我单击<a>该元素的一部分没有任何反应(但它应该重定向到https://www.google.com).

  • 为什么这个<a href="https://www.google.com">. Policy terms</a>不重定向到https://www.google.com https://www.google.com点击后?
  • 我怎样才能解决这个问题 ?

应用程序页脚组件:

export class AppFooter extends KKWebComponent implements KKAppFooter {
    public static TAG: string = `${CONSTANTS.TAG_PREFIX}-app-footer`;

    public readonly shadowRoot!: ShadowRoot;

    private footer!: HTMLElement;

    constructor() {
        super(template);
        this.getElementsReferences();
    }

    protected getElementsReferences(): void {
        this.footer = <HTMLElement>this.shadowRoot.querySelector('footer');
    }

    public setCopyright({ year, author, termsReferenceUrl }: CopyrightProps): void {
        const copyrightText: string = AppFooter.formattedCopyrights`Copyright © ${year} ${author}. Policy terms${termsReferenceUrl}`;
        this.footer.appendChild(new StringElementConverter().toElement(copyrightText));
    }

    private static formattedCopyrights(strings: TemplateStringsArray, ...values: string[]): string {
        const policyTermsUrlText: string = `<a href="${values[values.length - 1]}">${strings[strings.length - 2]}</a>`;
        let formattedText: string = '<p>';
        for (let i = 0; i < values.length - 1; i++) {
            formattedText += `${strings[i]}${values[i]}`;
        }
        formattedText += `${policyTermsUrlText}</p>`;
        return formattedText;
    }
}

网站上的元素:

检查的元素:

代码片段

class StringElementConverter {
    constructor() {
        this.domParser = new DOMParser();
    }

    toElement(xmlString) {
        const parsedString = this.domParser.parseFromString(xmlString, 'text/xml').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>

如果您还需要任何其他信息,请在评论中告诉我


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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机推荐

  • C# Mongodb 多个对象数组文档的笛卡尔积

    尝试使用 C Linq 甚至原始 Mongodb 查询本身来了解如何将多个数组连接为笛卡尔积 举例来说 我有一个集合 我将其过滤为以下两个文档 movie starwars showday monday movie batman showd
  • 为什么 ng build 在 azure DevOps 上失败?

    我正在尝试使用 Azure DevOps 进行 CI CD 但以下任务失败 这是 package json 文件信息 scripts ng ng start ng serve build ng build prod 这是错误消息 我尝试删除
  • 如何在 Ubuntu 中增加 Neo4j 的最大文件打开限制(ulimit)?

    现在ulimit n shows 10000 我想增加到40000 我编辑了 etc sysctl conf 并放入fs file max 40000 我也编辑过 etc security limits conf并更新了硬值和软值 但仍然显
  • 使用 ggplot2 再现格子树状图

    这可以用 ggplot2 重现这个格子图吗 library latticeExtra data mtcars x lt t as matrix scale mtcars dd row lt as dendrogram hclust dist
  • 有人请解释一下 Function.apply.bind(Math.max, null) 算法

    假设我们有这段代码 function largestOfFour arr return arr map Function apply bind Math max null 其中 arr 是数组的数组 首先 为什么我必须使用 apply 我知
  • Flutter - FirebaseMessaging.onMessageOpenedApp.listen 未触发

    我在用 flutter version 2 2 firebase messaging 10 0 2 我收到推送通知 然后单击它并打开应用程序 然后我就看不到了FirebaseMessaging onMessageOpenedApp list
  • 如何以编程方式选择特定节点?

    我有一个jstree 我想选择绑定到 id 为 158 的位置的对象的节点 这可行 但看起来很愚蠢 这样做更惯用的方法是什么 var tree jstree myContext node tree find li filter functi
  • 如何使用Vagrant box打包文件?

    所以我使用以下命令创建了一个 Vagrant 框 vagrant package base box name here vagrantfile Vagrantfile include manifests manifests 是一个包含 pu
  • ASP.NET MVC Url.Action 和路由名称值

    我正在使用 asp net mvc 2 并根据路由创建本地化 我的路线如下 culture controller action 我转到我的家庭控制器 en Home Index 我的家庭控制器视图有到其他控制器的链接 a href Prod
  • 数组在内存中是如何存储的?

    我有一个简单的程序 它将数组初始化为 int a 10 20 30 40 50 char p p char a 现在我想通过指针访问每个字节的值p 为此我需要知道 数组如何存储在内存中 是存储在栈上还是堆上 数组将其元素存储在连续的内存位置
  • 如何使用 Google Maps API v3 从地图获取 MapOptions 对象

    在 Google Maps api v2 中 您可以直接从地图对象获取地图类型 缩放等参数 在版本 3 中 您可以使用 setOptions 方法来设置某些参数 但没有 getOptions 或选项来检索它们 您还可以使用以下命令访问选项g
  • 对“_GetAdaptersAddresses@20”的未定义引用 - 但我包含了 -liphlpapi

    我在用着gcc under cygwin编写一些调用的代码GetAdaptersAddresses from iphlpapi h在我的代码中我设置了 WIN32 WINNT高于要求的0x0501在我添加的链接器行上 liphlpapi但链
  • 来自 createFileAtPath 的更详细错误?

    无论如何 是否可以从 createFileAtPath 获取更详细的错误数据 我有点期待 NSError 目前我正在使用 BOOL 返回值 success fileMan createFileAtPath fileOnDisk conten
  • XSD:大型模式验证

    我正在尝试使用 JAXP 和 SAX 解析器根据非常大的工业模式验证 xml 文件 问题是 验证即使是很小的 XML 文件也需要很长时间 我正在运行 Apache Tomcat 6 0 我尝试将堆大小增加到 1024 但这没有多大帮助 我还
  • 在 Visual Studio 中调试可执行文件

    想要在调试器下调试可执行文件 如何在视觉工作室中做到这一点 Windbg 有一个打开可执行文件的选项 但我发现 VS 2010 中缺少这一点 这个问题并不完全相同在 Visual Studio 2010 中调试 exe https stac
  • 字符串的长度超过了 maxJsonLength 属性上设置的值

    我正在通过 jQuery 加载选项卡内容数据ajax通过 web 方法发布方法 大约有 200 300 条记录 并在控制台中出现以下错误 错误 Sys Net WebServiceFailedException Sys Net WebSer
  • 在 JMockit 中模拟被测类的私有方法

    在我的被 测类 CUT 中 一个 ejb 我有一个私有方法 getConnection 我想测试另一种 CUT 方法 但这种方法会提前失败 我尝试了如下所示 但 调用 是错误的 我不想调用该方法 我想存根它 但如何呢 连接 是一个存根 ne
  • 如何在主机之间迁移 Docker 卷?

    码头工人的文档 https docs docker com engine admin volumes volumes 指出卷可以 迁移 我假设这意味着我应该能够将卷从一台主机移动到另一台主机 非常乐意在这一点上得到纠正 但是 同一文档页面没
  • 获取单元 apache poi 的名称

    我有一个 Cell 对象 如何获取该单元格的名称 想要一个函数 例如 String name myCell getName 在Excel中 我已在名称框中对其进行命名 因此我不想获得 B4 我想获得诸如 InterestRate 之类的名称
  • 元素不会重定向到另一个页面并且不可点击

    我创建了一个 Web 组件 在其中声明了创建版权字符串的方法 p Copyright 2020 Krzysztof Kaczy ski a href https www google com Policy terms a p 然后我把这个字