在IE9中显示所有零的有序列表

33

我有一个 <ol>(有序列表),在火狐、Safari和Chrome浏览器中渲染正常。 然而,在IE9中,所有的数字都显示为0。这不是间距/填充问题,因为我能看到这些零。

我的HTML代码如下:

<ol> 
    <li>Enter basic company information</li> 
    <li>Select from our portfolio of products</li> 
    <li>Attach your employee census</li> 
    <li>Review your selections and submit your request.</li> 
</ol>

有人遇到这个问题并希望得到解决方案吗?

列表问题


3
您需要提供一张屏幕截图和更多的代码,包括CSS样式。我已经在IE9上测试过了,它运行良好。http://jsfiddle.net/rpjrj/ - Hawxby
1
你确定它是“零”,而不仅仅是一个圆圈吗?也许你的CSS有list-style-type:circle;我们确实需要更多的HTML和CSS。 - NakedBrunch
我的列表样式是有序列表,外部无样式。我怎么在这里添加截图? - Rkstarcass
1
@Rkstarcass - 截图无法帮助。如果CSS不正确,这个bug有时会在Internet Explorer中发生。请给我们出现问题的网站URL,或使用jsfiddle.net发布您的代码。http://www.maratz.com/blog/archives/2006/10/15/internet-explorer-ordered-list-non-incrementing-list-item/似乎与您观察到的行为有关。 - duri
我也遇到了同样的问题 - 但只有在使用JQuery动态隐藏/显示包含有序列表的div时才会出现。更改list-style没有帮助。我的CSS太长了,无法在此处发布。IE9在9模式和8模式下都有这个问题。 - avioing
显示剩余4条评论
11个回答

27

更新于2012年3月20日 - 修复了IE10中的问题

这个问题在Internet Explorer 10(所有文档模式)中已经被修复。Microsoft已经删除了Connect条目,因此您无法查看其状态。由于Microsoft现在会自动推送IE10,所以对于所有常规客户都应该可以正常工作。


这是一个已知的IE9回归问题,已在Microsoft Connect上报告:

有序列表编号从正确更改为0,0

类型:Bug
ID:657695
开启时间:2011年4月6日12:10:52 PM
访问限制:公共

0个解决方法
5个用户可以重现此错误


更新:

Microsoft于2011年6月14日下午3:20发布
谢谢你的反馈。

我们能够重现这个问题并正在进行调查。

最好的问候,

Internet Explorer团队


可重现错误的HTML页面:

<!DOCTYPE html>
<HTML>
<HEAD>
<TITLE>IE9 Ordered List Zero Bug</TITLE>
<SCRIPT type="text/javascript">
    setTimeout(function ()
        {
            document.getElementById("dv1").innerHTML = "<ol><li>XXX</li><li>YYY</li></ol>";
            var container = document.createElement('span');
            container.style.cssText = "display:none";
            document.getElementById("dv2").appendChild(container);
        }, 1000);
</SCRIPT>
</HEAD>
<BODY>

<DIV id="dv1">
    <OL>
    <LI>AAA</LI>
    <LI>BBB</LI>
    </OL>
</DIV>

<DIV id="dv2"></DIV>

</BODY>
</HTML>

解决方法是在你的DIV后面放置一个空元素:

<div id="one">
   <ol>
      <li>one</li>
      <li>two</li>
   </ol>
</div>
<div id="two" style="display:none">
   <ol>
      <li>three</li>
      <li>four</li>
   </ol>
</div>
<div id="empty"></div>

出现该 Bug 的浏览器

Internet Explorer 9 (9.0.8112.16421)

  • 文档模式 Quirks:正常工作
  • 文档模式 IE7 标准:正常工作
  • 文档模式 IE8 标准: 失败
  • 文档模式 IE9 标准: 失败

Internet Explorer 8 (8.0.6001.19048)

  • 文档模式 Quirks:正常工作
  • 文档模式 IE7 标准:正常工作
  • 文档模式 IE8 标准:正常工作

Internet Explorer 7 (7.0.6000.16982): 正常工作

Google Chrome 10 (10.0.648.134): 正常工作


1
尝试访问Microsoft Connect链接(已注册),出现“页面未找到”的错误。是否有关于此的任何信息?谢谢。 - avioing
该页面仍然存在于Microsoft Connect上。更新了答案,并获得了微软的确认。 - Ian Boyd
1
该死,对我似乎不起作用。更新:延迟隐藏+显示有效! - kangax
2
我已经点赞了,但你应该在你的解决方法中包含JS组件。即,在调用JS show方法后,调用document.getElementById('empty').innerHTML = ' '; - User123342234
@JoshStuart 我想提供一个解决方法,但我不知道任何。 - Ian Boyd

