运行使用XMLHttpRequest下载的JavaScript

时间:2010-09-16 16:42:47

标签: javascript html ajax scripting download

我有一个网站,当用户点击链接时,使用XMLHttpRequest加载信息。系统运行良好,但我希望能够执行在此过程中收集的JavaScript。

这是一个问题,因为我想按需“下载”脚本,而不是在加载页面时加载它们。

感谢您的帮助

5 个答案:

答案 0 :(得分:9)

我认为推荐的解决方案是这样的:

function include(scriptUrl)
{
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", scriptUrl);
    xmlhttp.onreadystatechange = function()
    {
        if ((xmlhttp.status == 200) && (xmlhttp.readyState == 4))
        {
            eval(xmlhttp.responseText);
        }
    };
    xmlhttp.send();
}

或类似的东西。

但是,要小心这种方法。它容易受到跨站点脚本的攻击,这可能会让您(以及您的用户)面临各种各样的肮脏行为。你需要采取适当的预防措施。

答案 1 :(得分:6)

最近我找到了答案(它适用于Chrome,在其他浏览器中未经过测试)。

您可以创建dataURL字符串并将其放入src元素的script属性中。

var xhr = XMLHttpRequest(),
    doc = document;
xhr.open('GET', pathToJSFile, true);
xhr.onload = function () {

    var script = doc.createElement('script'),
        base64 = 'data:application/javascript;base64,';
    try {
        base64 += btoa(data.responseText);
    } catch (e) {
        // script file may contain characters that not included in Latin1
        var symbols = data.responseText.split('');
        for (var i = 0, l = symbols.length; i < l; i++) {
            var symbol = symbols[i];
            // here we are trying to find these symbols in catch branch
            try {
                btoa(symbol);
            } catch (e) {
                var code = symbol.charCodeAt(0).toString(16);
                while (code.length < 4) {
                    code = '0' + code;
                }
                // replace original symbol to unicode character
                symbols[i] = '\\u' + code;
            }
        }
        // create new base64 string from string with replaced characters
        base64 += btoa(symbols.join(''));
    } finally {
        script.src = base64;
        // run script
        doc.body.appendChild(script);
    }

};
xhr.send();

您可以订阅xhr.onprogress以显示进度条。

<强>更新即可。您可以将脚本文件下载为blob,然后创建blob-url。

var xhr = XMLHttpRequest(),
    doc = document;
xhr.responseType = 'blob';
xhr.open('GET', pathToJSFile, true);
xhr.onload = function () {

    var script = doc.createElement('script'),
        src = URL.createObjectURL(xhr.response);

    script.src = src;
    doc.body.appendChild(script);
};
xhr.send();

答案 2 :(得分:5)

您可以使用

运行以字符串形式下载的脚本
eval()

但我会建议你添加新的

<script src='..'></script>

到你的文档并有一个回调,它将被下载时调用。有很多utils和jquery插件。

答案 3 :(得分:0)

我在移动网络项目上遇到了挑战,神奇的是设置&#34; overrideMimeType&#34;。 这已经过验证,适用于Android 4.1到Android 6.0。

var head = document.getElementsByTagName('head');
var injectedScript = document.createElement('script');
head[0].appendChild(injectedScript);

var myRequest = new XMLHttpRequest();
myRequest.onreadystatechange = function() {
  if (myRequest.readyState == 4 && myRequest.status == 200) {
        injectedScript.innerHTML = myRequest.responseText;
    //run a function in the script to load it   
  }
};

function start(){
    myRequest.open('GET', 'javascript-url-to-download', true);
    myRequest.overrideMimeType('application/javascript');
    myRequest.send();
}

start();

答案 4 :(得分:-1)

您需要使用eval来解析XHR中的javascript,请注意,如果您对javascript的源代码没有绝对的信任,那么这非常危险。