chrome在拖动时将光标设置为文本,为什么?

我的应用程序有很多拖放function。 在拖动的时候,我希望光标变成一些抓取光标。 Internet Explorer和Firefox可以正常工作,但Chrome始终将光标更改为文本光标。

这些解决scheme都不适合我,因为它的代码太多了。

我使用自定义的jQuery实现来进行拖动,并且在mousedown处理程序中添加此行在Chrome中为我做了一些技巧。

 e.originalEvent.preventDefault(); 

尝试closures文本select事件。

 document.onselectstart = function(){ return false; } 

这将禁用页面上的任何文本select,似乎浏览器开始显示自定义游标。

但请记住,文本select根本不起作用,因此最好只在拖动时才进行,然后再打开。 只需附加不返回false的函数:

 document.onselectstart = function(){ return true; } 

如果您想阻止浏览器在元素中select文本并显示select光标,则可以执行以下操作:

 element.addEventListener("mousedown", function(e) { e.preventDefault(); }, false); 

陷阱

你不能把这个

 document.onselectstart = function(){ return false; }; 

进入你的“mousedown”处理程序,因为onselectstart已经被触发。

因此,为了让它工作,你需要在mousedown事件之前进行。 我在mouseover事件中做了它,因为只要鼠标进入我的元素,我希望它是可拖动的,不可选。 那么你可以把这个

 document.onselectstart = null; 

调用mouseout事件。 但是,有一个问题。 拖动时,可能会调用mouseover / mouseout事件。 为了解决这个问题,在拖动/ mousedown事件中,将flag_dragging设置为true,并在拖动停止时将其设置为false(mouseup)。 mouseoutfunction可以在设置之前检查该标志

 document.onselectstart = null; 

我知道你没有使用任何库,但这里有一个jQuery代码示例,可以帮助其他人。

 var flag_dragging = false;//counter Chrome dragging/text selection issue $(".dragme").mouseover(function(){ document.onselectstart = function(){ return false; }; }).mouseout(function(){ if(!flag_dragging){ document.onselectstart = null; } }); //make them draggable $(".dragme").draggable({ start: function(event, ui){ flag_dragging = true; }, stop: function(event, ui){ flag_dragging = false; } }); 

我解决了相同的问题,使元素不可选,并添加一个活跃的伪类在被绘制的元素:

 * { -webkit-user-select: none; } .your-class:active { cursor: crosshair; } 

我有一个类似的问题,使用jQuery UI可拖动和sorting(版本1.8.1),这是非常具体的,所以我假设你使用相同的库。

问题是由jQuery UI中的错误引起的(实际上是对其他Safari错误的修复)。 我刚才提出的问题在jQuery UI http://dev.jqueryui.com/ticket/5678,所以我想你将需要等待,直到它被修复。;

我已经find了一个解决方法,但它是相当困难的,所以只有在你真的知道发生了什么的时候才使用它;)

 if ($.browser.safari) { $.ui.mouse.prototype.__mouseDown = $.ui.mouse.prototype._mouseDown; $.ui.mouse.prototype._mouseDown = function(event){ event.preventDefault(); return $.ui.mouse.prototype.__mouseDown.apply(this, arguments); } } 

它只是closures了jQuery UI代码中的修复,所以基本上它可能会破坏一些东西。

只需在你的mousedown事件中使用这一行

 arguments[0].preventDefault(); 

您也可以通过将CSS添加到您的可拖动元素中禁用文本select

 .nonselectable { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } 

我面临着几乎相同的问题。 我希望光标在我的DIV元素和其所有的孩子是默认的,CSS技巧在这里帮助在IE,FF和Opera,但不是谷歌浏览器。 这是我在父DIV所做的:

<div ... onselectstart="return false;" ... > ... </div>

现在它工作正常。 希望这个帮助。