运行使用XMLHttpRequest下载的JavaScript

Tom*_*omC 12 html javascript ajax scripting download

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

这是一个问题,因为我想按需"下载"脚本,而不是在加载页面时全部加载它们.

谢谢你的帮助

Mik*_*fer 10

我相信推荐的解决方案是这样的:

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();
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

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


Ale*_*kun 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();
Run Code Online (Sandbox Code Playgroud)

您可以订阅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();
Run Code Online (Sandbox Code Playgroud)


Kir*_*kov 5

您可以使用以字符串形式运行脚本

eval()
Run Code Online (Sandbox Code Playgroud)

不过我建议你添加新的

<script src='..'></script>
Run Code Online (Sandbox Code Playgroud)

到您的文档并有一个回调,将在下载时调用.有很多utils和jquery插件.