Firefox未执行动态加载的JavaScript文件

Firefox未执行动态加载的JavaScript文件,javascript,jquery,firefox,Javascript,Jquery,Firefox,我正在尝试加载两个脚本,由于它们的类型属性是非标准的,即text/javascript/defer,因此在功能上被延迟。这样做会导致解析器忽略它们,因此我希望使用JavaScript重新加载它们 我的HTML如下所示: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1

我正在尝试加载两个脚本,由于它们的
类型
属性是非标准的,即
text/javascript/defer
,因此在功能上被延迟。这样做会导致解析器忽略它们,因此我希望使用JavaScript重新加载它们

我的HTML如下所示:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>No Title</title>
<meta name="keywords" content="">
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">

<script type="text/javascript/defer" src="assets/js/test3.js"></script>
<script type="text/javascript/defer" src="assets/js/test4.js"></script>

<script type="text/javascript" src="assets/js/jquery.js"></script>
<script>

    $(document).ready(function(){

        var defer_js_collection_obj = $("[type='text/javascript/defer']"),
            el_head_rq_obj = $('head'),
            el_head_obj = el_head_rq_obj[0]
        ;

        if(defer_js_collection_obj.length > 0)
        {
            //Reload JavaScript
            defer_js_collection_obj.each(function() {

                var file_src_outer_html_str = this.outerHTML;
                var file_src_res_arr = file_src_outer_html_str.match("src *\= *[\"\']{1}(.*?)[\"\']{1}");
                var file_src_str = file_src_res_arr[1];

                var fileref = document.createElement('script');
                fileref.setAttribute("type", "text/javascript");
                fileref.setAttribute("src", file_src_str);
                document.getElementsByTagName("head")[0].appendChild(fileref);
            });

            //Unload JavaScript with defer tag
            for(var j = defer_js_collection_obj.length-1; j >= 0; j--)
            {
                defer_js_collection_obj[j].parentNode.removeChild(defer_js_collection_obj[j]);
            }
        }

    });

</script>
</head>
<body>
   <div>Load Deferred JavaScript</div>
</body>
</html>

没有头衔
$(文档).ready(函数(){
var defer_js_collection_obj=$(“[type='text/javascript/defer']”),
el_head_rq_obj=$(“head”),
el_head_obj=el_head_rq_obj[0]
;
如果(延迟对象长度>0)
{
//重新加载JavaScript
每个(函数()的)延迟对象{
var file_src_outer_html_str=this.outerHTML;
var file\u src\u res\u arr=file\u src\u outer\u html\u str.match(“src*\=*[\“\']{1}(.*?[\“\']{1}”);
var file_src_str=file_src_res_arr[1];
var fileref=document.createElement('script');
setAttribute(“类型”、“文本/javascript”);
setAttribute(“src”,file\u src\u str);
document.getElementsByTagName(“head”)[0].appendChild(fileref);
});
//卸载带有defer标记的JavaScript
对于(var j=defer\u js\u collection\u obj.length-1;j>=0;j--)
{
defer_js_collection_obj[j].parentNode.removeChild(defer_js_collection_obj[j]);
}
}
});
加载延迟JavaScript
jquery.js
是1.11.2版
test3.js
test4.js
引用我要加载的javascript文件,它们包含
console.log('test3.js已加载')
console.log('test4.js已加载')分别为

我遇到的问题是,除了Firefox之外,这个脚本几乎可以在其他任何地方使用。我在使用Firefox 46.0.1的Mac OS X 10.10.5上,加载脚本时没有看到
console.log
消息


如何解决此问题?

尝试将您的脚本添加到正文的末尾,因此请执行以下操作:

document.getElementsByTagName("body")[0].appendChild(fileref);

尝试将您的脚本附加到正文的末尾,因此请执行以下操作:

document.getElementsByTagName("body")[0].appendChild(fileref);

这可能是mime类型的问题。您是否碰巧在控制台中看到任何声明“格式不正确”的消息?在任何情况下,这似乎对我有效,我同意当我第一次尝试时,您的代码在FF中不起作用

    $(document).ready(function(){
        console.log("main");

        var $body = $($("body")[0]);
        var $scripts = $("[type='text/javascript/defer']");

        $scripts.each(function(){
            var scriptTag = document.createElement("script");
            scriptTag.setAttribute("type", "text/javascript");
            scriptTag.setAttribute("src", $(this).attr("src"));
            $body.append(scriptTag);
        });
    });

这可能是mime类型的问题。您是否碰巧在控制台中看到任何声明“格式不正确”的消息?在任何情况下,这似乎对我有效,我同意当我第一次尝试时,您的代码在FF中不起作用

    $(document).ready(function(){
        console.log("main");

        var $body = $($("body")[0]);
        var $scripts = $("[type='text/javascript/defer']");

        $scripts.each(function(){
            var scriptTag = document.createElement("script");
            scriptTag.setAttribute("type", "text/javascript");
            scriptTag.setAttribute("src", $(this).attr("src"));
            $body.append(scriptTag);
        });
    });

text/javascript/defer
是无效类型。要延迟JS,您需要以另一种方式使用defer属性:
黑客攻击/更改本机功能将使您的代码难以维护。在HTML5中,您可以安全地忽略脚本类型,因此
可以正常工作,因为
text/javascript
是默认值。是的,我对此很熟悉,但我更喜欢这样做,因为整体浏览器支持更好。它适用于我测试过的所有浏览器,但不适用于Firefox,所以我想找出原因。您是否认为Firefox根本不喜欢格式错误的
类型
text/javascript/defer
?我刚刚使用
type=“text/javascript/defer”
对一个简单的JS文件运行了一个快速测试,它在FF中不起作用,但在Chrome中起作用。看起来FF就是不喜欢。。也不应该这样做。
text/javascript/defer
不起作用,因为解析器会忽略它,因为它是非标准语法:没有浏览器喜欢它。这就是为什么我要使用问题中的JavaScript代码,使用标准的
text/JavaScript
type属性将其重新加载到
,该属性应该在每个浏览器中都可以使用
(而不是
$(document).ready(function(){//code});
)DOM ready可能会在其中使用扳手。
text/javascript/defer
是无效类型。要延迟JS,您需要以另一种方式使用defer属性:
黑客攻击/更改本机功能将使您的代码难以维护。在HTML5中,您可以安全地忽略脚本类型,因此
可以正常工作,因为
text/javascript
是默认值。是的,我对此很熟悉,但我更喜欢这样做,因为整体浏览器支持更好。它适用于我测试过的所有浏览器,但不适用于Firefox,所以我想找出原因。您是否认为Firefox根本不喜欢格式错误的
类型
text/javascript/defer
?我刚刚使用
type=“text/javascript/defer”
对一个简单的JS文件运行了一个快速测试,它在FF中不起作用,但在Chrome中起作用。看起来FF就是不喜欢。。也不应该这样做。
text/javascript/defer
不起作用,因为解析器会忽略它,因为它是非标准语法:没有浏览器喜欢它。这就是为什么我要使用问题中的JavaScript代码,使用标准的
text/JavaScript
type属性将其重新加载到
,该属性应该在每个浏览器中都可以使用
(而不是
$(document).ready(function(){//code});
)DOM ready可能会在那里遇到麻烦。谢谢。我试过了,但没用。我看到了结束正文标记之前的脚本,但没有
console.log
消息。使用Firefox检查器,查看您的代码在页面中的确切影响!正如我前面提到的,代码是一个简单的
控制台。log
消息,没有其他内容。谢谢。我试过了,但没用。我看到结束正文标记之前的脚本,但没有
console.log
消息。使用Firefox检查器,查看您的c