js如何获得页面的大小?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js如何获得页面的大小?相关的知识,希望对你有一定的参考价值。

参考技术A <script type="text/javascript"> <!--
var winWidth = 0;
var winHeight = 0;
function findDimensions() //函数:获取尺寸

//获取窗口宽度
if (window.innerWidth)
winWidth = window.innerWidth;
else if ((document.body) && (document.body.clientWidth))
winWidth = document.body.clientWidth;
//获取窗口高度
if (window.innerHeight)
winHeight = window.innerHeight;
else if ((document.body) && (document.body.clientHeight))
winHeight = document.body.clientHeight;

//通过深入Document内部对body进行检测,获取窗口大小
if (document.documentElement && document.documentElement.clientHeight &&
document.documentElement.clientWidth)

winHeight = document.documentElement.clientHeight;
winWidth = document.documentElement.clientWidth;

//结果输出至两个文本框
document.form1.availHeight.value= winHeight;
document.form1.availWidth.value= winWidth;

findDimensions(); //调用函数,获取数值
window.onresize=findDimensions;
//-->
</script>
参考技术B ???
问题写详细点萨

如何获得完整页面加载的传输大小?

【中文标题】如何获得完整页面加载的传输大小?【英文标题】:How to get transferred size of a complete page load? 【发布时间】:2015-02-13 22:16:55 【问题描述】:

使用 Selenium 或 JavaScript,您如何获得已加载页面的(通过网络)传输大小(字节),包括所有内容、图像、css、js等?

首选大小是通过网络传输的大小,即压缩的大小,仅用于发出的请求等。

这是您通常可以在开发工具中看到的,在网络状态栏的右侧:

 

如果这不可能,是否可以只获得所有加载资源的总大小(没有压缩等)?那将是一个可以接受的替代方案。

浏览器是 Firefox,但如果可以使用其他兼容 Selenium 的浏览器也可以。

 

我想这可以使用 代理 来完成,但是有没有 JS 或 Selenium 方法来获取这些信息?

如果代理是唯一的方法,那么将使用(或实施)哪一种方法来简化此类任务?只是在设置驱动程序之前用 Java 实现一些东西?

(该解决方案至少可以在 Linux 上运行,但最好也可以在 Windows 上运行。我正在通过 Java 使用 Selenium WebDriver。)

【问题讨论】:

为什么投反对票?谢谢你的帽子。 ;-) Selenium 和 JS 都无法访问电线(网络)。他们只能看到渲染引擎 (DOM)。您将需要其他东西来获取该信息。 【参考方案1】:

是的,您可以使用 BrowserMobProxy 来完成。这是一个使用 selenium 代理跟踪来自客户端的网络流量的 java jar。 比如页面加载持续时间,查询字符串到不同的服务等。 你可以得到它 bmp.lightbody.net 。此 api 将创建 .har 文件,其中将包含所有这些 json 格式的信息,您可以使用这些信息来阅读 一个在线工具http://www.softwareishard.com/har/viewer/

【讨论】:

【参考方案2】:

为了将来参考,可以通过 javascript 从浏览器请求此信息。但是,在撰写本文时,尚无浏览器支持此特定数据的此功能。 More information can be found here.

同时,对于 Chrome,您可以从性能日志中解析此信息。

    //Enable performance logging
    LoggingPreferences logPrefs = new LoggingPreferences();
    logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
    capa.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

    //Start driver
    WebDriver driver = new ChromeDriver(capa);

然后你可以像这样获取这些数据

for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) 
        if(entry.getMessage().contains("Network.dataReceived")) 
            Matcher dataLengthMatcher = Pattern.compile("encodedDataLength\":(.*?),").matcher(entry.getMessage());
            dataLengthMatcher.find();
            //Do whatever you want with the data here.
        

如果像您的情况一样,您想知道单个页面加载的细节,您可以使用加载前和加载后时间戳,并且只获取该时间范围内的条目。

【讨论】:

【参考方案3】:

我已经在 Python 中实现了这一点,这可能会为人们节省一些时间。设置日志记录:

logging_prefs = 'performance' : 'INFO'    
caps = DesiredCapabilities.CHROME.copy()
caps['loggingPrefs'] = logging_prefs
driver = webdriver.Chrome(desired_capabilities=caps)

计算总数:

total_bytes = []
for entry in driver.get_log('performance'):
        if "Network.dataReceived" in str(entry):
            r = re.search(r'encodedDataLength\":(.*?),', str(entry))
            total_bytes.append(int(r.group(1)))
            mb = round((float(sum(total_bytes) / 1000) / 1000), 2)

【讨论】:

【参考方案4】:

Hakello 的回答中提到的性能 API 现在得到了很好的支持(除了 IE 和 Safari 之外的所有东西),并且易于使用:

return performance
  .getEntriesByType("resource")
  .map((x) => x.transferSize)
  .reduce((a, b) => (a + b), 0);

您可以使用executeScript 运行该脚本以获取自上次导航事件以来下载的字节数。无需设置或配置。

【讨论】:

以上是关于js如何获得页面的大小?的主要内容,如果未能解决你的问题,请参考以下文章

网站中有三个js文件大小超过100KB,超级影响加载速度,想问怎样优化?

JS 如何比较时间大小?

JS如何设置并限制浏览器窗口的大小

js如何读取客户端文件大小(不只是图片)

安卓开发中如何获得Activity的界面的大小

CSS DIV绝对定位 后 页面的大小改变 div层位置如何保持不变