我有通过AJAX在codeigniter中提交表单的网页,提交效果很好,并且php脚本也可以工作,但是当php完成后它会返回一个HTML视图作为对Ajax的响应,所以它重新填充了div而是重新填充它尝试下载文件。 Chrome控制台显示
Resource interpreted as Document but transferred with MIME type application/text/HTML
让我感到困惑,因为我在另一个页面中使用相同的代码并且工作正常。
这是我的Jquery脚本
$("#addpaymentform").submit(function (event) {
var formdata = $(this).serialize();
$.ajax({
type: "POST",
data: formdata,
url: baseurl + 'sales/add_payment',
success: function (data, status, xhr) {
var ct = xhr.getResponseHeader("content-type") || "";
if (ct.indexOf('html') > -1) {
$('#paymets').html();
$('#payments').html(data);
$('#addpaymentform').each(function() { this.reset() });
}
if (ct.indexOf('json') > -1) {
$("#Mynavbar").notify(
data,
{position: "bottom center"}
);
$('#addpaymentform').each(function() { this.reset() });
}
}
});
event.preventDefault(); // this will prevent from submitting the form.
});
这是我的控制器
function add_payment()
{
$this->form_validation->set_rules('fpay', 'Type of payment', 'trim|required|alpha');
$this->form_validation->set_rules('payment', 'Payment', 'trim|numeric');
$this->form_validation->set_error_delimiters('', '');
if ($this->form_validation->run() == FALSE) { // validation hasn't been passed
header('Content-type: application/json');
echo json_encode(validation_errors());
} else {
$fpay = filter_var($this->input->post('fpay'), FILTER_SANITIZE_STRING);
$payment = filter_var($this->input->post('payment'), FILTER_SANITIZE_STRING);
if(isset($_SESSION['payments'][$fpay]))
{
$temp = $_SESSION['payments'][$fpay] + $payment;
$_SESSION['payments'][$fpay] = $temp;
header('Content-type: application/html');
echo $this->_loadpaymentcontent();
}
}
}
function _loadpaymentcontent() {
$this->load->view('payment_content');
}
希望有人能指出我正确的方向,我已经坚持了2天。
谢谢大家。
答案 0 :(得分:2)
我遇到了同样的问题,我通过在控制器方法中返回到ajax调用的值之后放置一个 exit; 来成功解决了这个问题。
在您的情况下,它将是:
echo $this->_loadpaymentcontent();
exit;
这里的退出是什么,它将返回值限制为应返回到ajax调用的值,并在将html附加到返回值之前退出。
根据它产生的效果,这是显而易见的。
答案 1 :(得分:0)
你需要设置你的AJAX。
$.ajax({
type : 'POST',
url : baseurl + 'sales/add_payment',
dataType : 'html', // Will set the return type of the response as AJAX.
... Keep rest of the code same.