我正在开发一种可以从图像中选择颜色的工具,并且我正在尝试使用可拖动的 div 来突出显示图像中的颜色以添加到调色板中。我的代码在espresso的预览功能中工作,但是一旦部署到网站上,背景颜色就不会实时更新。相反,当我向下滚动窗口或有时延迟后它会更新。以下是相关代码:
for (i=0; i<maxPaletteSize; i++)
{
circleDiv[i] = document.getElementById('circle' + i);
$("#circle" + i).draggable({
drag: function(event, ui) {
// find current x,y of div
var circleX = ui.position.left;
var circleY = ui.position.top;
// figure out what color pixel the circle is over
var pixelNum = Math.round(circleY * img.width + circleX) * 4;
var color = "rgba(" + imgData.data[pixelNum] + "," + imgData.data[pixelNum+1] + "," + imgData.data[pixelNum+2] + ")";
// change div background to the appropriate color
$(ui.helper).css({backgroundColor: color});
}
});
}
当我单步执行代码时,颜色设置正确,只是 backgroundColor 不会实时更新(尽管当我单步执行代码时响应更快)。我尝试过使用动画以及将显示更改为无然后内联(我在此处发布的其他问题的建议),但没有任何东西可以使其实时响应。
任何帮助,将不胜感激。
编辑以添加最初设置 div 的代码。我将所有 div 存储在一个数组中,以便在代码的其他部分中更轻松地访问。
// draw the circles
for (i=0; i<paletteSize; i++)
{
// get the color from the palette
var paletteColorIdx = paletteCircles[i].palette;
// show the div
circleDiv[i].style.display = 'inline';
// calculate the absolute x,y coords
circleDiv[i].style.left = (uiFrame.offsetLeft + paletteCircles[i].x - circleDiv[i].offsetWidth/2) + "px";
circleDiv[i].style.top = (uiFrame.offsetTop + paletteCircles[i].y - circleDiv[i].offsetHeight/2) + "px";
// set the color
circleDiv[i].style.backgroundColor = "rgb(" + palette[paletteColorIdx][0] + "," + palette[paletteColorIdx][1] + "," + palette[paletteColorIdx][2] + ")";
}
jsfiddle 链接:http: //jsfiddle.net/FzxNk/6/
查看行为:
加载图像。
将其中一个圆圈移动到不同颜色的区域(它应该在您移动时更新颜色,但它不会。)
将另一个圆圈从图像上移开,然后再移回图像上。
当您将圆圈移动到图像上时,前一个圆圈将“弹出”为正确的颜色,而您刚刚移动的圆圈将为黑色。