javascript - 关于页面内 script标签的加载问题
PHP中文网
PHP中文网 2017-04-10 15:35:24
[JavaScript讨论组]

各位大神请教个问题,如何检查页面的script 标签是否已经正确的被加载

在现代浏览器中 ,可以使用onerror 事件去做回调通知;
但是在IE6-8,并不能支持onerror 事件;
然后我就想用onloadonreadystatechange事件,做减法将未加载的标签收集出来,
然后发现在IE10- ,不论script标签是否被成功的加载,onreadystatechange 都会被触发;

请问各位大神,有没有好的思路去做页面中script标签是否被正常加载的监控

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
大家讲道理

redaystate又不是只在onload的时候才改变

xxx.onreadystatechange = function() {
    if (this.readyState == 'loaded') {
        //...
    }
}
PHP中文网
/**
 * 异步加载一个js文件或css文件,并执行回调函数
 * @param  {String}    fileType   文件类型
 * @param  {String}    src        链接地址
 * @param  {function}  success    加载成功后的回调函数
 * @param  {function}  error      加载失败后的回调函数
 * @return {undefined} undefined  无返回值
 */
function loadAsync(object) {
  // 获取head节点
  let head = document.head || document.getElementsByTagName('head')[0];
  // 需要加载js文件
  if (object.fileType === 'js') {
    // 创建script节点
    let script = document.createElement('script');
    // 设置script的src属性
    script.src = object.src;
    // 将script元素插入head元素中
    head.appendChild(script);
    // success回调函数存在的话
    if (object.success) {
      // 监听script元素的onload和onreadystatechange事件
      script.onload = script.onreadystatechange = () => {
        // 判断脚本是否加载完成
        if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
          // 执行success回调函数
          object.success();
        }
      }
    }
    // error回调函数存在的话
    if (object.error) {
      // 监听onerror事件
      script.onerror = () => {
        // 执行error回调函数
        object.error();
      }
    }
  // 需要加载css文件
  } else if (object.fileType === 'css') {
    // 创建link节点
    let link = document.createElement('link');
    // 设置rel属性
    link.rel = 'stylesheet';
    // 设置type属性
    link.type = 'text/css';
    // 设置href属性
    link.href = object.src;
    // 将link节点插入head
    head.appendChild(link);
    // success回调函数存在的话
    if (object.success) {
      // 监听link元素的onload事件
      link.onload = () => {
        // 执行回调函数
        object.success();
      }
    }
    // error回调函数存在的话
    if (object.error) {
      // 监听onerror事件
      link.onerror = () => {
        // 执行error回调函数
        object.error();
      }
    }
  }
}

loadAsync({
  fileType: 'js',
  src: 'http://cdn.bootcss.com/jquery/2.1.1/jquery.min.js',
  success: () => {
    console.log('请求成功!');
  },
  error: () => {
    console.log('请求失败!');
  }
});
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号