执行用包含脚本标记的XMLHttpRequest编写的Javascript?

时间:2012-02-02 06:02:20

标签: javascript xmlhttprequest response

通过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。

我已确保XMLHttpRequestsynchronous,因为我想在此之后引用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的价值。

3 个答案:

答案 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