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)
或类似的东西.
但是,要警惕这种方法.它容易受到跨站点脚本的攻击,这可能会让您(以及您的用户)面临各种各样的肮脏行为.你需要采取适当的预防措施.
最近我找到了答案(它适用于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)
您可以使用以字符串形式运行脚本
eval()
Run Code Online (Sandbox Code Playgroud)
不过我建议你添加新的
<script src='..'></script>
Run Code Online (Sandbox Code Playgroud)
到您的文档并有一个回调,将在下载时调用.有很多utils和jquery插件.