1

scriptJavaScript で新しいプログラミング言語を作成しました。タグを使用する他のスクリプトと同じように、ユーザーがその言語を Web ページに含められるようにしたいと考えています。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>My Prog Lang</title>
        <script src="scripts/myProgLang.js"></script>
        <script type="text/my-prog-lang" src="scripts/index.mypl"></script>
    </head>
</html>

アイデアはmyProgLang.js、すべてのスクリプトの内容を取得して実行することです。

window.addEventListener("DOMContentLoaded", function () {
    var scripts = document.querySelector('script[type="text/my-prog-lang"]');
    var length = scripts.length;

    for (var i = 0; i < length; i++) {
        var script = scripts[i];
        var src = script.getAttribute("src");
        var content = AJAX.getSync(src);
        myProgLang.eval(content);
    }
}, false);

このアプローチの明らかな問題 (同期 AJAX 呼び出しを行うことに加えて) は、異なるドメインのスクリプトが同じオリジン ポリシーに違反することです。

明らかな解決策は、 RequireJSなどのスクリプト ローダーを使用して、テキスト プラグインを使用してスクリプトをプレーン テキストとしてロードすることです。

ただし、このタスクのためだけに RequireJS フレームワーク全体を含めたくありませんでした。だから私は掘り下げて、この答えを見つけました: https://stackoverflow.com/a/4927418/783743

上記の回答によると:

script 要素の innerHTML プロパティは、script 要素が次の場合、スクリプトのコンテンツを文字列として提供する必要があります。

  • インラインスクリプト、または
  • スクリプトがロードしたこと (src 属性を使用している場合)

残念ながら、これは機能しません (少なくとも Opera では)。属性を使用してロードされたスクリプトには、プロパティsrcを使用してアクセスできません。innerHTML

この問題に取り組むために他にどのようなオプションが必要ですか?

4

3 に答える 3

2

Ajax リクエストを作成する必要があります... ページと同じドメインの場合は正常に読み込まれます。サーバーがキャッシュ ヘッダーを送信した場合は、既存のコピーを使用する必要があります。

別のドメインにある場合は、CORS ヘッダー (サポートされている場合) および/または JSONP ローダーが必要です。

于 2013-03-01T00:37:09.570 に答える
1

タグを介してカスタム スクリプトを直接インクルードしようとすると、解析に失敗し、の innerHTML を取得できなくなります。

JSONP スタイルのアプローチを使用することをお勧めします。グローバルハンドラー関数を定義することから始めます。

// myproglang.js

window.registerSource = function(source) {
    myProgLang.eval(source);
}

次に、ソース ファイルで、その関数の呼び出しでコードをラップします。

// source.mypl
registerSource("\
Dim foo as Integer;\
")

文字列リテラルを維持するためにテキスト ファイルで改行文字をエスケープする必要があるため、少し醜いですが、XHR を使用する以外に、それが私が考えることができる唯一の実行可能な解決策です。

registerSource() 呼び出しでソースを置き換え"\n"てラップする、この「言語」のコンパイル手順をいつでも作成できます。"\\\n"透明である限り、実行可能なオプションです。

于 2013-02-26T00:19:50.373 に答える
1

この質問はすでにここここで尋ねられています。

基本的にコンセンサスは次のとおりです。

  • スクリプトがインラインの場合は、次の方法でアクセスできますscript.innerHTML
  • インラインでない場合は、別の ajax リクエストを行う場合にのみアクセスできます。(明らかに、クロスドメインの問題が発生する可能性があります)

ノート

HTTP ヘッダーが正しく構成されていれば、ブラウザーのキャッシュからスクリプトをフェッチできるはずなので、高速です。

Access-Control-Allow-Origin: *クロスドメインの問題は、スクリプトのホストからのヘッダーで修正できます。

于 2013-02-27T15:29:51.120 に答える