PHP foreach 循环在 IE8 中添加了闭合 </ul>


PHP foreach loop adds closing </ul> in IE8

我有一个这样的foreach循环:

<ul>
    <?php
        foreach ($pages['results'] as $row => $value) {
            echo '<li>' . $row . '<ul>';
            foreach ($value as $x => $y) {
                echo '<li><a href="#' . str_replace(" ", "", strtolower($y[2])) . '" title="' . $x . '">' . $x  . '</a></li>';
            }
            echo '</li></ul>';
        }
    ?>
</ul>

而且,这在Chrome,Firefox,Safari,IE 9中工作正常,但在IE 8中则不行。

CSS 是正确的,但foreach之外的最后一</ul>foreach的第一行之后关闭。我希望这是有道理的,为什么IE 8要这样做?

这是吐出的 HTML:

新家社区

    安卡
  • 斯特
    • 安卡斯特
  • 格伦
  • 比姆斯维尔
    • 发现
  • 宾布鲁克
    • 集市决赛
    • 帕克赛德村
  • 科林伍德
    • 萨米特海岸
  • 汉密尔顿
    • 格林希尔 格伦
    • 拉蒙
    • 山谷公园
    • 谢尔曼奥克斯
  • 基奇纳
    • 杜恩克里
    • 维多利亚
  • 公园
  • 普通 斯托尼克里克果
    • 园公园

替换最后的回显,你需要关闭ul,然后关闭

li
echo '</ul></li>';

尽管修复错误的解决方案很明显,但它并没有回答这个问题。我们需要知道浏览器在必须解析无效的 html 代码时会做什么。它不会向我们显示错误,但它将使用一些算法来克服错误并在 dom 树中插入正确的元素。它的名称是browsers error tolerance,并且在浏览器之间略有不同。更重要的是,它可能会随着浏览器升级而改变,所以有你的答案:IE8浏览器容错可能没有错,但与其他浏览器相比不同,如果发现li结束标签省略了开始标签

开发人员应阅读本文。

尝试像这样交换关闭 ul 和 li:

<ul>
                <?php
                        foreach ($pages['results'] as $row => $value) {
                                echo '<li>' . $row . '<ul>';
                                foreach ($value as $x => $y) {
                                        echo '<li><a href="#' . str_replace(" ", "", strtolower($y[2])) . '" title="' . $x . '">' . $x  . '</a></li>';
                                }
                                echo '</ul></li>'; //just swap closing elements
                        }
                ?>
            </ul>