Désactiver l'événement de glisser le pouce de la barre de défilement, garder tous les autres événements de défilement activés-javascript, html


Je veux désactiver le glissement de la barre de défilement tout en gardant tous les autres moyens de capturer les événements de défilement activés.

Un moyen de capturer un événement mousedown sur la barre de défilement suffirait également (la plupart des textes sur ce sujet ne sont pas possibles). Je ne veux pas utiliser de bibliothèques externes pour résoudre le problème. Tout autre moyen de parvenir à une solution au problème décrit ci-dessous est le bienvenu.

La solution ne doit fonctionner que dans les versions actuelles de Google Chrome.

    document.getElementById('mainTable').parentNode.addEventListener("scroll",function(e){
        ...

        //Other code logic and syntax omitted

        ...
        //Logic for deriving if scrolling up or down is accomplished by comparing
        //the previously recorded .scrollTop value to the current value of the div 
        //containing the table 'mainTable' of datapoints
        if(scrollDownEvent){
           document.getElementById("mainTable").parentNode.scrollTo(0,.75*totHeight);
        }else if(scrollUpEvent){
           document.getElementById("mainTable").parentNode.scrollTo(0,.25*totHeight);
        }else{

        }
    }

Contexte Quelques informations générales très rapides. J'ai plusieurs millions de points de données avec un grand nombre de données pour chaque point.

Je charge 200 points de données dans le html, dans une configuration table/tr/td. Je cache 400 points de données dans un tableau javascript d'objets (environ 100 au-dessus et au-dessous à un moment donné).

Lorsque l'utilisateur fait défiler vers le bas, si le bord des points de données affichés se rapproche du bord des points de données mis en cache, plus les points sont chargés dans le cache à partir du disque dur (via l'api du système de fichiers html5). En fonction de la distance vers le bas de l'état des attributs d'événement de défilement, définit le nombre de points de données supprimés de l'extrémité opposée de la table et les nouveaux points de données sont chargés dans le bord cible de la table. après avoir géré l'événement de défilement, je fais ensuite défiler jusqu'à 25% de la hauteur de la table ou 75% de la table.

Le problème que je rencontre est que l'événement de défilement semble être déclenché différemment avec les traînées de la barre de défilement qu'avec d'autres moyens d'événements de défilement. Je capture un événement de glisser de la barre de défilement en tant qu'événement de défilement, mais si je fais glisser la barre de défilement vers le bas (mon code fonctionne si je ne le fais pas glisser vers le bas), il apparaîtra parfois écraser mon code javascript pour faire défiler vers le haut - ce qui entraînera une incapacité à faire défiler

Je n'ai aucun problème avec les événements de défilement capturés à partir de:

  • souris mouvement de roue
  • clics de souris sur les flèches haut/bas
  • clics de souris sur la zone supérieure/inférieure par rapport à la barre de défilement
  • bas de souris sur les régions supérieure/inférieure par rapport à la barre de défilement.
  • bas de souris sur les touches fléchées haut/bas
  • appuyez sur les flèches haut/bas du clavier
Author: Arthur Weborg, 2013-10-02

1 answers

Je n'ai pas fini par faire ma propre barre de défilement, je n'ai pas utilisé de bibliothèques de barre de défilement externes non plus. J'ai résolu le problème en calculant les positions du pouce de la barre de défilement et en suivant la position de la souris, en gérant les limites supérieure/inférieure du scroller qui provoquaient le verrouillage du scroller.

Souris-au-dessus de défilement de la barre de défilement du code

J'ai ajouté des événements mousemove à plusieurs éléments. J'ai calculé l'emplacement physique et la largeur de la barre de défilement. Quand la souris s'est déplacée les endroits où j'ai géré les événements mouseover de manière appropriée. J'ai également pu calculer la hauteur du thumbar lui-même en regardant la hauteur parent de mainTable et en la comparant à la hauteur de mainTable. J'ai pu calculer l'emplacement du thumbar en regardant le scrollTop.

document.getElementById("mainTable").parentNode.addEventListener("mousemove", function(e){
    var mainTab = document.getElementById("mainTable");
    if(mainTab.offsetWidth <= e.offsetX){
        var scrollbarHeight = mainTab.parentNode.offsetHeight - 36; //36 =height of up and down arrows
        var scrollbarThumbHeight = (scrollbarHeight/mainTab.offsetHeight)*scrollbarHeight;
        var childScrollTop = mainTab.parentNode.scrollTop
        var relativeThumbPosition = (childScrollTop/mainTab.offsetHeight) + 18; // 18=height of up arrow
        if(e.offsetY >= relativeThumbPosition && e.offsetY <= relativeThumbPosition+scrollbarThumbHeight){
            console.log("mouse-move thumbar:\t" + e.which);
            //execute specific mouse over code here
        }else{
            //execute any non-mouse over specific code here
        }
    }
})

La méthode suivante a finalement résolu mon problème

Barre de défilement pouce coincé en bas ou en haut - manipulation
C'est dans un écouteur d'événement mousemove sur le document corps

Il y a probablement une meilleure façon de le faire, en ajoutant et en supprimant l'écouteur d'événement (ne le faisant que lorsque c'est nécessaire) Cependant, j'ai ajouté l'écouteur et vérifié toujours - encore une fois à l'avenir, je vais probablement modifier cela afin qu'il soit plus efficace. Je vérifie si la position de défilement est verrouillée en haut ou en bas de la piste de la barre de défilement. Si c'est le cas, je gère la barre de défilement infinie de manière appropriée.

var mainTab = document.getElementById("mainTable");
if(mainTab.parentNode.scrollTop == 0){
    if(cnTable.buffStart != 0){
        upEvent(27);
    }else if (cnTable.tableStart != 0){
        upEvent(27);
    }
}else if(mainTab.parentNode.scrollTop + mainTab.parentNode.offsetHeight >= totHeight ){
    if(cnTable.buffStop < cnDAO.currentIndexes.length -1){
        downEvent(27);
    }else if (cnTable.tableStop < cnTable.buffer.length-1){
        downEvent(27);
    }
}

Enfin, code pour définir la position de défilement trouvé dans les upEvent et downEvent
Le code suivant est presque identique au code en question ci-dessus

Comme mentionné ci-dessus, j'ai géré la position, le code suivant est ce que j'ai utilisé pour changer la position, il y a beaucoup plus de code qui est entré dans le calcul de la position, mais j'ai décidé de ne montrer que le cas générique (toutes mes lignes n'ont pas la même hauteur, j'ai donc dû les événements)

var totHeight = document.getElementById("mainTable").offsetHeight -1;
document.getElementById("mainTable").parentNode.scrollTo(0,.24*totHeight);

ET

var totHeight = document.getElementById("mainTable").offsetHeight -1;
document.getElementById("mainTable").parentNode.scrollTo(0,.76*totHeight);
 0
Author: Arthur Weborg, 2013-12-20 16:23:50