Javascript 为什么这在一个站点上有效,而在另一个站点上无效?
我在php内部使用这个js来显示迭代时的文件名。我已经在6个不同的网站上完美地完成了这项工作,所有这些网站都有相同的代码(WordPress插件)。但是,另一方面,直到php完成,html才会更新。在同一个共享主机上有4个这样的站点,因此它不工作的站点的服务器设置应该与它工作的站点的服务器设置相同。好像ob没有启动或冲洗Javascript 为什么这在一个站点上有效,而在另一个站点上无效?,javascript,wordpress,output-buffering,Javascript,Wordpress,Output Buffering,我在php内部使用这个js来显示迭代时的文件名。我已经在6个不同的网站上完美地完成了这项工作,所有这些网站都有相同的代码(WordPress插件)。但是,另一方面,直到php完成,html才会更新。在同一个共享主机上有4个这样的站点,因此它不工作的站点的服务器设置应该与它工作的站点的服务器设置相同。好像ob没有启动或冲洗 add_action('init', array($this, 'Do_output_buffer')); function Do_output_buffer
add_action('init', array($this, 'Do_output_buffer'));
function Do_output_buffer() {
ob_start();
}
echo”
常量元素=document.querySelector(“#filefind”);
";
@ob_flush();
@冲洗();
echo”
element.innerHTML=`”$价值"`;
";
@ob_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();
}
```
$objects=new recursiveiterator(new recursivedirectoryinterator($this->path),recursiveiterator::SELF_FIRST);
foreach($filename=>$value形式的对象){
echo“element.innerHTML=`.$filename.`;
";
@ob_flush();
@冲洗();
}
```
您试图回音的内容中有几件事发生了
回音中的回音可能会导致问题
结尾
没有得到回音
我将代码更改为:
$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();
}
好的,问题是某个站点上的其他插件或主题正在创建一个额外的输出缓冲区,并且在完成时没有清除它。当我将ob_get_状态(true)转储时,我看到了这一点
[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_刷新显然都刷新了错误的缓冲区,并且没有输出任何内容。因此,我提出的解决方案是在开始发送输出之前检查有多少缓冲区。如果有多个缓冲区,则刷新并关闭除一个缓冲区之外的所有缓冲区。令人惊讶的是,它开始起作用了
下面是我很快想到的黑客代码:
```
$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();
}
}
```
```
$buffers=ob_get_状态(true);
//显示有多少缓冲区处于活动状态的数组。
//回声';
//回显“缓冲区计数:”。计数($buffers)。“
”;
//var_dump(ob_get_status(true));
//回声';
如果(计数($buffers)>1){
对于($i=0;$i)您能在上下文中向我们展示您实际如何使用它吗?您在ob\u flush()
和flush()上抑制错误消息也有原因吗
Ok,添加了一些代码来举例说明我正在做的事情。基本上迭代整个目录树,并在相同的位置显示文件名,希望是相同的。为什么会被禁止?好问题。我对JS很差劲,我发现这是一个代码示例,所以我保持原样。好的,尝试一下随着ob_开始()和抑制关闭。没有错误和相同的问题。一个站点直到html完成后才显示输出。其他站点在循环时显示文件名。这就是我为什么在JS上表现不佳的原因。在这里,它可以工作。在那里,它不能工作,所以我永远不知道我的代码是否正确。好的,只是做了一个测试并运行了ob_get_status(true)在一个非工作站点上,我发现了这个问题。现在我要想办法解决它。在工作站点上,var_转储显示了一个缓冲区。在非工作站点上,它显示了两个缓冲区,第一个是空的,第二个有内容。我显然需要想办法跟踪插件使用的缓冲区。是的,如果你是得到两个缓冲区,肯定有点奇怪。因为我没有访问插件的权限,似乎在init
钩子中打开缓冲区是个坏主意。init
基本上每次调用插件时都会运行。如果你有另一个插件或其他东西正在刷新输出缓冲区,你可能会得到conflicting缓冲区。祝你好运!事实上,我检查过了。在我运行init之前,有0个缓冲区。在init之后,有1个缓冲区。当代码进入我的菜单时,有2个缓冲区,init是我唯一做ob_启动的地方,它肯定没有做两次init。所以,我唯一能得出的结论是我的解决方案可能不是最好的。我想使用ob_get_level()的方法会更好,但是,呃。它很有效。再次感谢!很高兴您对它进行了排序!
$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
}
[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)
}
}
```
$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();
}
}
```