gpt4 book ai didi

单步执行时 JavaScript 行为会发生变化

转载 作者:行者123 更新时间:2023-12-02 14:59:59 25 4
gpt4 key购买 nike

如果我单步执行以下 js 代码(在 OS X 上使用 Firefox 44),我会得到所需的结果:执行 context.setTransform(...) 并且图像被放大2.

correct result obtained only when single stepping

另一方面,如果我通过简单地加载页面来运行 FF 中的代码,就好像从未应用转换一样。 (结果与注释掉 context.setTransform(...) 行相同。)

otherwise an incorrect output is obtained

罪魁祸首似乎是 context.save()/context.restore() 对。注释掉这两行会直接产生期望的结果。但最好使用保存/恢复来包装图形代码以隔离上下文,尤其是当前转换。

您可以generate您这边的图像带有 convert -size 100x100plasma:fractalplasma_fractal1.jpg

我理解设置img.src的顺序是finicky ,但我遵循正确的、多浏览器安全的顺序。

这是怎么回事?

myfrac.html

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<style>
div {
width: 600px;
height: 400px;
background: #BBBBBB;
margin: 20px;
padding: 15px;
}
#myCanvas {
background-color: white;
border: 2px solid black;
width: 400px;
height: 300px;
}
</style>
</head>
<body>
<div>
<canvas id="myCanvas">
<p>Canvas not available</p>
</canvas>
</div>
<script src="myfrac.js" type="text/javascript"></script>
<script>myDrawingFunction()</script>
</body>
</html>

myfrac.js

function myDrawImage(context, imageURI, x, y, w, h)
{
var img = new Image;
img.onload = function(){
context.drawImage(img, x, y, w, h);
};
img.src = imageURI;
}

function myDrawingFunction()
{
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

context.clearRect(0, 0, canvas.width, canvas.height);

context.save();
context.setTransform(2, 0, 0, 2, 0, 0);
myDrawImage(context, "plasma_fractal1.jpg", 0, 0, 200, 200);
context.restore();
}

最佳答案

您面临两个异步函数之间的“竞争”问题(挂接到实际执行drawImage的Image.onload和myDrawingFunction函数的匿名函数)。
在调试情况下,图像有时间加载,因此 onload 立即触发并执行您想要的操作。
如果您只是定期加载页面,则在加载图像之前设置/取消设置上下文:当加载图像时为时已晚(上下文已恢复)并且图像以 1:1 比例绘制。

编码此类事情的正确方法是分离关注点,并在执行任何操作之前等待 dom 和所有图像加载。

关于单步执行时 JavaScript 行为会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com