我正在尝试通过ajax POST
将iframe格式从iframe发送到php,但$_POST
始终为null。
function makePDF(){
var f = $('#iframe1');
var data = f.contents().find('body').html();
var html = escape(data);
alert(html);
$.ajax({
type: "POST",
url: "pdf.php",
data: {'html': html},
cache: false,
success:function(){
alert('done');
document.location.href='pdf.php';
},
error: function(){
alert('error');
}
});
}
此功能通过onClick调用。
<input id="btnpdf" class="btn btn-primary btnpdfh" type="button" value="Generate Preview as PDF" name="PDF" onClick="makePDF()">
<?php
echo 'Test<br>=';
$pdf = $_POST['html'];
echo $pdf;
?>
Firebug显示发出了请求并且数据已发送但$pdf
保持为空,仅显示正常回显。我需要iframe的HTML结构来生成PDF
。
任何帮助表示赞赏,谢谢。
答案 0 :(得分:2)
您需要研究the lifecycle of a PHP request。当您提交ajax请求时,将调用success
回调,其中一个参数包含您期望的输出:
Test<br>=<html data here>
但是,当您重定向到pdf.php
时,您实际上是在发送另一个请求。这个其他请求没有post变量,因此$_POST['html']
是一个空字符串。
尝试将成功功能更改为:
succes: function(data) {
console.log(data);
alert('Done!');
}
然后,打开页面。一旦看到“完成!”,请检查firebug中的javascript控制台。你应该看到你的预期结果。
以下是您的网页所做的时间表:
makePDF()
被称为POST请求发送到带有POST变量的pdf.php:{html: 'content goes here'}
pdf.php
返回Test<br>=content goes here
pdf.php
(Test<br>=content goes here
)pdf.php
pdf.php
,没有变量pdf.php
返回(并在您的浏览器中显示)Test<br>=
,因为此时$_POST['html']
为空现在为什么第二次pdf.php
没有返回它首先要求的返回值?因为HTTP is a stateless protocol。这意味着对pdf.php
的一个请求与另一个请求完全不同。如果不使用GET,POST或SESSION变量(包括cookie),pdf.php
的一个请求就不知道对pdf.php
的任何其他请求。
另外,我相信你在这个例子中滥用了AJAX。 AJAX的目的是在不必导航到新页面的情况下向服务器执行请求。您应该执行ajax请求,然后获取返回的数据并将其注入当前页面(您可以使用传递给success
函数的第一个参数)或完全放弃AJAX并重定向到pdf.php
答案 1 :(得分:1)
你的ajax正在运行,但你没有对响应做任何事情。而是重定向到pdf.php
。当您在success
处理程序中重定向时,您正在执行完全独立的HTTP请求,POST数据现在已从上一个请求中消失,这就是重定向$_POST['html']
为空的原因。
尝试使用响应:
success:function(response){ // <-- capture response
alert('done' + response);
document.location.href='pdf.php';
},