我在php中使用这个js在迭代时显示文件名。我有这个完美的工作在6个不同的网站,他们都有相同的确切代码(WordPress插件)。但是,在另一种情况下,只有在php完成后才会更新html。在同一个共享主机上有4个站点,因此不工作的站点的服务器设置应该与不工作的站点相同。就像妇产科医生没有开始也不脸红。
add_action('init', array($this, 'Do_output_buffer'));
function Do_output_buffer() {
ob_start();
}
echo "<script>
const element = document.querySelector('#filefind');
</script>";
@ob_flush();
@flush();
echo "<script>
element.innerHTML = `<div>" . $value . "</div>`;
</script>";
@ob_flush();
@flush();
谢谢!
编辑每个请求
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $filename => $value) {
echo "<script>element.innerHTML = `<div>" . $filename . "</div>`;
</script>";
@ob_flush();
@flush();
}
```
发布于 2020-04-14 11:53:09
有几件事情发生在你想要echo
出来的东西上。
,
</script>
没有被回音的问题。我会将代码修改为:
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $filename => $value) {
// Enclose the echo in single quotes and use double quotes for the actual JS.
echo '<script>element.innerHTML = "<div>' . $filename . '</div>";</script>';
// Remove the error suppression so you can actual see errors.
ob_flush();
flush();
}
我也不确定您的主插件如何与Do_output_buffer()
函数一起工作--因为它是在init
上调用的,所以它要缓冲,直到得到flushed...after --第一个foreach
--那么缓冲区就可能变得无用。如果是这样的话,您可以在每次迭代中打开缓冲区:
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $filename => $value) {
// Start the buffer here.
ob_start();
// Enclose the echo in single quotes and use double quotes for the actual JS.
echo '<script>element.innerHTML = "<div>' . $filename . '</div>";</script>';
// Remove the error suppression so you can actual see errors.
// Flush the buffer.
ob_flush();
flush();
// repeat
}
发布于 2020-04-15 07:10:06
好的,所以,问题是一个站点上的其他插件或主题正在创建一个额外的输出缓冲区,并且在完成时并没有清除它。当我var_dumped ob_get_status(真)时,我看到了这个。
[0]=>
array(7) {
["name"]=>
string(22) "default output handler"
["type"]=>
int(0)
["flags"]=>
int(112)
["level"]=>
int(0)
["chunk_size"]=>
int(0)
["buffer_size"]=>
int(16384)
["buffer_used"]=>
int(0)
}
[1]=>
array(7) {
["name"]=>
string(22) "default output handler"
["type"]=>
int(0)
["flags"]=>
int(112)
["level"]=>
int(1)
["chunk_size"]=>
int(0)
["buffer_size"]=>
int(32768)
["buffer_used"]=>
int(28778)
}
}
这意味着,我发送的每一次刷新或ob_flush显然都刷新了错误的缓冲区,没有输出任何内容。因此,我想出的解决方案是在开始发送输出之前检查一下,看看有多少缓冲区。如果有不止一个,我就会脸红,关闭所有的缓冲器,只有一个除外。令人惊讶的是,它开始起作用了。
下面是我很快想出的恶意代码:
$buffers = ob_get_status(true);
//shows the array of how many buffers are active.
//echo '<pre>';
//echo 'Buffer Count: '. count($buffers).'<br>';
//var_dump(ob_get_status(true));
//echo '</pre>';
if (count($buffers) > 1) {
for ($i=0;$i<count($buffers)-1;$i++) {
ob_end_flush();
}
}
谢谢你的回复和帮助我说出这句话。
https://stackoverflow.com/questions/61214979
复制相似问题