防止意外选择/拖动突出显示

Posted

技术标签:

【中文标题】防止意外选择/拖动突出显示【英文标题】:Prevent accidental select/drag highlight 【发布时间】:2011-10-26 21:45:07 【问题描述】:

我有一个使用 html5 画布的绘图应用程序。当用户正在绘图并且笔滑出画布区域时,chrome 会以浅蓝色或黄色突出显示页面上的 html 元素。

这会破坏绘图体验。有没有办法防止这种高亮发生?

事件处理和绘制代码基于这篇文章:http://jsfiddle.net/rnNFB/1/

var x ;
var y ;

var lower = $('#lower').get(0).getContext('2d') ;
var upper = $('#upper').get(0).getContext('2d') ;

var dragging = false ;

function drawStroke(ctx)
    var i ;
    ctx.strokeStyle='rgba(0,0,0,0.5)' ;
    ctx.lineWidth=10 ;
    ctx.beginPath() ;
    ctx.moveTo(x[0],y[0]) ;
    for (i=1; i < x.length; i++)
        ctx.lineTo(x[i],y[i]) ;
    
    ctx.stroke() ;


$('#upper').mousedown(function(e)
    x=[e.layerX];
    y=[e.layerY];
    dragging=true) ;

$('#upper').mousemove(function(e)
    if (dragging)
        x.push(e.layerX);
        y.push(e.layerY);
        upper.clearRect(0,0,upper.canvas.width,upper.canvas.height) ;
        drawStroke(upper) ;
    ) ;

$('#upper').mouseup(function(e)
    dragging = false ;
    upper.clearRect(0,0,upper.canvas.width,upper.canvas.height) ;
    drawStroke(lower) ;
) ;

如果您在画布标签上方添加一些 h1 标签,然后在画布上绘制,将其拖到边界框之外,您将看到蓝色突出显示。有没有办法防止这种行为?

【问题讨论】:

这个问题不仅限于canvas。 是的,它适用于任何拖放、行选择等,几乎所有与文本内容无关的东西......我发现下面的答案在许多情况下都有帮助. 【参考方案1】:

将以下 CSS 类应用于应该不可选择的元素。它也可以仅应用于正文(不过,最佳做法可能是仅在真正需要它的元素上禁用用户选择)。

.unselectable 
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;

JS(仅 IE

// the onselectstart way for navigator.appName === "Microsoft Internet Explorer"
document.onselectstart = function()  return false; ;

题外话,但它也可能对应用程序很有趣:如果您在 jsFiddle 中选择一个大的 lineWidth 并非常缓慢地移动鼠标,您会在草图。始终检查从 onmousemove(拖动时)坐标到最后一个坐标的距离是否不太小。例如,仅当距离超过 linewith 的 1/6 左右时才将坐标添加到草图中。

【讨论】:

这行得通,谢谢!我可能会一直将整个页面“不可选择”应用到任何地方,因为有时 mouseDown 事件也会意外发生在画布之外。另外,特别感谢有关块状线条的提示!我想知道为什么会这样。谢谢! user-select 现在被所有主流浏览器支持(参见caniuse.com/user-select-none)。这简化了实现。只需使用.css('user-select', 'none')。如果您需要支持 IE 10 之前的版本,那么您很不走运,需要应用 hack。【参考方案2】:

我不会使用 document.onselectstart。你所要做的就是把它放在有问题的画布上:

canvas.onselectstart = function() return false; ;

此外,您可以通过将addEventListener 的最后一个参数设置为true 来捕获画布上发生的鼠标向下/移动/向上事件。即使鼠标离开画布,这也会让您的绘图继续完美。

【讨论】:

hmm,尝试在我类似的绘图应用程序中使用 canvas.onselectstart,但它仅在鼠标光标悬停在画布上时禁用选择。【参考方案3】:

试试这个脚本,如果拖动设置为 true,它将禁用选择。这样您在不绘图时仍然可以选择文本。

document.onselectstart = function( e )  
  if (dragging)  
    e.preventDefault();
    return false;
  
;

【讨论】:

以上是关于防止意外选择/拖动突出显示的主要内容,如果未能解决你的问题,请参考以下文章

防止 Access 表单中的整个字段被突出显示

从 tableView.allowsMultipleSelectionDuringEditing = YES 选择行时如何防止蓝色突出显示

防止在 react-date-picker 中突出显示 Today

谷歌地图突出显示路径中拖动的路径

突出显示被拖动的 TreeView 项目

如何使用angularJS突出显示可拖动元素下的拖放区?