2011-05-12 47 views
0

以下不是我的实际项目,而是一个与我的项目具有相同问题的示例。JavaScript未在Ajax响应文本中执行

这里的主要HTML页面片断:

<div id="divExample">Before</div> 
<script type="text/javascript"> 
    loadExample(); 
</script> 

这里的JavaScript文件片段:

xmlhttp.onreadystatechange=function() 
{ 
    if(xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById('divExample').innerHTML=xmlhttp.responseText; 
    } 
} 
xmlhttp.open("GET","mypanel.html",true); 
xmlhttp.setRequestHeader("If-Modified-Since", "Sun, 31 Dec 1899 23:59:59 GMT"); 
xmlhttp.send(); 

这里是牵强mypanel.html:

After 
<script type="text/javascript"> 
    alert("Fetched script is working."); 
</script> 

当我加载主HTML页面,AJAX javascript运行良好。它获取mypanel.html并将其内容放入divExample.innerHTML中。单词“After”正确显示而不是“Before”。

然而,随着警报的脚本从不执行。我不想将警报脚本与mypanel.html分开。任何想法如何让它在AJAX加载后执行?

我读过here是可以做到这一点。

我读过here,这不能做。

任何想法如何使它发生?

+0

有你存储与响应警报的理由?您最好将它放在响应处理程序中的行后面。响应实际上并未按照您编码的方式进行评估/执行。如果你运行一个eval();在响应中它将运行(没有脚本标记,并且您可能需要在响应中包括类似下面的内容:var reponseHtml ='After';并在innerHtml代码中使用它)。祝你好运。 – 2011-05-12 22:38:45

+0

那么,真正的代码不是一个警报。这只是我实际项目遇到的问题的一个例子。实际的代码做了各种操作,我希望它保持与HTML。但是你的想法是值得一试的。也许我可以将脚本解析出来,然后评估它。这是一个有趣的方法。我会检查出来的。谢谢! – 2011-05-13 14:14:23

回答

4

你会想要照顾,防止任意代码运行的,但是这些方针的东西可以工作:

... 
if(xmlhttp.readyState==4 && xmlhttp.status==200) 
{ 
    var myDiv = document.getElementById('divExample'); 
    myDiv.innerHTML = xmlhttp.responseText; 

    var myScripts = myDiv.getElementsByTagName("script"); 
    if (myScripts.length > 0) { 
     eval(myScripts[0].innerHTML); 
    } 
} 
... 
+0

这是一个很好的例子,chprpipr。你和EvoD的想法是一致的。我会检查出来的。 – 2011-05-13 14:16:02

+0

好吧,我试了一下,似乎即使divExample的innerHtml被更新为包含mypanel.html的全部内容,内容的脚本部分也没有将它变成文档对象,因此,在上面的示例中, myScripts.length为0. 我已验证divExample.innerHTML确实包含mypanel.html的完整内容。 也许我只需要手动解析这些内容,然后评估脚本。这绝对是一种笨拙的方法,使用DOM会好得多,但我想不出任何其他方式来完成工作。想到任何人? – 2011-05-13 14:33:43

+0

更新:如果我使用myScript.innerHTML而不是innerText,它将起作用。当我说脚本没有写入文档对象时,我错了。他们是,而myScripts.length是1,表明剧本确实存在。但是,我不得不通过innerHTML而不是innerText访问脚本的内容。底线:这很好。非常感谢! – 2011-05-13 14:54:21

0

万一的人,谁仍然想不通,

1-检查您的xmlhttp是否包含response键。

2-如果存在,那么使用xmlhttp.response代替xmlhttp.responseText;

**如果PHP是你的后端服务器,做print_r(javascrip_code_as_string);然后return;