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

执行用包含脚本标记的XMLHttpRequest编写的Javascript?,javascript,xmlhttprequest,response,Javascript,Xmlhttprequest,Response,通过一个Javascript请求,XMLHttpRequest响应一些需要添加到请求页面的额外Javascript 使用eval(),如果响应类似于: alert('This is the js response'); 。。。那么这个就行了 但是,返回的文本可能如下所示: <script language="javascript">var checkVar='checkVar: value 1';</script> 警报消息应为“checkVar:value 1” 出

通过一个Javascript请求,
XMLHttpRequest
响应一些需要添加到请求页面的额外Javascript

使用eval(),如果响应类似于:

alert('This is the js response');
。。。那么这个就行了

但是,返回的文本可能如下所示:

<script language="javascript">var checkVar='checkVar: value 1';</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的值。

忽略这样一个事实,即无论您做什么都可能是一个坏主意,Prashanth有正确的想法将其插入DOM。你也可以去掉标签,然后像“正常”一样进行评估

不要忽略以下事实:1)eval是邪恶的,2)动态加载远程代码是糟糕的,3)同步AJAX是非常糟糕的,我要说:

除非你知道自己在做什么,
eval
ing任何东西都是一个坏主意,它很难调试,可能会暴露出大量的安全漏洞和各种各样的问题。然后通过加载远程代码来实现这一点,远程代码显然是以您无法控制的方式生成的,因为您无法仅获取脚本。同步Ajax是不好的,因为javascript中只有一个线程,在Ajax上的阻塞实际上会锁定整个页面,直到加载为止,因为即使是滚动之类的事情也会生成javascript事件,当前繁忙的引擎必须检查处理程序。当请求在本地计算机上快速进行时,连接速度慢或质量差的用户可能会等待一段时间,直到连接超时。AJAX中的“A”是异步的,出于一个很好的原因,可以使用回调,它们的存在是有原因的

如果您只是在进行数据传递,请使用JSON,它是JavaScript对象表示法,一种简单的数据格式,碰巧也是有效的JavaScript。您可以在上面使用
eval
,但我建议使用JSON解析器,我认为大多数现代浏览器都内置了JSON解析器(这里可能是错误的)。JSON很好,因为它可以表达复杂的数据结构,生成和解析很简单,并且受到广泛支持。

以下是示例

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 

重述-需要能够在加载后/加载期间将某些内容动态加载到页面上,并让其执行。通过执行,我不仅仅是指更改某个div上的文本-这很简单。但是,如果我们想动态加载一些新的JS,比如说来自外部源的警报,并将其与脚本标记以及其他HTML代码一起注入,那么解决方案是使用以下jQuery调用:

jQuery(dynamicResponse).appendTo('body');

dynamicResponse
来自异步的
$.ajax({})
XmlHttpRequest
响应。一旦出现,它就会附加到任何DOM元素上,在
appendTo()
中指定并执行。

您可能需要将其注入DOM,eval是邪恶的。在这种情况下,您可能需要用消息进行响应,并在响应文本上发出警报。@Prashanth-它不像警报那么简单;更新了描述,因为响应将是一个JS引用来加载更多的JS。对,将其注入dom,您可以调用该函数。我想不出一个有效的用例,在这个用例中,您只需要使用上面更新的javascript.Updated来响应,但是仍然不行。你能举个例子吗?我明白你的意思。我最初使用的是asynch方法,但正如我所提到的,我希望确保执行响应文本(JS ref)。此外,我发现eval()存在一个问题,因为它只允许您从自己的域执行脚本。我认为集成jQuery的getScript()可能是一个更好的解决方案,可以避免讨论的许多陷阱。本质上,我需要能够从javascript向页面注入任何额外的HTML(可以是带标签的完整javascript)。Prashanth的选择可能是一条出路。为了进一步澄清,我发布了以下内容:。它可能不仅仅是一个JS函数,而是加载一个JS库或图像等。有什么建议吗?
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 
jQuery(dynamicResponse).appendTo('body');