通过 Javascript 请求,XMLHttpRequest
响应一些额外的 Javascript,这些 Javascript 需要添加到请求页面的页面。
使用 eval(),如果响应类似于:
alert('This is the js response');
...那么这就可以正常工作了。
但是,返回的文本可能如下所示:
<script language="javascript">var checkVar='checkVar: value 1';</script>
但最有可能的是:
<script src="http://www.somesite.com/setCheckVarValue.js"></script>
...需要在页面上加载额外的 JS。
我已确保 XMLHttpRequest
是同步
,因为我想在此之后立即引用 checkVar。
所以:
<script type="text/javascript" src="http://www.mysite.com/addJSToPage.js" />
// at this point, since this is a synchronous call, page processing waits
// until the response is received that needs to include the additional JS
// to load; this, for testing sets the value of checkVar
<script type="text/javascript" >
alert(checkVar);
</script>
警报消息应显示为“checkVar:值 1”。
由于其他原因,这不仅仅是在 addJSToPaged.js
中设置 var checkVar 那么简单,所以我不是在寻找那种建议。
我只是将 alert(checkVar) 用作测试,以确保已通过 JS 在响应中设置值。
我想我可以去掉开始和结束的脚本标签,并保持 eval()
的方式。但是,我想知道是否有任何解决方案支持我正在寻找的东西?
谢谢。
更新
按照 Prashanth 的建议,我在 addJSToPage.js 中添加了:
var dynamicElement = document.createElement('div');
然后在 XMLHttpRequest 的响应中,我做了:
dynamicElement.appendChild = xmlhttp.responseText;
仍然没有看到 checkVar 的值。
最佳答案
不管你在做什么都可能是个坏主意这一事实,Prashanth 将其插入 DOM 的想法是正确的。您也可以去除标签并评估为“正常”。
不要忽视以下事实:1) eval
是邪恶的,2) 动态加载远程代码是糟糕的,3) 同步 AJAX 是特别糟糕的,我要说的是:
除非您知道自己在做什么,否则eval
任何东西都不是一个好主意,它很难调试,会暴露出大量的安全漏洞和各种其他问题。然后,您通过加载远程代码来复合这一点,这显然是以您无法控制的方式生成的,因为您无法只获得脚本。同步 Ajax 不好,因为在 javascript 中只有一个线程,在 Ajax 上阻塞实际上会锁定整个页面,直到它被加载,因为即使像滚动这样的事情也会产生 javascript 事件,当前繁忙的引擎必须检查处理程序。虽然请求在您的本地计算机上进行得很快,但连接速度慢或质量差的人可能会等待一段时间,直到连接超时时间。 AJAX 中的“A”是异步的,并且有充分的理由使用回调,它们存在是有原因的。
如果您只是进行数据传递,请使用 JSON,它是 JavaScript 对象表示法,一种简单的数据格式,恰好也是有效的 JavaScript。您可以在其上使用 eval
,但我建议使用 JSON 解析器,我认为大多数现代浏览器都内置了它们(这里可能是错误的)。 JSON 之所以好,是因为它可以表达复杂的数据结构,易于生成和解析并得到广泛支持。
关于javascript - 执行使用包含脚本标签的 XMLHttpRequest 编写的 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9107847/