2015-12-30 12 views
16

Was ist der zuverlässigste und effizienteste Weg, um alle Elemente mit einem Bildlauf auf einer Seite zu finden?Suchen aller Elemente mit einem Bildlauf


Derzeit denke ich über die Verwendung von element.all() mit filter() Vergleich der height und scrollHeight Attributwerte:

element.all(by.xpath("//*")).filter(function (elm) { 
    return protractor.promise.all([ 
     elm.getAttribute("height"), 
     elm.getAttribute("scrollHeight") 
    ]).then(function (heights) { 
     return heights[1] > heights[0]; 
    }); 
}); 

Aber ich bin über die Richtigkeit und die Leistung dieses Ansatzes nicht sicher.

+2

Vanille JS verwenden Sie so etwas wie dieses 'Array.prototype.slice.call (document.querySelectorAll tun können ('*')). filter (function (el) {return el.offsetHeight! == el.scrollHeight}) aber wenn du es auf dieser Seite ausführst, siehst du einige Elemente ohne Scrollbalken, also ist es nicht zuverlässig, denke ich. Ich wollte das nur kommentieren, ich habe (noch) keine konkrete Antwort. – A1rPun

+1

@AndrewTempleton keine Sorge, wird heute überprüfen und entscheiden über Kopfgelder. Und danke für die Antwort! – alecxe

Antwort

2

Dies funktioniert mit horizontalen und vertikalen Bildlaufleisten. Der Trick besteht darin, BEIDE zu weit/zu kurz zu erkennen, UND wenn das berechnete CSS Ihnen erlauben wird, eine Bildlaufleiste anzuzeigen.

var ElementsWithScrolls = (function() { 
    var getComputedStyle = document.body && document.body.currentStyle ? function(elem) { 
     return elem.currentStyle; 
    } : function(elem) { 
     return document.defaultView.getComputedStyle(elem, null); 
    }; 

    function getActualCss(elem, style) { 
     return getComputedStyle(elem)[style]; 
    } 

    function isXScrollable(elem) { 
     return elem.offsetWidth < elem.scrollWidth && 
      autoOrScroll(getActualCss(elem, 'overflow-x')); 
    } 

    function isYScrollable(elem) { 
     return elem.offsetHeight < elem.scrollHeight && 
      autoOrScroll(getActualCss(elem, 'overflow-y')); 
    } 

    function autoOrScroll(text) { 
     return text == 'scroll' || text == 'auto'; 
    } 

    function hasScroller(elem) { 
     return isYScrollable(elem) || isXScrollable(elem); 
    } 
    return function ElemenetsWithScrolls() { 
     return [].filter.call(document.querySelectorAll('*'), hasScroller); 
    }; 
})(); 

ElementsWithScrolls(); 
1

Es werden die Elemente mit übergelaufenen und nicht-überschwemmt wählen Rollen innerhalb des Körpers tag:

$('body *').filter(function() { 
    return ($(this).scrollTop() != 0 || $(this).css('overflow') == 'scroll'); 
}); 
Verwandte Themen