为什么我在通过 ajax 获取 php 时得到一个文件 2 次?
Why am I getting a file 2 times when fetching a php via ajax?
我很好奇。我有一个像这样的 php 测试文件:
<div class="live-ajax-messages">message from deep ajax</div>
我将使用此函数获取它:
public function get_ajax_messages_template() {
ob_start();
include(__DIR__. '/../templates/search-results-messages.php');
$content = ob_get_contents();
exit($content);
}
我会得到这样的函数输出:
load_ajax_messages_template: function(){
jQuery.ajax({
url: ajax_url,
data: 'action=my_action', // executes get_ajax_messages_template
dataType: 'html',
type: "GET",
success: function(response){
console.log(response); // getting 2 times <div class="live-ajax-messages">message from deep ajax</div>
//this.results_el.find('.ajax-results').html(response);
}.bind(this),
})
},
基本上,我会得到
<div class="live-ajax-messages">message from deep ajax</div>
<div class="live-ajax-messages">message from deep ajax</div>
为什么?
输出缓冲(ob_*
函数)临时缓冲输出。如果脚本在仍有缓冲输出时退出,它将被写入响应。
因此,您在这里缓冲 search-results-messages.php
的输出。调用 ob_get_contents
returns 当前缓冲区,但不清除它。
然后,当您调用 exit($contents)
时,它会将内容写入响应,然后刷新 也 包含内容的输出缓冲区。
这里有两种可能的解决方案。 (1) 是用 ob_get_clean
替换 ob_get_contents
做同样的事情,但清除缓冲区。
另一个(更简单的)解决方案是只包含文件 而没有 输出缓冲,因为无论如何你都想写出它的内容,然后只需调用 exit();
没有参数。
我很好奇。我有一个像这样的 php 测试文件:
<div class="live-ajax-messages">message from deep ajax</div>
我将使用此函数获取它:
public function get_ajax_messages_template() {
ob_start();
include(__DIR__. '/../templates/search-results-messages.php');
$content = ob_get_contents();
exit($content);
}
我会得到这样的函数输出:
load_ajax_messages_template: function(){
jQuery.ajax({
url: ajax_url,
data: 'action=my_action', // executes get_ajax_messages_template
dataType: 'html',
type: "GET",
success: function(response){
console.log(response); // getting 2 times <div class="live-ajax-messages">message from deep ajax</div>
//this.results_el.find('.ajax-results').html(response);
}.bind(this),
})
},
基本上,我会得到
<div class="live-ajax-messages">message from deep ajax</div>
<div class="live-ajax-messages">message from deep ajax</div>
为什么?
输出缓冲(ob_*
函数)临时缓冲输出。如果脚本在仍有缓冲输出时退出,它将被写入响应。
因此,您在这里缓冲 search-results-messages.php
的输出。调用 ob_get_contents
returns 当前缓冲区,但不清除它。
然后,当您调用 exit($contents)
时,它会将内容写入响应,然后刷新 也 包含内容的输出缓冲区。
这里有两种可能的解决方案。 (1) 是用 ob_get_clean
替换 ob_get_contents
做同样的事情,但清除缓冲区。
另一个(更简单的)解决方案是只包含文件 而没有 输出缓冲,因为无论如何你都想写出它的内容,然后只需调用 exit();
没有参数。