【问题标题】:Why is the hoverintent function using so much CPU?为什么 hoverintent 函数使用这么多 CPU?
【发布时间】:2013-06-10 10:02:55
【问题描述】:

我已经实现了以下插件:

jQuery.event.special.hoverintent = {
    pxDelta: 7,
    pxRate:  100,
    bindType: "mouseover",
    delegateType: "mouseover",
    handle: function( event ) {
        var args = Array.prototype.slice.call( arguments, 0 ),
            target = jQuery( event.target ),
            cfg = jQuery.event.special.hoverintent,
            cX, cY, pX, pY, timer;

        function clear() {
            target
                .off("mousemove", getpx )
                .off("mouseout", clear );
            clearTimeout( timer );
        }
        function getpx( e ) {
            cX = e.pageX;
            cY = e.pageY;
        }
        target
           .on( "mousemove", getpx )
           .on( "mouseout", clear );

        (function hovercheck() {
            if ( ( Math.abs( pX - cX ) + Math.abs( pY - cY ) ) < cfg.pxDelta) {
                clear();
                // Normally we'd need to reset this but it is async
                event.type = "hoverintent";
                return event.handleObj.handler.apply( event.target, args );
            }
            pX = cX;
            pY = cY;
            timer = setTimeout( hovercheck, cfg.pxRate );
        })();
    }
};

我这样称呼它:

$("#mainnav").find("ul.tabs > li > a").on("hoverintent", function(){ //... }

这是(Google Chrome 开发工具)配置文件的打印屏幕,您可能会注意到函数 hovercheck 使用的数量:

  • 为什么 hovercheck 功能占用这么多 CPU?
  • 如何改进此功能?

更新:Internet Explorer 8(仅限 Windows XP)崩溃

在不同浏览器中进行测试后,我还注意到 Internet Explorer 8 (Windows XP) 在触发hoverintent 事件后立即崩溃。 这是(Internet Explorer)配置文件的另一个打印屏幕。 (有趣的部分可能是querySelectAll() DOM 函数)

  • 您知道 Internet Explorer 8 崩溃的原因吗?
  • 解决方案?

【问题讨论】:

  • 第二个打印屏幕的英文表头为:Function, Amount, Included time (ms), Excluded time (ms), function type

标签: javascript jquery performance profiling hoverintent


【解决方案1】:

问题不在于悬停检查功能。大部分时间都花在事件处理程序中。

$("#mainnav").find("ul.tabs > li > a").on("hoverintent", function() { 
    /* all the time is spent here, what is this code? */ 
    /* try putting something simple here to see if the performance issue goes away */
    console.log("in event handler!");
});

【讨论】:

  • 你是对的!我有大量的代码被执行了很多次。我优化/缩短了事件处理程序中的代码,现在它运行得更快了。。
  • 有趣的是:从 jQuery 1.9.1 更新到 1.10.1 奇怪地首先解决了这个问题,优化代码让它变得更快..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2022-01-19
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多