在ajax调用之后,JS没有被执行

时间:2015-06-10 15:03:27

标签: javascript php ajax

我正在通过调用XMLHttpRequest.send来调用包含一些js代码的php脚本。不幸的是,被调用的php脚本中的javascript代码没有被执行。

调用例程:

var formdata = new FormData();
formdata.append("uploadfilename", file);

var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", progressHandler, false); 
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", "mod/intern/uploader_upload_done.php");
ajax.send(formdata);

被调用脚本中的任何javascript都会失败,甚至是alert()调用。

文件uploader_upload_done.php:

<?php echo date(); ?>
<script>alert("hallo");</script>

直接调用uploader_upload_done.php时,一切正常。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

这是一项安全功能。正确的方法是让您的远程脚本返回类似json的消息:{&#34; date&#34;:&#34; ...&#34;,&#34; message&#34;:&# 34;一些消息&#34;}; 然后在您的处理程序中,您可以从响应中获取JSON并执行警报(json.message)。

答案 1 :(得分:0)

据我所知,您对PHP文件进行了ajax调用,并且您希望执行某些javascript。您应该考虑到,在浏览器中直接拨打电话和打开URL之间存在差异;这意味着您正在下载HTML + CSS + JavaScript代码,浏览器会自动解释它。当你执行ajax调用时,那只是要求服务器执行PHP代码,之后,它只是下载其余的(HTML + CSS + JavaScript),它不会解释它。

如果要执行PHP文件返回的JavaScript代码,请将其嵌入到执行Ajax调用的页面中。从this开始,您可以使用:

function evalJSFromHtml(html) {
  var newElement = document.createElement('div');
  newElement.innerHTML = html;

  var scripts = newElement.getElementsByTagName("script");
  for (var i = 0; i < scripts.length; ++i) {
    var script = scripts[i];
    eval(script.innerHTML);
  }
}

但是,使用eval可能很危险。 作者的演示:http://plnkr.co/edit/LA7OPkRfAtgOhwcAnLrl?p=preview

当您的PHP文件返回完整的HTML文档(即带有头部,正文等的HTML文件)时,此功能非常有用;它获取脚本标记并执行其JavaScript内容。

如果您的PHP文件仅返回JavaScript代码,则可以直接执行它(再次考虑在生产环境中不使用eval)。那就是:

var JSCode = doAjaxCall();
eval(JSCode);

正如其他用户所建议的那样,考虑使用其他通信模式(例如,json文件来指示应该执行的内容,而不是传递要执行的代码)。