Javascript onload回调;类型“;或“;rel”'text/plain'在脚本或链接标记上

Javascript onload callback for "type" or "rel", 'text/plain' on script or link tag

本文关键字:脚本 链接 plain rel 回调 Javascript text onload 类型      更新时间:2023-09-26

为什么不为script type="text/plain"启动onload?下面的loadPlain不会触发回调,但loadScript会触发。

我本以为这会奏效。。。不应该吗?

    loadPlain("http://localhost/ajax/libs/jquery/1.10.2/jquery.min.js", function(element) {
            alert(1);
            alert(element.innerHTML);
    }, undefined, {})
    function loadPlain(path, callback, errorCallback, options) {
            var element = document.createElement('script');
            element.setAttribute("type", 'text/plain');
            element.setAttribute("src", path);
            return loadBase(element, callback, errorCallback, options);
    }
    function loadScript(path, callback, errorCallback, options) {
            var element = document.createElement('script');
            element.setAttribute("type", 'text/javascript');
            element.setAttribute("src", path);
            return loadBase(element, callback, errorCallback, options);
    }

    function loadBase(element, callback, errorCallback, options) {
            element.loaded = false;
            if (element.readyState){  // IE
                    element.onreadystatechange = function(){
                            if (element.readyState == "loaded" || element.readyState == "complete"){
                                    element.onreadystatechange = null;
                                    loadBaseOnload(element, callback);
                            }
                    };
            } else {                 // Others
                    element.onload = function() {
                            loadBaseOnload(element, callback);
                    };
            }
            element.onerror = function() {
                    errorCallback && errorCallback(element);
            };
            (options.elementAppendTo || document.head || loadBase.head || (loadBase.head = document.getElementsByTagName('head')[0]) || document.body).appendChild(element);
            return element;
    }
    function loadBaseOnload(element, callback) {
            if (element.loaded != true) {
                    element.loaded = true;
                    if ( callback ) callback(element);
            }
    }

请注意,我知道XMLHttpRequest,但这不是问题所在:)

WHATWG(与W3C一起指定浏览器行为的组织)有一个已知脚本MIME类型的列表,以及一些不能被视为脚本语言的黑名单MIME类型:

下面列出了用户代理必须识别的MIME类型字符串,以及它们所引用的语言:

  • "application/ecmascript"
  • "application/javascript"
  • "application/x-ecmascript"

以下MIME类型(带或不带参数)不得解释为脚本语言:

  • "text/plain"
  • "text/xml"
  • "application/octet-stream"
  • "application/xml"

注意:这里明确列出了这些类型,因为它们是定义不好的类型,但很可能被用作数据块的格式,如果用户代理突然将它们解释为脚本,这将是有问题的。

WHATWG规范称之为";数据块";以下是包含在<script>标签中的非脚本

在本例中,使用了两个脚本元素。一个嵌入外部脚本,另一个包含一些数据。

<script src="game-engine.js"></script>
<script type="text/x-game-map">`
........U.........e
o............A....e
.....A.....AAA....e
.A..AAA...AAAAA...e
</script>

WHATWG规范中为<script>标记指定load事件的组件明确表示,它们为<script>标记引用的脚本而不是非脚本数据块激发。如果type未被识别为与浏览器支持的脚本语言相对应的MIME类型,则<script>元素是数据块。这意味着,像text/plain这样被列入黑名单的类型永远不会被识别为脚本,而"必须支持"answers"不得不支持"列表中的类型值,比如application/dart(用于谷歌的Dart语言),可能会被一些浏览器支持。

此外,在src旁边包含非脚本type是不符合规范的。数据块只有在内联指定时才合法:

当用于包括数据块(与脚本相反)时,数据必须内嵌,数据的格式必须使用type属性给定,src属性不能指定并且脚本元素的内容必须符合为所用格式定义的要求。

如果您将脚本指定为"text/plain",浏览器将不会对其执行任何操作。

您必须将其指定为"script/javascript",才能将其作为javascript执行。