4

为什么不为 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,但这不是问题 :)

4

2 回答 2

8

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 规范中为标签指定load事件的组件<script>明确声明它们为标签引用的脚本<script>触发,而不是非脚本数据块。如果元素未被识别为与浏览器支持的脚本语言相对应的 MIME 类型,<script>则该元素是一个数据块。type这意味着列入黑名单的类型 liketext/plain永远不会被识别为脚本,而 must-support 和 must-not-support 列表中的类型值都不会被识别为脚本,例如application/dart一些浏览器可能不支持 must-support 和 must-not-support 列表中的类型值,例如(对于 Google 的 Dart 语言)。

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

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

于 2013-08-05T14:22:09.010 回答
1

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

您必须将其指定为“script/javascript”以使其作为 JavaScript 执行。

于 2013-08-05T13:49:59.253 回答