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

它很好地解析和执行 Javascript,除了<script type='text/javascript' src='scripts/gen_validatorv31.js'></script>src 文件中的 when 永远不会被执行。

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');

这个答案addScriptTag中描述了哪里。如果可能,将脚本添加到头部。如果您需要将脚本添加到正文,则需要对其进行调整。addScriptTag

然而……为什么要这样做?解析整个 HTML/Javascript 页面以获取脚本是缓慢而混乱的;例如,您最终可能会加载两次相同的脚本或加载两个不能很好地协同工作的脚本。此外,如果将脚本插入头部或身体的不同点,脚本可能无法正常工作。使用 AJAX,您应该只加载您需要的特定元素。通常这意味着加载要添加到页面的数据或 HTML 位。如果您有开始时不需要但稍后可能需要的长脚本,那么动态地将新脚本添加到页面可能是合理的。但在许多情况下,最好在开始时加载所有需要的脚本。如果您真的需要完全切换页面,那么使用链接到另一个页面的老式方法不是更好吗?

于 2012-12-15T08:17:05.453 回答