【发布时间】:2013-06-20 09:36:48
【问题描述】:
所以我正在编写一种绘图脚本,现在它工作正常(虽然代码仍然需要清理,需要更多功能),但是当绘制太多时,mousemove 非常滞后。这是主要的Javascript:
$('#canvas').on('mousedown', function(){
going = !going;
$(this).on('mousemove', function(e){
if(cursor == 'paint' && going == true){
$('.fall').each(function(){
if ($(this).css("opacity") == 0){
$(this).remove();
};
});
var ps = $('#canvas').offset().top;
var t = (e.pageY - ps - $('.fall').height()).toString() + 'px';
var l = (e.pageX - $('.fall').width()).toString() + 'px';
$('.fall').css("margin_left",l);
$('.fall').css("margin_top",t);
var doit = '<div class="fall" style="position:absolute;margin-left:' + l + ';margin-top:' + t + ';background-color:'+ color +';box-shadow: 0px 0px 5px ' + color + ';"></div>'
$('#canvas').prepend(doit);
}
else if(cursor == 'erase'){
$('.fall').mouseenter(function(){
$(this).fadeOut('fast',function(){
$(this).remove()
});
});
};
});
本质上,当你点击绘图部分时,如果点击绘图按钮,你可以绘制:jsfiddle。
我的问题:
如果你画得太多,尤其是在开始和停止时,它不会在mousemove 上添加足够多的内容(我假设)DOM 被淹没了。
问题:
在不产生延迟的情况下向 DOM 添加许多 div 的有效方法是什么?这可能吗?
注意:
这是一个个人项目,我对使用以前创建的绘图 API 不感兴趣
【问题讨论】:
-
您正在为每个“mousedown”添加另一个“mousemove”处理程序。调用
.on()不会删除任何以前的处理程序! -
hmmmm 我想这是真的!我将如何删除处理程序?
-
没有必要删除旧的处理程序;只需将该代码添加到另一个“mousemove”处理程序即可。此外,更新“光标”的代码非常昂贵。您应该尝试从事件对象中获取鼠标坐标,而不是询问 DOM。
-
另外:“mousemove”经常触发。 DOM 操作非常昂贵。 “.fall”还有另一个“无限处理程序”问题。
-
@Pointy 根据 chrome 检查器堆大小在几秒钟后超过 10mb。你认为mousemove是罪魁祸首吗?如果可以,可以做什么?
标签: javascript jquery dom append