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>

この例では、2 つのスクリプト要素が使用されています。1 つは外部スクリプトを埋め込み、もう 1 つは何らかのデータを含めます。

<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>

loadタグのイベントを指定する WHATWG 仕様のコンポーネントは、非スクリプト データ ブロックではなく、タグによって参照されるスクリプト<script>に対して起動することを明示的に述べています。ブラウザーがサポートするスクリプト言語に対応する MIME タイプとして認識されない場合、要素はデータ ブロックです。これは、 (Google の Dart 言語の場合) のような、サポートする必要があるリストとサポートしないリストのどちらでもないタイプの値が、一部のブラウザーでサポートされる可能性があるのに対し、 のようなブラックリストに登録された型はスクリプトとして認識されないことを意味します。<script><script>typetext/plainapplication/dart

typeさらに、 a の横にnon-script を含めることsrcは、仕様に準拠していません。データ ブロックは、インラインで指定された場合にのみ有効です。

(スクリプトではなく) データ ブロックを含めるために使用する場合、データはインラインで埋め込む必要があり、データの形式は属性を使用してtype指定する必要があり、src属性を指定してはならず、スクリプト要素の内容は使用される形式に対して定義された要件。

于 2013-08-05T14:22:09.010 に答える
1

スクリプトを「text/plain」として指定すると、ブラウザは何もしません。

JavaScript として実行するには、「script/javascript」と指定する必要があります。

于 2013-08-05T13:49:59.253 に答える