我正在使用Angular 4和CLI创建Angular应用程序.我正在try 将SkyScanner搜索小部件添加到我的一个组件中.

Skyscanner Widget Example

部分实现需要添加新的外部脚本:

<script src="https://widgets.skyscanner.net/widget-server/js/loader.js" async></script>

我不确定引用此文件的正确方式.如果我将脚本添加到索引中.html文件,除非执行完整页面刷新,否则小部件不会加载.我假设脚本试图在加载时操作DOM,而脚本运行时元素不存在.

只有在加载包含Skyscanner小部件的组件时,才加载脚本的正确方法是什么?

推荐答案

try 在组件加载时加载外部JavaScript,如下所示:

loadAPI: Promise<any>;

constructor() {        
    this.loadAPI = new Promise((resolve) => {
        this.loadScript();
        resolve(true);
    });
}

public loadScript() {        
    var isFound = false;
    var scripts = document.getElementsByTagName("script")
    for (var i = 0; i < scripts.length; ++i) {
        if (scripts[i].getAttribute('src') != null && scripts[i].getAttribute('src').includes("loader")) {
            isFound = true;
        }
    }

    if (!isFound) {
        var dynamicScripts = ["https://widgets.skyscanner.net/widget-server/js/loader.js"];

        for (var i = 0; i < dynamicScripts.length; i++) {
            let node = document.createElement('script');
            node.src = dynamicScripts [i];
            node.type = 'text/javascript';
            node.async = false;
            node.charset = 'utf-8';
            document.getElementsByTagName('head')[0].appendChild(node);
        }

    }
}

Typescript相关问答推荐

定义JMX的类型:类型上不存在属性键

如何根据参数的值缩小函数内的返回类型?

React-Native运行方法通过监听另一个状态来更新一个状态

TypeScript泛型参数抛出错误—?&#"' 39;预期"

将props传递给子组件并有条件地呈现它''

在配置对象上映射时,类型脚本不正确地推断函数参数

为什么tsx不判断名称中有"—"的属性?'

状态更新后未触发特定元素的Reaction CSS转换

如何在TypeScrip中从字符串联合类型中省略%1值

STypescript 件的标引签名与功能签名的区别

<;T扩展布尔值>;

如何在Typescript 中组合unions ?

下载量怎么会超过下载量?

TypeScrip错误:为循环中的对象属性赋值

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

打字脚本错误:`不扩展[Type]`,而不是直接使用`[Type]`

TypeScrip:从嵌套的对象值创建新类型

为什么受歧视的unions 在一种情况下运作良好,但在另一种非常类似的情况下却不起作用?

如何将对象的字符串文字属性用作同一对象中的键类型

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?