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>
现在它工作正常。 希望这个帮助。