当前位置: 首页 > 面试题库 >

脚本加载

卫焕
2023-03-14
问题内容

我想从CDN加载脚本,然后在React中执行该脚本公开的功能:

componentWillMount() {
    console.log('componentWillMount is called');
    const script = document.createElement('script');
    script.src = 'https://foo.azurewebsites.net/foo.js';
    document.body.appendChild(script);
}


componentDidMount() {
    console.log('componentDidMount is called');
    window.foo.render({
        formId: '77fd8848-791a-4f13-9c82-d24f9290edd7',
    }, '#container');
}


render() {
    console.log('render is called');
    return (
        <div id="container"></div>
    );
}

该脚本有时需要花费一些时间(通常是第一次)加载,并且何时componentDidMount()调用“ foo”不可用,并且出现如下错误:

TypeError:无法读取未定义的属性“ render”

如何确保componentDidMount()脚本成功加载后调用?


问题答案:

根据React Component Specs和Lifecycle的说法,我认为在componentWillMount()或componentDidMount()中加载脚本不是一个好主意。

下面的代码可能会对您有所帮助。

function new_script(src) {
  return new Promise(function(resolve, reject){
    var script = document.createElement('script');
    script.src = src;
    script.addEventListener('load', function () {
      resolve();
    });
    script.addEventListener('error', function (e) {
      reject(e);
    });
    document.body.appendChild(script);
  })
};
// Promise Interface can ensure load the script only once.
var my_script = new_script('http://example.com/aaa.js');

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      status: 'start'
    };
  }

  do_load = () => {
    var self = this;
    my_script.then(function() {
      self.setState({'status': 'done'});
    }).catch(function() {
      self.setState({'status': 'error'});
    })
  }

  render() {
    var self = this;
    if (self.state.status === 'start') {
      self.state.status = 'loading';
      setTimeout(function () {
        self.do_load()
      }, 0);
    }

    return (
      <div>{self.state.status}   {self.state.status === 'done' && 'here you can use the script loaded'}</div>
    );
  }
}


 类似资料:
  • 问题内容: 我正在使用JQuery的几个插件,自定义窗口小部件和其他一些库。结果,我有几个.js和.css文件。我需要为网站创建一个加载器,因为加载需要一些时间。如果可以在导入所有内容之前显示加载程序,那就太好了: 我找到了一些教程,这些教程使我能够异步导入JavaScript库。例如,我可以做类似的事情: 由于某种原因,当我对所有文件执行相同操作时,页面将无法正常工作。我已经尝试了很长时间,试图

  • 我需要帮助。我正在创建一个项目,但在使用模板时遇到问题。我为标题和菜单创建了一个组件。菜单是一个侧边栏,在打开页面时隐藏。只有在登录后,菜单才会出现。但是javascript在那之后就不起作用了。 每当我进入登录屏幕时,我都会隐藏导航栏和侧边栏,当它出现并再次显示时,脚本将不再工作。当我去查看检查器时,脚本从元素中消失。

  • 问题内容: 我正在尝试使用jQuery动态加载一些脚本: 但是有时加载脚本的顺序会发生变化。前一个脚本成功加载后,如何加载每个脚本? 问题答案: 您可以通过使用回调函数作为递归函数调用在前一个完成加载后加载每个。 在您的代码中发生的是,脚本是同时被请求的,并且由于它们是异步加载的,因此它们以随机顺序返回并执行。 我尚未对此进行测试,但是如果脚本是在本地托管的,则可以尝试以纯文本格式检索它们,然后将

  • 问题内容: 从JDK-11开始,我们可以直接运行Java源代码。此代码 可以与 但是以shell脚本形式(shebang) 我收到一个错误: 问题是第一行中的参数。由于某种原因,论点通过了,但没有通过。 问题答案: 这在OpenJDK <=中 通常不起作用。目前尚不清楚这是否是错误,是否已修复。有一个开放的错误报告: https://bugs.openjdk.java.net/browse/JDK

  • 问题内容: 在HTML页面中包含JavaScript的方法有很多。我知道以下选项: 内联代码或从外部URI加载 包括在或标记[ [1],[2] ] 没有属性或属性(仅外部脚本) 包含在静态源中或由其他脚本动态添加(处于不同的解析状态,具有不同的方法) 不计算硬盘中的浏览器脚本,javascript:URI和-attributes [[3] ],已经有16种方法可以使JS执行,我敢肯定我忘了一些东西

  • 问题内容: 我有一个div标签,该标签通过ajax调用填充了脚本,但是脚本未执行。 有没有办法使脚本执行? 问题答案: 如果您使用jQuery的方法,它将解析出脚本标签并对其进行评估: 如果没有jQuery,则可以使用(1)正则表达式或(2)解析DOM树并查找脚本标签来自己编写。(#2是jQuery的执行方式)