7

还有另一种解决方案:

  1. 显示元素:

         el.show();
    
  2. 然后:

     setTimeout(function(){
            $("ol").css("counter-reset", "item")
     }, 1);
    

这并不总是有效。进行“计数重置”更新有时可以修复一些<li>元素,但并非所有元素都能修复。 - Pointy

3
空的div绕过方法对我无效。这里是一些简单的jQuery代码,可以解决问题。
// Workaround for IE list display bug
$('ol').hide().delay(1).show();

3
我发现这只有在“show”完成后才起作用。对我来说,这是解决方案:setTimeout(function(){$('ol').hide().delay(1).show();}, 2); - Fresheyeball
这对我有用。如果您使用的是较旧版本的jQuery(没有延迟方法),则可以将show()函数设置为回调函数,在hide()函数执行后执行。 - RussellUresti

2
这似乎是在特定情况下出现的错误,具体涉及使用 AJAX 的情况。本文列出了重现步骤,但没有给出任何解决方法。

http://blog.darkthread.net/post-2011-03-19-ie9-ol-bug.aspx

请注意文章是中文的,我是用Chrome翻译的。
这里有一个可以工作的fiddle示例,展示了动态更新列表没有问题:

http://jsfiddle.net/6tr9p/18/

不幸的是,这并不能解决在需要结合 AJAX/IE9/有序列表的情况下出现的问题,如果 OP 使用 SharePoint,那么很可能是这种情况。
在自己的问题上浪费了几个小时后,我可以确认(除了 SharePoint 外),这绝对是 Windows 7 上 IE 9.0.8112 的问题。它似乎也影响了使用 CSS 的 counter-increment 方法实现有序列表(即它无法正常工作;所有列表项仍然以零编号)。
如果我找到比“处理它”/“删除 AJAX”更好的解决方案,我将更新我的答案。
编辑:这是我的“更好的答案”。
该代码仅经过初步测试,涉及钩入 AJAX 客户端 API。它可能在其他版本的 IE 或其他浏览器中出现故障。自担风险使用。
尽管如此,它修复了在 IE9 中显示所有零的有序列表的行为,并且在定义了隐式和显式起始数字(通过 start 属性)时都有效。请注意, start 属性在 HTML5 中不再被弃用。
function endRequest_OL_Fix(sender, args) {
    var ols = document.getElementsByTagName("ol");

    for (var i = 0; i < ols.length; i++) 
    {
        var explicitStart = ols[i].start;

        if (explicitStart > 0) {
            ols[i].start = -1;
            ols[i].start = explicitStart;
        }
        else {
            ols[i].start = 1;
        }
    }
}

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest_OL_Fix);

一旦请求完成(包括异步请求),页面上的所有OL标签都会被检查。如果它们具有明确定义的start属性,则该属性将被保留、重置和重新分配。否则,start将被明确分配。
这将强制重新绘制,并且在上述注意事项下解决了问题。

这个错误似乎与 AJAX 完全没有关系。只是切换可见性就可以解决。 - Pointy
@Pointy - 如果我没记错的话,我当时遇到的问题是在 AJAX 请求后将元素插入 DOM 中,因此我认为这必须是动态节点创建/插入引起的问题(这就是我的答案测试和尝试修复的内容)。很高兴你发表了评论;自从我发布答案以来,关于这个问题有了更多的信息。我后来在其他场景中也遇到了这个问题。 - Tim M.
1
很感谢你的回答,因为这是页面上唯一适用于我的答案 :-) - Pointy

1

@Alex Kleshchevnikov - http://choosedaily.com/2481/ie9-bug-ordered-list-zeroes-ajax-request/

我曾使用过这段代码,但仍然得到了零值。我修改了它,在有问题的OL后面添加了另一个OL,然后很快隐藏它。

"windows_instructions"是我要修复零值的OL。"ie_fix"是我要隐藏的虚拟OL。我尝试将第二个超时设置为2毫秒,但这不够时间。由于我的ajax内容正在淡入,所以100毫秒没有FOUC。

如果对未来的修复有帮助,似乎问题总是出现在页面上的最后一个OL。

以下是代码:

if($("#windows_instructions").length>0)
    {
        $("#windows_instructions").hide();
        ieTimeout = setTimeout(function() 
        {    
            $("#windows_instructions").show();
        }, 1);
        ieTimeout = setTimeout(function() 
        {    
            $("#ie_fix").hide();
        }, 100);
    }

