我正在通过调用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时,一切正常。
我做错了什么?
答案 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文件来指示应该执行的内容,而不是传递要执行的代码)。