]> source.dussan.org Git - nextcloud-server.git/commitdiff
Contact list scroll fix
authorVicDeo <victor.dubiniuk@gmail.com>
Mon, 20 Feb 2012 20:54:23 +0000 (23:54 +0300)
committerVicDeo <victor.dubiniuk@gmail.com>
Mon, 20 Feb 2012 20:54:23 +0000 (23:54 +0300)
apps/contacts/js/jquery.inview.js

index a38ab16497719b9c678b004ae1893c51d9fd0950..01900b0b4b4be847ea1009415af870987e9c39cc 100644 (file)
@@ -5,18 +5,40 @@
  */
 (function ($) {
   var inviewObjects = {}, viewportSize, viewportOffset,
-      d = document, w = window, documentElement = d.documentElement, expando = $.expando;
+      d = document, w = window, documentElement = d.documentElement, expando = $.expando, isFiring = false, $elements = {};
 
   $.event.special.inview = {
     add: function(data) {
-      inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) };
+      var inviewObject = { data: data, $element: $(this) }
+      inviewObjects[data.guid + "-" + this[expando]] = inviewObject;
+      var selector  = inviewObject.data.selector,
+      $element  = inviewObject.$element;
+      var hash = parseInt(getHash( data.guid + this[expando]));
+      $elements[hash] =  selector ? $element.find(selector) : $element;
     },
 
     remove: function(data) {
       try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {}
+      try {
+        var hash = parseInt(getHash(data.guid + this[expando])); 
+       delete($elements[hash]);
+      } catch (e){}
     }
   };
 
+  
+  function getHash(str){
+    str = str+'';
+    var hash = 0;
+    if (str.length == 0) return hash;
+    for (i = 0; i < str.length; i++) {
+        char = str.charCodeAt(i);
+        hash = ((hash<<5)-hash)+char;
+        hash = hash & hash; // Convert to 32bit integer
+    }
+    return Math.abs(hash);
+  }
+  
   function getViewportSize() {
     var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
 
   }
 
   function checkInView() {
-    var $elements = $(), elementsLength, i = 0;
-
-    $.each(inviewObjects, function(i, inviewObject) {
-      var selector  = inviewObject.data.selector,
-          $element  = inviewObject.$element;
-      $elements = $elements.add(selector ? $element.find(selector) : $element);
-    });
-
-    elementsLength = $elements.length;
-    if (elementsLength) {
+    if (isFiring){
+      return;
+    }
+    isFiring = true;
       viewportSize   = viewportSize   || getViewportSize();
       viewportOffset = viewportOffset || getViewportOffset();
-
-      for (; i<elementsLength; i++) {
-        // Ignore elements that are not in the DOM tree
-        if (!$.contains(documentElement, $elements[i])) {
+      
+      for (var i in $elements) {
+        if (isNaN(parseInt(i))) {
           continue;
         }
 
             visiblePartX,
             visiblePartY,
             visiblePartsMerged;
-        
+
         // Don't ask me why because I haven't figured out yet:
         // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
         // Even though it sounds weird:
         // It seems that the execution of this function is interferred by the onresize/onscroll event
         // where viewportOffset and viewportSize are unset
         if (!viewportOffset || !viewportSize) {
+         isFiring = false;
           return;
         }
         
           $element.data('inview', false).trigger('inview', [false]);
         }
       }
-    }
+      isFiring = false;
   }
 
   $(w).bind("scroll resize", function() {