为什么通过 ajax 获取 php 时会获得 2 次文件?

Why am I getting a file 2 times when fetching a php via ajax?

提问人:Luca Reghellin 提问时间:3/21/2022 更新时间:3/21/2022 访问量:62

问:

这对我来说很好奇。我有一个像这样的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>

为什么?

javascript php ajax 输出缓冲

评论

0赞 Nico Haase 3/21/2022
中方能否介绍有关情况?你面临的问题是什么?你试图解决它吗?这是JS问题,还是PHP问题?

答:

2赞 garrettmills 3/21/2022 #1

输出缓冲(函数)临时缓冲输出。如果脚本在仍有缓冲输出时退出,则该脚本将被写入响应。ob_*

因此,在这里,您正在缓冲 的输出。对 的调用返回当前缓冲区,但不清除它。search-results-messages.phpob_get_contents

然后,当您调用它时,它会将内容写入响应,然后刷新包含内容的输出缓冲区。exit($contents)

这里有两种可能的解决方案。(1)是替换 with which 做同样的事情,但清除缓冲区。ob_get_contentsob_get_clean

另一个(更简单的)解决方案是只包含文件而不进行输出缓冲,因为您无论如何都想写出其内容,然后只在不带参数的情况下调用。exit();