您的DIV解决方法中的空元素对我没有起作用。在我的情况下,IE 9有序列表问题出现在AJAX PostBack向UpdatePanel添加新的有序列表之后。隐藏和显示包含有序列表的Div效果很好! :) - landsteven

1

最近我自己遇到了这个问题,并想出了一种不同于包含空div的解决方案。在不同的场景下肯定需要进行更多测试,但是这对我有效,即使列表被隐藏并再次显示。

var ieTimeout;
var selectorWrapperSet = $(selector);

selectorWrapperSet.css("display","none");
ieTimeout = setTimeout(function() {
selectorWrapperSet.css("display","block");
}, 1);

1

首先,只需使用CSS即可看到此错误。每当隐藏和显示<ol>时都会发生这种情况。示例jsfiddle显示错误。

在某些情况下,也可能仅使用CSS修复错误。修复是一致的,但代码很脆弱,不是最好的。在这里,许多本不应该在CSS中起作用的东西确实起了作用,因此请小心编写代码。 示例jsfiddle可以正常工作。。基本思路是:切换行而不是列表,然后在(可见但有时为空的)<ol>上使用counter-reset重新创建列表编号,并在<li>上使用counter-increment

优点:这里的所有内容都可以放在仅限IE的样式表中。如果在您的情况下:hover没有意义,并且您使用类似于jQuery .show()的东西,请考虑基于.addClass()的解决方案。
说到添加类,如果这个bug还不够奇怪,那么在像第一个示例中的条件下,似乎<ol>在IE中可以工作,如果Javascript向包装元素添加一个类-即使该类不起作用。这里是一个jsfiddle示例。不能保证它在其他地方也能工作,但在这里它可以工作。

如果你试图理解这个 bug,a) 祝你好运,b) 看一下这里的 jsfiddle。这是发生在使用 CSS 的 counter 选项(加上常规编号),但切换的不是 <li> 而是 <ol> 的情况。你会得到一个疯狂的情况,显示的内容完全取决于你是否将鼠标悬停在前一个兄弟元素、后一个兄弟元素或两者都不是。毫无意义...但这可能是这个 bug 真正含义的线索。


我还遇到了一个无法复制的情况,其中编号全部为1、2、3等,具体取决于哪个<ol>:页面上的第一个变成1,1,1,1,1,第二个变成2,2,2,2,2,然后是3,3,3,3,3等。无法确定是什么原因导致这种怪异现象。

0

你可能需要在你的样式表中添加以下标记代码 -

ol {list-style:decimal}

这个声明的作用是,如果你还没有在样式表中声明有序列表的类型,它会声明你所偏好的类型。


缺少默认列表样式不会导致Chrome,FF,IE 8或IE 9中显示零:http://jsfiddle.net/jazhx/ - Tim M.
你是对的,但它们可能已经被更具体的属性所支配。 - breezy
可能。像FF、Chrome、IE这样的DOM检查器将是OP寻找的第一个地方。尽管我会质疑谁会首先定义一个将所有OL设置为零的规则。 - Tim M.

0
从您的截图来看,看起来您正在使用SharePoint。我猜测这是由于SharePoint中现有CSS设置导致的CSS干扰。
作为一项测试,请尝试将您的"ol"样式声明为内联样式,看看是否有所帮助。
<ol style="list-style-type:decimal;"> 
    <li>Enter basic company information</li> 
    <li>Select from our portfolio of products</li> 
    <li>Attach your employee census</li> 
    <li>Review your selections and submit your request.</li> 
</ol>

0

在Windows 10上,Edge也遇到了类似的问题。在使用CSS过渡打开的移动菜单中,列表项旁边显示0s。我尝试了无数种ol、其父元素和子元素的list-style: none;和list-style-type: none;变体,但都没有解决问题。

最终,我找到了以下解决方法,可以修复Edge/IE上的问题,而不会影响其他桌面和移动浏览器的样式:

/*
  Hack for Edge browser. Some things never change...
  This is definitely dirty, hacky and overkill.
  Without this, Edge on windows 10 shows a 0. next to every list item in a mobile menu that is animated with a css transition on our site.
  Using technique for targeting Edge from https://dev59.com/xlwY5IYBdhLWcg3wyqaH
  Answer by KittMedia: https://dev59.com/xlwY5IYBdhLWcg3wyqaH#32202953/
*/
@supports (-ms-ime-align: auto) {
  .element-im-targeting ol,
  .element-im-targeting ol li,
  .element-im-targeting ol * {
    list-style: none;
    list-style-type: none;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接