0

私はこの機能を持っています:

function parseScript(_source) {
    var source = _source;
    var scripts = new Array();

    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
        var s = source.indexOf("<script");
        var s_e = source.indexOf(">", s);
        var e = source.indexOf("</script", s);
        var e_e = source.indexOf(">", e);

        scripts.push(source.substring(s_e+1, e));
        source = source.substring(0, s) + source.substring(e_e+1);
    }
    for(var i=0; i<scripts.length; i++) {
        try {
            eval(scripts[i]);
        }
        catch(ex) {
        }
    }
    return source;
}

<script type='text/javascript' src='scripts/gen_validatorv31.js'></script>src ファイルが実行されない場合を除いて、Javascript を見事に解析して実行します。

4

1 に答える 1

1

パーサーは、開いたファイル内のインライン スクリプトのみを評価できます。外部スクリプトを評価するには、おそらく次のようなものを使用して、ソースを見つける必要があります。

var scripts = source.match(/<script[^>]*src=[^>]*>/g);
if (scripts) {
    for (var i = 0; i < scripts.length; i++) {
        src = scripts[i].match(/src=("([^"]*)"|'([^']*)')/);
        src = src[2] || src[3];
        if (src) {
            addScriptTag(src);
        }
    }
}
else console.log('no external scripts found');

whereはこの回答addScriptTagで説明されています。可能であれば、スクリプトをヘッドに追加します。本文にスクリプトを追加する必要がある場合は、調整する必要があります。addScriptTag

しかし...なぜこれを行うのですか?HTML/Javascript ページ全体を解析してスクリプトを取得するのは遅くて面倒です。たとえば、同じスクリプトを 2 回ロードしたり、うまく連携しない 2 つのスクリプトをロードしたりすることになります。また、頭や体の別の場所に挿入すると、スクリプトが機能しない場合があります。AJAX を使用すると、必要な特定の要素のみをロードする必要があります。通常、これは、ページに追加するデータまたは HTML のビットをロードすることを意味します。最初は必要ないが、後で必要になる可能性のある長いスクリプトがある場合は、新しいスクリプトをページに動的に追加することが正当化される場合があります。しかし、多くの場合、最初に必要なすべてのスクリプトをロードする方がよいでしょう。本当にページを完全に切り替える必要がある場合は、別のページにリンクする昔ながらの方法を使用する方がよいのではないでしょうか?

于 2012-12-15T08:17:05.453 に答える