【问题标题】:Internet Explorer render issue (simple JS timer - window.setTimeout)Internet Explorer 渲染问题(简单的 JS 计时器 - window.setTimeout)
【发布时间】:2011-10-06 15:42:48
【问题描述】:
<script language="JavaScript" type="text/javascript">
    var theBar = createProgressBar(document.getElementById('progress-bar'));

    var value;
    function resetValue() {
        value = 0;
    }

    function showProgress() {
        value += 1;
        theBar.setValue(value);

        if (value < 100) {
            window.setTimeout(showProgress, 100);   
        }

    }
    window.onload=resetValue();showProgress();
</script>

--

<script language="JavaScript" type="text/javascript">
    function createProgressBar(elem) {
        var div1 = document.createElement('DIV');
        div1.className = 'progress-bar-background';
        div1.style.height = elem.offsetHeight + 'px';
        elem.appendChild(div1);

        var div2 = document.createElement('DIV');
        div2.className = 'progress-bar-complete';
        div2.style.height = elem.offsetHeight + 'px';
        div2.style.top = '-' + elem.offsetHeight + 'px';
        elem.appendChild(div2);

        return {
            div1 : div1,
            div2 : div2,
            setValue : function(v) {
                this.div2.style.width = v + '%';
            }
        }
    }
</script>

--

div.field input{
  height: 45px;
  width: 270px;
  font-size: 24px;
}

.progress-bar-background {
            background-color: #D0D0D0;
            width: 100%;
            position: relative;
            overflow:hidden;
            top: 0;
            left: 0;
        }
.progress-bar-complete {
    background-color: green;
    width: 50%;
    position: relative;
    overflow:hidden;
    top: -12px;
    left: 0;
}

#progress-bar {
    width: auto;
    height: 10px;;
    overflow:hidden;
    border: 0px black solid;
}

--

这个 sn-p 在 Chromer、Safari 和 FireFox 下完美运行。

唯一的问题是 Internet Explorer。

它似乎呈现为“半满”并且不执行任何操作。

由于我对 JS 不是很熟悉,所以我不知道从什么开始寻找。

不胜感激一些菜鸟友好的建议。

【问题讨论】:

  • 您能否包含足够的 CSS 和 HTML,以便我们可以在 IE 中实际运行它?

标签: javascript internet-explorer timer timeout


【解决方案1】:

改变这个...

window.onload=resetValue();showProgress();

到这个...

window.onload = function() {
  createProgressBar();      
  resetValue();
  showProgress();
};

你应该没事的。

记住... "window.onload" 是 Window 对象的一个​​属性......并且这个属性的值应该是一个函数,一旦浏览器加载了整个 DOM AND 所有内容(图像、css、js等)

然而,这不是一个执行你的东西的好地方——你应该使用事件“onContentLoaded”,但由于它不是跨浏览器统一支持的——你应该使用 JavaScript 库,例如 jQuery、Prototype 或 MooTools。

但是——当然,如果你是 JS 的新手——不要为了获得使用这些库的乐趣而略读它——首先要真正了解 JavaScript 是什么以及如何兼顾由于浏览器不兼容 - 只有这样您才能充分发挥这些库的潜力。

【讨论】:

  • 我认为他还必须在页面加载成功后调用createProgressBar。所有 DOM 操作都必须等到 DOM 加载完毕——尤其是在 IE 中。
  • 当然——你说得对——谢谢指出
  • 您发布的代码似乎可以解决问题,谢谢。由于我对 JS 有点不熟悉,有什么好的起点可以学习? (书籍或在线)您可以推荐任何具体的内容吗?提前致谢。
  • 仍然不是完全正确的代码,因为他必须保存来自 createProgressBar 的值,但看起来 Big_Bird 现在已经自己弄清楚了。
  • 如果你正在开始 JS——阅读this 书——我还没有找到比这更好的书。获取它的最新版本。另外,在谷歌上搜索“JSCONF”——你会发现大量视频来丰富你的 JavaScript 曲目。
【解决方案2】:

我看到的第一件事是,在页面加载之前,您不应该创建进度条(或引用 DOM 中的任何内容)。 IE对此特别敏感。在我看来,您是在加载 javascript 时而不是在加载页面之后调用 createProgressBar。

当我将你的东西放入 jsFiddle 并确保代码在页面加载之前不会运行时,它适用于我在 IE8 中。

在这里查看:http://jsfiddle.net/jfriend00/CQqat/

【讨论】:

  • 那么我是否会以某种方式延迟执行,或者有没有办法让我检查页面是否加载并运行它?
  • 您已经使用 onload 处理程序完成了部分工作。制作一个连接到 onload 的初始化函数。在那个初始化函数中,运行所有初始化代码,包括创建初始进度条、初始化它然后启动它。
  • onload 并不理想,但在这种情况下它会起作用。像 jQuery 和 YUI 这样的 JavaScript 工具包让这变得更容易了。
  • 我试过你链接的 jsFiddle,似乎工作正常。但是,当我去我的本地机器时,它不会。 @greengit 的回答似乎解决了这个问题。
  • 是的,我对 greengit 的评论是他们需要的最后一条。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多