3

我有 4 个DIV希望scroll在您滚动其中一个 div 时触发一个事件。这是下面的代码。

$('#div1, #div2, #div3, #div4').scroll(function() {
    alert('...');
});

在 Firefox/Chrome 中,它运行得很快;但是,在 Internet Explorer 中,它运行得非常慢,以至于它实际上阻止了我滚动 div。

我正在使用最新版本的 JQuery (v.1.4.1)。

问题:有没有更有效的方式来运行上面的代码?如果是这样,怎么做?

更新:既然有人问了,我已经在我的整个代码下面包含了:

$('#div1, #div2, #div3, #div4').scroll(function() {
   /* find the closest (hlisting) home listing to the middle of the scrollwindow */ 
    var scrollElemPos = activeHomeDiv.offset();
    var newHighlightDiv = $(document.elementFromPoint(
        scrollElemPos.left + activeHomeDiv.width()  / 2,
        scrollElemPos.top  + activeHomeDiv.height() / 2)
    ).closest('.hlisting');
    if(newHighlightDiv.is(".HighlightRow")) return;
    $('.HighlightRow').removeClass("HighlightRow");
    newHighlightDiv.addClass('HighlightRow');

   /* change the map marker icon to denote the currently focused on home */
   var activeHomeID = newHighlightDiv.attr("id");
   if (activeHomeMarkerID) {
      // unset the old active house marker to a normal icon
      map.markers[activeHomeMarkerID].setIcon('http://example.com/images/house-icon.png');
   }
   activeHomeMarkerID = activeHomeID.substring(4); // set the new active marker id
   map.markers[activeHomeMarkerID].setIcon('http://example.com/images/house-icon-active.png');     
});

更新 2:

所以我在下面实现了计时器选项,在 IE 中,它仍然很慢。还有其他想法吗?

4

1 回答 1

6

在 IE 中,滚动事件的调度方式比在 Firefox 中更频繁。您在事件处理程序中执行了许多 DOM 操作,这使其运行速度变慢。

考虑在用户停止或暂时暂停滚动时执行所有这些操作。这是一篇关于如何实现这种技术的文章 - http://ajaxian.com/archives/delaying-javascript-execution

编辑:这是一个实现

var timer = 0,
    delay = 50; //you can tweak this value
var handler = function() {
    timer = 0;
    //all the stuff in your current scroll function
}

$('#div1, #div2, #div3, #div4').scroll(function() {
    if (timer) {
        clearTimeout(timer);
        timer = 0;
    }
    timer = setTimeout(handler, delay);
});

编辑 2:您可以附加一个分析器(如 IE8 分析器)并查看运行缓慢的内容吗?你的 DOM 有多复杂?

以下是提高代码性能的一些想法:

  1. 你真的需要activeHomeDiv.offset()每次都测量吗?您可以测量一次并将其存储在某个地方(如果位置没有改变)吗?测量大小会导致浏览器重绘。
  2. 更改newHighlightDiv.is(".HighlightRow")newHighlightDiv.hasClass("HighlightRow")
  3. $('.HighlightRow').removeClass("HighlightRow")- 添加元素前缀并从 id 选择器/元素引用下降,例如$('div.HighlightRow', '#ancestorDiv').
于 2010-01-28T22:19:13.500 回答