2012-11-15 58 views
0

基本上我需要找到頁面上的所有元素有一個滾動條(垂直或水平)如何使用XPath在DOM中查找可滾動元素?

如何判斷一個元素是否有滾動條,並且實際上可以滾動?我發現this code snippet on jsperf。是否有可能將代碼背後的邏輯捕獲到XPath表達式中?或者還有其他方法來檢查滾動條嗎?

補充:

只是爲了解釋什麼是我想要做的事:我開發VimFx - Firefox擴展。基本上它引入了Vim式無鼠標捷徑(我知道有Vimperator和Pentadactyl ......)。我想要實現的功能之一是允許用戶選擇使用j/k鍵滾動的容器。這就是爲什麼我需要發現任何給定隨機頁面上的所有可滾動元素。

+0

XPath不能夠獲得有關如何元素已經呈現信息,所以這是不可能的。 –

回答

0

你可以用javscript檢查它是一個div的溢出設置爲「滾動」

document.getElementById(elementId).style.overflow == "scroll"; 

我會檢查每個元素強硬。如果你所有的元素都申報單,然後使用此:

var allElements = document.getElementsByTagName("div"); 
for(index in allElements) { 
    var element = allElements[index]; 
    if (element.style.overflow == "scroll" || element.style.overflowX == "scroll" || element.style.overflowY == "scroll"){ 
    //do something 
    } 
} 
+0

我想我必須去JS路徑..問題是,在我的情況下,任何元素可能會滾動... –

+0

這隻適用於滾動元素的樣式_inline_使用'overflow:scroll'。使用'window.getComputedStyle()'會更好,但速度很慢。儘管如此,大多數可滾動元素都具有「overflow:auto」,這意味着只有在需要時纔有滾動條。然後它仍然以某種方式確定該元素是否真的可以滾動或不滾動。 – lydell

0

我現在已經在VimFx實施support for discovering scrollable elements

解決此問題的關鍵是使用Mozilla特定事件overflowunderflow

的概念是:

// The function used for the overflow event: 
function(event) { 
    // `window` is a reference to the current window. 
    var computedStyle = window.getComputedStyle(event.target) 
    // `overflow: hidden` can cause overflow, but without a scrollbar, so 
    // exclude such elements 
    if (computedStyle && computedStyle.getPropertyValue('overflow') == 'hidden') { 
    return 
    } 
    // `scrollableElements` is a reference to a `WeakMap` object for the 
    // current window. 
    scrollableElements.set(event.target) 
} 

// The function used for the underflow event: 
function(event) { 
    scrollableElements.delete(event.target) 
} 

// Somewhere else in the code we can now get a suitable `scrollableElements` 
// object and check if elements are present in it. 
if (scrollableElements.has(someElement)) { 
    // `someElement` is scrollable! 
} 
相關問題