Internet Explorer在执行鼠标单击+拖动操作时冻结.如何检测其原因
Internet Explorer freezes when a click + drag mouse action is performed. How to detect the cause of this?
我正在开发一个用于创建简单图表的JavaScript应用程序,并且我在Internet Explorer(版本8)中遇到一些性能问题。
该应用程序可用于在图表上绘制线条(见图)。有两个主要的处理程序用于绘制线条。ONMOUSEUP事件收集用户的点击,这表明用户想要在行上放置一个点并开始一个新的段(行由多个段组成)。
ONMOUSEMOVE处理程序在用户绘制线时绘制淡出段作为视觉帮助。
画线过程截图如下图所示:https://i.stack.imgur.com/AxcFr.jpghttp://i51.tinypic.com/fxjqf.jpg
如果用户点击鼠标(mousedown),但是没有释放它,而是开始拖动鼠标,IE完全冻结。一段时间后,它将解冻并正常运行。
另一方面,Chrome可以很好地处理这个问题(当拖动操作发生时,MOUSEMOVE处理程序工作,并且只有在ONMOUSEUP事件触发后才放置该点)。
我的理论是,资源管理器可能是单线程的,在这种情况下,他拿起MOUSEMOVE事件,但只有在ONMOUSEUP事件完成后才执行它们(这意味着在拖动操作的持续时间内基本上什么都不做),但我不知道如何检查这是否为真,或者如何修复它。
我已经用IE8内置的JS分析器做了一些分析,两个处理程序都被调用了通常的次数,没有函数被调用数千次会导致冻结。当IE被冻结时,分析器被冻结,并且在它解冻之前不输出任何内容,之后的结果看起来就像没有冻结动作一样。
编辑:这是根据dynaTrace分析器工具的时间轴:http://i51.tinypic.com/348sxty.jpg.
问题是更新DOM是一个非常昂贵的操作。现在,如果不进行限制,mousemove事件就会不断触发,如果你在每个触发的mousemove事件上更新DOM,那么旧的浏览器就跟不上了。
解决方案可以将鼠标移动事件限制至少200毫秒。这意味着您只会在鼠标停止移动200毫秒后更新DOM,给浏览器一些时间来恢复。
这是你如何限制鼠标移动事件:
jQuery( "#element").bind( "mousemove", function(){
//Code to react to mousemove goes here
//Also add code here to check if the position has actually changed from last time,
//So you don't update the DOM for nothing
}.throttle( 200 ) );
节流阀方法所需代码:
Function.prototype.throttle = function( delay ) {
var timeridto = 0, callback = this;
function r(){
var args = Array.prototype.slice.call( arguments ),
self = this;
clearTimeout( timeridto );
timeridto = setTimeout( function(){callback.apply( self, args ); }, delay );
};
r.cancel = function(){
clearTimeout( timeridto );
}
return r;
};
如果这不能解决问题,那么你可以使用html5 canvas
或(excanvas for IE)进行绘图操作。
- 如何检测是否有溢出
- 如何检测用于WebGL的专用或集成显卡
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- 如何使用密码检测网络中的状态连接
- 使用JavaScript检测Flash
- 在不阻止默认行为的情况下检测IE10中的缩放
- 检测个位数整数时正在转换毫秒
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 动态插入的表:JQuery未检测到最后一行
- 检测页面上某个元素中选择(突出显示)或单击的内容
- jQuery检测浏览器是否支持Zoom
- 检测iframe是否跨域的愚蠢方法
- 检测图像分辨率
- 如何检测第三方广告服务器请求
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- 当没有文本输入聚焦时检测空格键按下
- 正在检测导航到<a name=“;最新主题”></a>
- 如何检测重叠元素下的单击
- 如何检测负责网站某些部分的JavaScript根文件