为了账号安全,请及时绑定邮箱和手机立即绑定

如何判断<script>标签是否加载失败

如何判断<script>标签是否加载失败

慕哥6287543 2019-10-26 12:47:29
我正在向<script>页面的中动态添加标签<head>,并且我想知道加载是否以某种方式失败-404,加载的脚本中的脚本错误等。在Firefox中,这有效:var script_tag = document.createElement('script');script_tag.setAttribute('type', 'text/javascript');script_tag.setAttribute('src', 'http://fail.org/nonexistant.js');script_tag.onerror = function() { alert("Loading failed!"); }document.getElementsByTagName('head')[0].appendChild(script_tag);但是,这在IE或Safari中不起作用。有谁知道在Firefox以外的浏览器中实现此目的的方法吗?(我认为不需要在.js文件中放置特殊代码的解决方案是一个很好的解决方案。它既笨拙又不灵活。)
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

Erwinus的脚本效果很好,但是编码却不太清楚。我自由地清理它并破译它在做什么。我进行了以下更改:


有意义的变量名

使用prototype。

require() 使用参数变量

alert()默认情况下不返回任何消息

修复了一些语法错误和我遇到的范围问题

再次感谢Erwinus,该功能本身已经存在。


function ScriptLoader() {

}


ScriptLoader.prototype = {


    timer: function (times, // number of times to try

                     delay, // delay per try

                     delayMore, // extra delay per try (additional to delay)

                     test, // called each try, timer stops if this returns true

                     failure, // called on failure

                     result // used internally, shouldn't be passed

            ) {

        var me = this;

        if (times == -1 || times > 0) {

            setTimeout(function () {

                result = (test()) ? 1 : 0;

                me.timer((result) ? 0 : (times > 0) ? --times : times, delay + ((delayMore) ? delayMore : 0), delayMore, test, failure, result);

            }, (result || delay < 0) ? 0.1 : delay);

        } else if (typeof failure == 'function') {

            setTimeout(failure, 1);

        }

    },


    addEvent: function (el, eventName, eventFunc) {

        if (typeof el != 'object') {

            return false;

        }


        if (el.addEventListener) {

            el.addEventListener(eventName, eventFunc, false);

            return true;

        }


        if (el.attachEvent) {

            el.attachEvent("on" + eventName, eventFunc);

            return true;

        }


        return false;

    },


    // add script to dom

    require: function (url, args) {

        var me = this;

        args = args || {};


        var scriptTag = document.createElement('script');

        var headTag = document.getElementsByTagName('head')[0];

        if (!headTag) {

            return false;

        }


        setTimeout(function () {

            var f = (typeof args.success == 'function') ? args.success : function () {

            };

            args.failure = (typeof args.failure == 'function') ? args.failure : function () {

            };

            var fail = function () {

                if (!scriptTag.__es) {

                    scriptTag.__es = true;

                    scriptTag.id = 'failed';

                    args.failure(scriptTag);

                }

            };

            scriptTag.onload = function () {

                scriptTag.id = 'loaded';

                f(scriptTag);

            };

            scriptTag.type = 'text/javascript';

            scriptTag.async = (typeof args.async == 'boolean') ? args.async : false;

            scriptTag.charset = 'utf-8';

            me.__es = false;

            me.addEvent(scriptTag, 'error', fail); // when supported

            // when error event is not supported fall back to timer

            me.timer(15, 1000, 0, function () {

                return (scriptTag.id == 'loaded');

            }, function () {

                if (scriptTag.id != 'loaded') {

                    fail();

                }

            });

            scriptTag.src = url;

            setTimeout(function () {

                try {

                    headTag.appendChild(scriptTag);

                } catch (e) {

                    fail();

                }

            }, 1);

        }, (typeof args.delay == 'number') ? args.delay : 1);

        return true;

    }

};


$(document).ready(function () {

    var loader = new ScriptLoader();

    loader.require('resources/templates.js', {

        async: true, success: function () {

            alert('loaded');

        }, failure: function () {

            alert('NOT loaded');

        }

    });

});


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 2870 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号