我有一个实用程序,可以绘制简单的弧形,可以使用SVG或Canvas作为回退选项。(早期版本可在我的网站Raphael Arcs Project中找到。)
为了适应移动解决方案,我最近添加了监视容器大小的代码,如果它发生变化,则重新绘制图像以适应新的大小容器。此添加仅使用包含DIV的大小;代码将SVG或Canvas对象添加到DIV中。
但是,重复加载页面时,即使
如果在Chrome中加载上面的链接并点击重新加载,每隔十次左右,Canvas演示文稿都会显示类似的缺陷:它将被调整为视口的宽度:100%,高度:300px,并且演示文稿不会正确绘制。
我查看了jQuery文档,它似乎坚持认为
[编辑]
我最终做了这样的事情(代码是Coffeescript):
为了适应移动解决方案,我最近添加了监视容器大小的代码,如果它发生变化,则重新绘制图像以适应新的大小容器。此添加仅使用包含DIV的大小;代码将SVG或Canvas对象添加到DIV中。
但是,重复加载页面时,即使
$(document).ready
显示已准备就绪,DIV布局有时也没有准备好。这似乎在Chrome下最为普遍;我只在Opera中看到过一次,在Firefox 3.6中从未见过。包含DIV的高度和宽度返回为零。如果在Chrome中加载上面的链接并点击重新加载,每隔十次左右,Canvas演示文稿都会显示类似的缺陷:它将被调整为视口的宽度:100%,高度:300px,并且演示文稿不会正确绘制。
我查看了jQuery文档,它似乎坚持认为
$(document).ready()
足够了。我希望不要让12%的用户经历与浏览器相关的故障。除了编写自己的布局探针(一个旋转的超时不停地询问"容器是否已经调整大小了?" ),还有没有通用的技术或库来确保不仅DOM已加载而且布局管理器已经解决了呢?[编辑]
我最终做了这样的事情(代码是Coffeescript):
$(document).ready ->
$('.wrapper').each ->
demo = =>
c = new CanvasArc $('.canvas_demo', this)
c.sweep(1.0)
r = new RaphaelArc $('.raphael_demo', this)
r.sweep(1.0)
scan = =>
if $('.canvas_demo', this).height()
demo()
else
setTimeout(scan, 100)
scan()
我真的不应该这样做。
window.onload
和.ready
不会等待图片加载。 - Raynos.onload
是否适用于修复canvas/svg。 - Raynos.ready
已经触发,这导致绘图表面具有零尺寸。 - Elf Sternbergonload
事件会在ready
事件之后触发。尝试使用onload
事件来解决你的问题。或者检测<div>
元素的load
事件,但这种方法在浏览器支持方面存在问题。 - Raynos