【问题标题】:javascript preloading of any images not working in chromejavascript预加载任何不适用于chrome的图像
【发布时间】:2012-01-21 13:15:21
【问题描述】:

我是网页设计的新手,我刚刚创建了以下网站http://www.janewaltonwatercolours.co.uk,除了一些小故障之外,它在所有浏览器上都可以正常工作。

但是,在 Chrome 中,我用于预加载图像的 javascript 函数无法正常工作(导致导航栏图像闪烁等),并且尝试了所有方法并且在网络上没有遇到任何答案,我慢慢地发疯了。 ....

相关代码如下:-

var navbarImages = new Array();
preload(navbarImages,"images/navbar/topbigdrophover.gif","images/navbar/topdrophover.gif","images/navbar/tophover.gif");

function preload() {
    var images = preload.arguments[0];

    for (i = 1; i < preload.arguments.length; i++) {    
        images[i-1] = new Image();
        images[i-1].src = preload.arguments[i];
        }
    }

这适用于除 Chrome 之外的所有用户 - 有什么想法吗?

任何帮助都得到了极大的帮助!

迈克

更多详细信息 - 导航栏在悬停时闪烁,表明 Chrome 未预加载图像。这是由未在缩略图库页面上预加载的大预览图像支持的。

第一次加载页面时会加载 main.css 样式表,然后根据屏幕大小加载第二个样式表以适应屏幕大小。不过,第二个样式表不会影响导航栏。

main.css 中导航栏的代码:-(我知道有点乱...)

nav {position: relative; margin: 0 auto; text-align: center; height: 35px; line-height: 35px; font-size: 16px;}

.top {float: left; text-decoration:none; font-size:16px; font-weight:bold; cursor:pointer; background: url(../images/navbar/back.gif);color:#ccc;}

.topbig {float: left; text-decoration:none; font-size:16px; font-weight:bold; cursor:pointer; background: url(../images/navbar/back.gif);color:#ccc;}

.topdropdown {float: left; text-decoration:none; font-size:16px; font-weight:bold; cursor:pointer; background: url(../images/navbar/topdrop2.gif) no-repeat right top;color:#ccc;}

.topbigdropdown {float: left; text-decoration:none; font-size:16px; font-weight:bold; cursor:pointer; background: url(../images/navbar/topbigdrop.gif) no-repeat right top;color:#ccc;}

.top:hover {color:#fff; background: url(../images/navbar/tophover.gif) no-repeat right top;}

.topbig:hover {color:#fff; background: url(../images/navbar/topbighover.gif) no-repeat right top;}

.topbigdropdown:hover {color:#fff; background:url(../images/navbar/topbigdrophover.gif) no-repeat right top;}

.topdropdown:hover {color:#fff; background:url(../images/navbar/topdrophover.gif) no-repeat right top;}

【问题讨论】:

  • 我不认为这是会导致您的图像闪烁的代码。您遇到的具体问题/症状是什么?
  • 快速提问:那你用这些图片做什么?我猜某种滑块/画廊?那么问题出在哪里就清楚了。
  • 使用arguments 而不是preload.arguments

标签: javascript image google-chrome preload


【解决方案1】:

终于修好了!

这不是代码或 css 的问题,它显然是我的 Chrome 版本的一个已知问题。基本上,即使某些图像/文件被缓存,Chrome 仍然会尝试向服务器发出 if-modified-since GET 请求。因此,为了解决这个问题,我使用 .htaccess 文件设置了缓存文件类型的到期时间来覆盖它 - 即 ExpiresByType image/jpg "access plus 4 hours" http://code.google.com/p/chromium/issues/detail?id=102706

【讨论】:

    【解决方案2】:

    跟进:

    我看过你的小提琴,我不能确定这个问题,但我注意到你正在使用 js 来根据窗口大小更改 css 文件。

    我猜这就是问题所在。 css被加载,dom被加载,然后js运行,当新的css被调用时你会看到闪烁。

    您可以通过在 CSS 中使用媒体类型和媒体查询来解决这个问题。 cf w3.org/TR/css3-mediaqueriesstackoverflow.com/a/996796/215752

    我使用了媒体查询,那么 css 将在 dom 加载之前定义,并且应该没有闪烁。

    也可能只有一种尺寸存在错误——对于媒体类型,很容易强制使用一种进行测试。


    我没有发现您的代码有任何问题,并且我认为这段代码不会导致闪烁(我认为这是 CSS 问题),但这里是您使用更当前的样式重新编写的代码:

    var navbarImages = [];
    preload(navbarImages,
       ["images/navbar/topbigdrophover.gif",
        "images/navbar/topdrophover.gif",
        "images/navbar/tophover.gif"]);
    
    function preload(inArray,pathList) {
      var images = inArray;
    
      for (index = 0; index < pathList.length; index++) {    
        images[index] = new Image();
        images[index].src = pathList[index];
      }
    }
    

    我看不出var images = inArray 的原因(只能使用 inArray),但我保持它与您的代码一致,有很多方法可以编写具有此功能的代码。

    我建议发布一个新问题,详细说明您在使用 chrome 时遇到的闪烁问题——我猜您可以通过一些细节了解真正问题的核心。

    【讨论】:

    • 感谢 Hogan - 我同意可以删除第一行函数。我在顶部的原始帖子中添加了更多详细信息。有趣的是,我刚刚在我女朋友笔记本电脑上的 Chrome 上尝试过它(是的 - 我是一名网页设计师,我有一个女朋友!)并且闪烁不存在?!其他图像也正确预加载。所以也许我的 Chrome 设置有问题?我几周前才下载 Chrome 并没有更改任何设置,所以看起来很奇怪
    • @Hogan 另一个重构是从预加载返回图像数组,而不是传入要使用的数组。索引从零开始,因此它已经假定它正在将图像添加到一个空数组中。
    • @MWalton - 可能是简单的字体问题。尝试使悬停与非悬停完全相同。例如,在发布的代码中,一个有font-size,一个没有。如果默认字体不同,这可能会导致闪烁(例如,发生一些不需要的字体大小重新计算)。如果您尽可能精确地悬停,您应该会看到闪烁消失。仍在发生——在 jsfiddle 上发布示例,我们会解决它。
    • @Douglas - 这正是我在回答中“有很多方法”评论的观点。我只是展示了一种更简单的方法来完成完全相同的功能。不是参考实现。
    • 不要忘记varindex
    【解决方案3】:

    您需要使用arguments 而不是preload.arguments 来访问传递给函数的参数。

    虽然使用func.arguments 只会在严格模式中导致问题,但它可能在 Chrome 中完全被禁止。

    如果fun 处于严格模式,fun.callerfun.arguments 都是不可删除的属性,在设置或检索时会抛出

    来自https://developer.mozilla.org/en/JavaScript/Strict_mode#Making_eval_and_arguments_simpler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多