1

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

这是 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>

任何帮助,将不胜感激。

4

2 回答 2

0

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

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

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

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

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

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

 codeToExecute = eval(xmlhttp.responseText);

然后调用函数,

 codeToExecute();

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

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

但我希望你对这个概念很清楚。

或者,您可以只以 JSON 格式从服务器发送帖子 ID,然后在响应中调用 closeOne,如下所示:

在 PHP 中,

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

当回应来临时,

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

closeOne(responseObject.post_id);
于 2012-09-17T12:50:34.080 回答
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);
于 2012-09-17T12:45:55.587 回答