【问题标题】:jQuery fadeIn not working on IE9jQuery fadeIn 在 IE9 上不起作用
【发布时间】:2011-08-05 15:41:00
【问题描述】:

这个问题很奇怪。我有一个网页可以在计时器上淡入淡出图像,使用jQuery的fadeIn()和fadeOut()方法。它在 Firefox 和 Chrome 中运行良好,但在 IE9 中却不行——只显示了第一张图片。在大量删除 CSS、HTML 等以减少原因之后,我设法让它在 IE9 中工作但前提是我删除了我的 HTML 文件的第一行

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

存在该行时,fadeIn() 失败。没有那条线,fadeIn() 可以工作。无论如何,fadeOut() 似乎都可以工作。

我正在使用最新的稳定版本的 jQuery(昨天下载)。

这是 HTML 文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script src="scripts/jquery.js" type="text/javascript"></script>
        <script src="scripts/imageswitch.js" type="text/javascript"></script>
    </head>
    <body>
        <div id="myGallery">
            <img src="/images/Img1.jpg" id="firstimg" class="active ready" onload="setInterval( 'swapImages()', 3000 );" />
            <img src="/images/Img2.jpg" onload="SetImgReady(this);" />
            <img src="/images/Img3.jpg" onload="SetImgReady(this);" />
        </div>
    </body>
</html>

这是“imageswitch.js”的内容:(我使用 SetImgReady() 函数在每个图像完成下载后为其添加“就绪”类,因此它只会在完全加载的图像之间旋转)

function swapImages() {
    var $active = $('#myGallery .active');
    var $next = ($('#myGallery .active').next().length > 0) ? $('#myGallery .active').next() : $('#myGallery img:first');

    while ($next && !$next.hasClass('ready')) {
        if ($next.next().length > 0)
            $next = $next.next();
        else
            $next = false;
    }

    if ($next && $active) {
        $next.fadeIn( 2000 ).addClass('active');
        $active.fadeOut( 2000 ).removeClass('active');
    }
}

function SetImgReady( $ImgObj ) {
    if ($ImgObj)
        $ImgObj.className += "ready";
}

这是 CSS:

#myGallery{
    position:relative;
    width:400px;
    height:300px;
}
#myGallery img{
    display:none;
    position:absolute;
    top:0;
    left:0;
    border: 1px solid black;
}
#myGallery img.active{
    display:block;
}

那么...声明是否让 IE9 过度符合标准并决定在 XHTML1.0 或其他什么情况下不允许淡入淡出?

另外一件奇怪的事情也发生了,一旦淡入淡出工作:仅在第一个图像开关上,显示的图像立即消失而不是淡出。所有其他图像都可以根据需要很好地淡入/淡出。对此也有什么想法吗?

谢谢大家。

【问题讨论】:

    标签: jquery internet-explorer-9


    【解决方案1】:

    大卫:头部缺少标题不是错误。事实上,HTML5 让我们跳过整个 head 部分,它是有效的。根据官方 W3C HTML 规范,您只需要有一个正文部分 :) 所以我想这是允许的最短 HTML:

    <html><body><h1>hello world</h1></body></html>
    

    只是不确定是否需要 !doctype :)

    主题问题是-在某种程度上与 IE 中的 CSS 和显示属性有关,大多数情况下来自 IE6。如果您将“display:none”设置为 HTML 元素,则使用 FadeIn 不会获得任何结果,因为“display:none”导致元素不显示,并且 fadeIn 不会更改此状态。

    我的解决方案是:将 CSS 类设为“隐藏”并像往常一样设置为“显示:无”。而这行 JavaScript 代码在 document.load 上触发:

    $('.hidden').fadeTo(0,0).css('visibility','visible');
    

    在那之后淡入 - 最终淡出:) - 现在应该可以工作了。如果您仍然遇到任何问题 - 尝试使用 fadeTo 或 opacity 动画效果代替 fadeIn/fadeOut。

    【讨论】:

    • 谢谢@user1906727,那里有一些有用的提示。
    【解决方案2】:

    删除 DOCTYPE 会使 IE 进入 quirks 模式,您可以通过按 F12 激活调试控制台然后在屏幕底部选择 quirks 模式或兼容模式来实现相同的目的。

    不过,我也遇到了同样奇怪的行为。

    出于某种原因,在调试模式下执行代码似乎效果更好,或者如果您将行为附加到按钮上,如果您点击足够多,它最终会起作用。

    我认为淡入淡出行为是错误的,并且只在元素的背景而不是前景中淡入淡出。 show() 表现出同样奇怪的行为。

    在兼容性视图中一切正常,尽管我不喜欢使用它。

    【讨论】:

    • 这并不是 OP 的真正答案或解决方案。
    • 大卫 - 谢谢。 @Sparky672 - 大卫确实说兼容性视图解决了问题,所以我想说这是答案的某种方式。目前,我已经完成了一小块仅 IE 的代码,它不会进行淡入淡出,而只是立即交换图像。不太好,但我猜这是使用 IE 的缺点。 :)
    • @Nick,它没有确定根本原因,并且删除有效的 Doctype 不是解决方案。您是否已通过 W3C 验证器运行您的页面?
    • W3C 验证器显示:head 中缺少 ,<img> 标签中缺少 alt 属性,<img> 标签的“onload”属性无效。在 <img> 标签中查找 onload,MSDN 暗示它 <i>is</i> 有效:<a href="/default/index/tourl?u=aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjMTk3MDU1JTI4dj12cy44NSUyOS5hc3B4" rel="nofollow" target="_blank">msdn.microsoft.com/en-us/library/cc197055%28v=vs.85%29.aspx</a>,但那里的评论说“对于动态创建的 img 对象,只有在从以下位置下载源文件时才会触发 onload 事件Web 服务器。当文件已经存储 [在浏览器的缓存中] 时,永远不会触发 onload 事件。这很可能是问题所在,但不能解释为什么我的代码没有 DOCTYPE 声明就可以工作。
    • Sparky672,我在解释删除 DOCTYPE 对 Nick 的作用,而不是提供完整的解决方案。这个问题是 IE9 中的错误行为,与 fadein() show() 和其他效果有关。我无法解决它,因为它是 IE 的问题。尝试在 microsofts CDN asp.net/ajaxlibrary/cdn.ashx 上运行淡入淡出示例,您将看到完全相同的行为。它适用于所有其他浏览器和兼容模式下的 IE9。
    【解决方案3】:

    我在 1.6.2 中遇到了同样的问题。 1.6.4 的更新解决了这个问题。

    【讨论】:

    • 谢谢@Drake,我会试一试的。
    • 你在现场 - 最新的 jQuery 已修复它!谢谢。
    • @NickShaw 版本 1.7.1 会带来这个问题吗?我现在遇到了这个问题......特别是fadeOut。
    • 我还没有尝试过 v1.7.1 - 暂时坚持使用有效的版本!
    【解决方案4】:

    如果您使用的是旧版本的 jquery,请升级到 1.6+ 版本。旧版本的 IE9 中存在一些问题。我希望这能解决问题。

    【讨论】:

    • 我使用的是 v1.6.2,所以这不是问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多