ajax加载PHP文件后javascript命令不执行

时间:2012-09-17 12:35:00

标签: php javascript ajax

我有一个由AJAX执行的PHP脚本,PHP脚本加载一切正常,除了我用来关闭div的实际PHP文件中的js脚本(如果PHP文件不通过AJAX运行,所有脚本都工作FYI) ..

这是由ajax

在PHP文件中运行的脚本
 echo "<script> closeOne('" . $postid . "'); </script>";

关闭div的JS脚本包含在页面标题中

这是我正在使用的AJAX脚本

<script type="text/javascript">
function mainload(str)
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest(str);
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("loadmain").innerHTML=xmlhttp.responseText;
        }
      }
    xmlhttp.open("GET","mainload.php?page="+str,true);
    xmlhttp.send();
}
</script>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

默认情况下不执行ajax响应中的JS。您必须解析并识别JS语句,然后使用js的eval函数运行它们。请参阅此代码作为开始您自己的代码的示例:

var sc=xmlhttp.responseText;            
sc=sc.replace(/[\n\r\t\v\u00A0\u2028\u2029]{1,}/gm, ''); //Remove all types of White Space
sc=sc.match(/<.*?script.*?>.*?<\/.*?script.*>/gm); //divide into array, all the script tags

然后你将循环每个'sc'并在循环中运行以下代码:

abc=loop_var.replace(/<.*?script.*?>(.*?)<\/script>/gm, "$1"); //remove script/open close tags and get JS only
eval(abc);

答案 1 :(得分:0)

如果将script元素添加到DOM元素的innerHTML,JS将不会立即运行。 因为刚刚添加了该脚本元素。

并且该标签根本不会被解析。

理想情况下,您应该以JSON包装函数的形式发送响应。

您可以从PHP页面发送这样的输出。

echo "(function(){ closeOne('" . $postid . "'); })";

作为回应,您可以使用eval评估包含该函数的String。

 codeToExecute = eval(xmlhttp.responseText);

然后调用函数

 codeToExecute();

注意:从服务器发送函数并使用eval直接执行它可能是一个安全问题。 小心并且更好地使用一些JS libraray函数来将字符串计算为JSON对象。

jQuery,prototype和sencha的图书馆中将会有String-To-JSON转换器。 更好地使用它们或者如果浏览器支持,JSON.parse也是一个不错的选择。

但我希望你能明白这个概念。

<强>替代地下, 您可以通过JSON从服务器发送post id,并在响应上调用closeOne,如下所示:

在PHP中,

echo "{post_id:".$postid."}";

当响应出现时,

responseObject =  eval("("+xmlhttp.responseText+")");

closeOne(responseObject.post_id);