亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:22:00
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了JavaScript中計算網頁中某個元素的位置,本文先是講解了一些必要的知識和實現難點,然后給出實現代碼,需要的朋友可以參考下

由于項目的需要,測試中需要對網頁元素進行截圖,以確保它看上去沒有問題。之前我寫過一篇文章介紹過一種方法,先使用 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 即可。代碼如下:

 

 
  1. function calcViewportLocation(element) { 
  2. var currentWindow = window; 
  3. var rect = element.getBoundingClientRect(); // 元素的位置 
  4. var top = rect.top; 
  5. var left = rect.left; 
  6. while (currentWindow.frameElement != null) { // 處理父級 Window 
  7. element = currentWindow.frameElement; 
  8. currentWindow = currentWindow.parent; 
  9. rect = element.getBoundingClientRect(); 
  10. if (rect.top > 0) { top += rect.top; } 
  11. if (rect.left > 0) { left += rect.left; } 
  12. return [Math.round(top), Math.round(left)]; 

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

 

 
  1. function calcAbsolutLocation(element) { 
  2. var top = 0; 
  3. var left = 0; 
  4. var currentWindow = window; 
  5. while (element != null) { 
  6. rect = element.getBoundingClientRect(); 
  7. var pageYOffset = currentWindow.pageYOffset; 
  8. var pageXOffset = currentWindow.pageXOffset; 
  9. if (typeof pageYOffset === 'undefined') { // IE8 
  10. currentDocument = currentWindow.document; 
  11. var bodyElement = (currentDocument.documentElement 
  12. || currentDocument.body.parentNode || currentDocument.body); 
  13. pageYOffset = bodyElement.scrollTop; 
  14. pageXOffset = bodyElement.scrollLeft; 
  15. top += rect.top + pageYOffset; 
  16. left += rect.left + pageXOffset; 
  17. element = currentWindow.frameElement; 
  18. currentWindow = currentWindow.parent; 
  19. if (element != null) { 
  20. style = window.getComputedStyle(element); 
  21. top += parseInt(style.borderTopWidth, 10); 
  22. left += parseInt(style.borderLeftWidth, 10); 
  23. return [Math.round(top), Math.round(left)]; 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久9999| 亚洲人成网站在线播| 亚洲精品国产综合区久久久久久久| 精品国产欧美成人夜夜嗨| 成人黄色午夜影院| 97国产精品免费视频| 欧美小视频在线观看| 亚洲精品99久久久久中文字幕| 日韩国产在线播放| 色噜噜亚洲精品中文字幕| 97高清免费视频| 中文字幕日韩欧美在线| 国产精品普通话| 国产一区二区三区直播精品电影| 伊人男人综合视频网| 国产精品美腿一区在线看| 欧美精品一区二区三区国产精品| 国产欧美日韩精品专区| 国产91精品久久久| 精品久久久久久电影| 国产日韩欧美影视| 2018日韩中文字幕| 亚洲曰本av电影| 亚洲视频在线免费看| 91夜夜揉人人捏人人添红杏| 成人综合网网址| 欧美肥老妇视频| 久久99久久99精品中文字幕| 欧美高清视频免费观看| 亚洲www视频| 中文字幕精品久久久久| 欧美日韩中国免费专区在线看| 日本成人黄色片| 亚洲自拍偷拍第一页| 国产精品男人爽免费视频1| 国产福利精品av综合导导航| 欧美最猛性xxxx| 国产精品久久久久久久久久小说| 亚洲视频在线观看| 国产精品爱啪在线线免费观看| 欧美精品少妇videofree| 91精品国产综合久久久久久久久| 亚洲精品乱码久久久久久按摩观| 北条麻妃一区二区在线观看| 成人亚洲激情网| 色综合亚洲精品激情狠狠| 日韩精品视频免费在线观看| 国产精品一区二区久久| 国内精品久久久久久| 日韩欧美亚洲综合| 中文字幕九色91在线| 亚洲视频第一页| 91成人国产在线观看| 国产精品扒开腿做爽爽爽视频| 国产一区二区三区日韩欧美| 国产成人jvid在线播放| 91影院在线免费观看视频| 亚洲视频第一页| 亚洲网站在线看| 日韩精品黄色网| 久久的精品视频| 亚洲香蕉在线观看| 色一情一乱一区二区| 成人日韩av在线| 国模极品一区二区三区| 国产人妖伪娘一区91| 一本大道香蕉久在线播放29| 欧美成人全部免费| 欧美裸体xxxx极品少妇软件| 久久精品国产91精品亚洲| 热re91久久精品国99热蜜臀| 亚洲专区中文字幕| 黑人巨大精品欧美一区二区一视频| 懂色av中文一区二区三区天美| 大量国产精品视频| 色偷偷综合社区| 亚洲激情国产精品| 国产激情999| 精品成人69xx.xyz| 国产精品视频免费观看www| 尤物yw午夜国产精品视频| 国产精品久久久亚洲| 高清欧美一区二区三区| 国产精品1区2区在线观看| 亚洲第一精品久久忘忧草社区| 国模精品系列视频| 欧美黑人巨大xxx极品| 国产亚洲精品久久久久久777| 亚洲人成网站999久久久综合| 国产成人a亚洲精品| 亚洲国产高潮在线观看| 九九精品在线播放| 91精品视频大全| 一区二区国产精品视频| 日本免费一区二区三区视频观看| 欧美日韩中文字幕在线| 久久理论片午夜琪琪电影网| 色无极亚洲影院| 国产精品视频白浆免费视频| 国产精品入口尤物| 国产伦精品一区二区三区精品视频| 91在线观看免费观看| 欧洲s码亚洲m码精品一区| 国产ts人妖一区二区三区| 视频直播国产精品| 韩日精品中文字幕| 成人福利视频在线观看| 久久天天躁狠狠躁夜夜躁| 精品国产美女在线| 情事1991在线| 亚洲国产精品久久久久| 日韩中文在线中文网三级| 国产一区二区在线播放| 国产综合在线观看视频| 欧美一性一乱一交一视频| 91高清免费视频| 91亚洲精品在线| 欧美视频免费在线| 亚洲精品一区中文字幕乱码| 欧美成人免费va影院高清| 91久久国产婷婷一区二区| 7777免费精品视频| 精品日本高清在线播放| 免费91在线视频| 亚洲精品成人av| 精品国产区一区二区三区在线观看| 久久久久一本一区二区青青蜜月| 日韩在线欧美在线| 日韩视频永久免费观看| 国产视频精品xxxx| 精品久久香蕉国产线看观看gif| 亚洲精品免费一区二区三区| 91影视免费在线观看| 欧美精品videos另类日本| 国产日韩欧美视频| 欧美精品九九久久| 精品久久久久久久久久久久久| 一本色道久久88精品综合| 91热福利电影| 亚洲第一综合天堂另类专| 色系列之999| 91tv亚洲精品香蕉国产一区7ujn| 欧美成人国产va精品日本一级| 亚洲精品国产精品国自产在线| 国产精品网站入口| 久久大大胆人体| 国产成人avxxxxx在线看| 不卡av日日日| 国产精品第2页| 久久天天躁狠狠躁老女人| 精品美女久久久久久免费| 国产精品网红福利| 91高清在线免费观看| 精品成人在线视频| 欧美在线观看日本一区| 97在线视频精品| 亚洲一区二区久久久久久| 国产精品久久久久av免费| 色偷偷偷综合中文字幕;dd| 日日噜噜噜夜夜爽亚洲精品| 国产亚洲精品久久久久久777| 欧美中在线观看| 精品一区二区电影| 欧美黑人性生活视频|