通过Javascript请求,XMLHttpRequest
会响应一些需要添加到请求页面页面的其他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
为synchronous
,因为我想在此之后引用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:value 1”。
由于其他原因,这不仅仅是在addJSToPaged.js
中设置 var checkVar 这么简单,所以我不是在寻找那种推荐。
我正在使用 alert(checkVar)作为测试,以确保在响应中通过JS设置了值。
我想我可以删除开始和结束脚本标记并保持eval()
方式。但是,我想知道是否有任何解决方案可以支持我正在寻找的内容?
感谢。
更新
按照Prashanth的建议,在addJSToPage.js中我添加了:
var dynamicElement = document.createElement('div');
然后在XMLHttpRequest的响应中,我做了:
dynamicElement.appendChild = xmlhttp.responseText;
仍然没有看到checkVar的价值。
答案 0 :(得分:3)
无视你正在做的事情可能是一个坏主意,Prashanth有正确的想法将它插入DOM。你也可以删除标签,然后只需eval&#34;正常&#34;。
不要忽略1)eval
是邪恶的事实,2)动态加载远程代码是坏的3)同步AJAX是非常糟糕的,我有这样的说法:
除非你知道自己在做什么,否则eval
任何事情都是一个坏主意,难以调试,可能会暴露出巨大的安全漏洞和各种其他恶意行为。然后,您可以通过加载远程代码来复合它,这显然是以您无法控制的方式生成的,因为您无法获得该脚本。同步Ajax很糟糕,因为javascript中只有一个线程,Ajax上的阻塞会直接锁定整个页面,直到它被加载,因为即使像滚动一样生成javascript事件,当前繁忙的引擎必须检查处理程序。虽然请求在本地计算机上运行得很快,但连接速度较慢或质量较差的人可能会等待一段时间,直到连接的超时时间。 &#39; A&#39;在AJAX中是异步的,并且有充分的理由,使用回调,它们是有原因的。
如果您只是在进行数据传递,请使用JSON,这是一种JavaScript Object Notation,一种简单的数据格式,恰好也是有效的JavaScript。您可以在其上使用eval
,但我建议使用JSON解析器,我认为大多数现代浏览器都内置了它们(这里可能是错误的)。 JSON很好,因为它可以表达复杂的数据结构,易于生成和解析,并得到广泛支持。
答案 1 :(得分:2)
重新启动 - 需要能够在加载后/加载期间将某些内容动态加载到页面上并使其执行。通过执行,我不仅仅意味着更改某些div上的文本 - 这很容易。但是如果我们想要动态加载一些新的JS,比如来自某些外部源的警报,并注入它,以及它的脚本标记,或者其他一些HTML代码,那么解决方案是使用以下jQuery调用:< / p>
jQuery(dynamicResponse).appendTo('body');
dynamicResponse
来自异步$.ajax({})
或XmlHttpRequest
响应。一旦出现,它将附加到appendTo()
中指定并执行的任何DOM元素上。
答案 2 :(得分:1)
以下是示例
var script = document.createElement("script");
//innerHTML can be the response from your server. But send the text with script tag.
script.innerHTML = "var foo = function(){console.log('injected into the DOM')}"
document.body.appendChild(script) // insert into the DOM
foo() // call the function