国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中計算網頁中某個元素的位置

2019-11-20 12:19:14
字體:
來源:轉載
供稿:網友

由于項目的需要,測試中需要對網頁元素進行截圖,以確保它看上去沒有問題。之前我寫過一篇文章介紹過一種方法,先使用 WebDriver 進行全屏截圖,然后根據目標元素(DOM Element)所在的位置,再對截下來的圖片進行剪裁,保留我們需要的位置即可。

那段代碼一直都工作得很好,直到我知道了一個東西:iframe。iframe(普通的 frame 也是一樣的,不過 frame 現在不太常見,這里只用 iframe 舉例)中的內容被視為一個獨立的網頁,連 Window 對象也是和它的父級網頁分開的。而 WebDriver 中的 WebElement.getLocation()方法只能返回這個 WebElement 和它所在的 Window 的位置關系,它的實現沒什么問題,但全屏截圖不僅包含了 iframe 的內容,可能也包含了它的父級頁面的內容,剪裁的時候需要知道目標元素在截圖中的位置。那么問題來了,挖掘機技術哪家強?如何計算一個元素相對于截圖的位置?

這個問題還要分類討論,原因是:Chrome 和 Firefox 中截圖的行為是不一樣的。Chrome 的截圖是當前可見(viewport)的網頁內容,比方說,當網頁的實際大小超過 Chrome 窗口大小時,根據滾動條的位置不同,窗口中顯示的內容不同,Chrome 的截圖就是顯示出來的內容。于是我們要計算目標元素相對于當前可見內容的位置。而 Firefox 用了一個方法,可以截到整個網頁的內容,無視當前窗口大小。于是對于 Firefox 我們要計算元素的絕對位置(Absolute Position)。

獲得一個元素的位置,需要用到一個方法:Element.getBoundingClientRect()。這個方法返回這個元素相對于它所處的 Windows 在當前可見內容的位置,用 top、left、right、bottom 四個值來表示。我們只關心其中的 top 和 left,至于剪裁的尺寸,我們可以通過元素本身的長和寬來得到,不需要計算。要計算目標元素對于頂級 Window的位置,我們只需要依次加上它的父級 Window的 top 和 left 即可。代碼如下:

function calcViewportLocation(element) { var currentWindow = window; var rect = element.getBoundingClientRect(); // 元素的位置 var top = rect.top; var left = rect.left; while (currentWindow.frameElement != null) { // 處理父級 Window  element = currentWindow.frameElement;  currentWindow = currentWindow.parent;  rect = element.getBoundingClientRect();  if (rect.top > 0) { top += rect.top; }  if (rect.left > 0) { left += rect.left; } } return [Math.round(top), Math.round(left)];}

以上代碼適用于 Chrome ,而在 Firefox 中,我們還需要計算元素的絕對位置。這里需要用到 Window.pageXOffset。pageXOffset,或者 scrollX,表示當前 Window 的橫向滾動條滾動的位置,把這個值和上述的 left 相加,即可得到目標元素的橫向絕對位置。當然,iframe 也可以特殊處理的:

function calcAbsolutLocation(element) { var top = 0; var left = 0; var currentWindow = window; while (element != null) {  rect = element.getBoundingClientRect();  var pageYOffset = currentWindow.pageYOffset;  var pageXOffset = currentWindow.pageXOffset;  if (typeof pageYOffset === 'undefined') { // IE8   currentDocument = currentWindow.document;   var bodyElement = (currentDocument.documentElement     || currentDocument.body.parentNode || currentDocument.body);   pageYOffset = bodyElement.scrollTop;   pageXOffset = bodyElement.scrollLeft;  }  top += rect.top + pageYOffset;  left += rect.left + pageXOffset;  element = currentWindow.frameElement;  currentWindow = currentWindow.parent;  if (element != null) {   style = window.getComputedStyle(element);   top += parseInt(style.borderTopWidth, 10);   left += parseInt(style.borderLeftWidth, 10);  } } return [Math.round(top), Math.round(left)];}


由于 IE8 不支持 pageXOffset 和 scrollX,于是在 IE8 中需要一些特殊處理,即代碼中標注“IE8”的部分。把這兩段 Javascript 代碼,替換之前文中的 WebElement.getLocation(),即可實現在 iframe 中對特定元素截圖。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽水市| 湘阴县| 大连市| 肥东县| 连江县| 千阳县| 普宁市| 吴忠市| 阿拉善盟| 五寨县| 南乐县| 宜都市| 湖北省| 昌乐县| 肇东市| 出国| 渭源县| 双辽市| 平泉县| 西充县| 东宁县| 新龙县| 侯马市| 江陵县| 南丹县| 布尔津县| 新丰县| 呈贡县| 大邑县| 黄浦区| 古丈县| 龙口市| 洛阳市| 莱州市| 镇安县| 海口市| 班玛县| 开鲁县| 辽中县| 德兴市| 商城县|