我正在根据页面加载中的每个资源来处理页面加载百分比栏:我的意思是监视每个图像、脚本、css 等,并使用它的“加载事件”来增加一般页面加载百分比
我读过一些很难监控某些元素的加载事件的帖子,所以我的问题是如何使用 javascript / jQuery 来做到这一点?我可以使用什么策略来达到这个结果?
我尝试过这样的事情,但实际上效果不佳
function calc(element){
console.log(element.outerHTML);
progress++;
var loadingStatus = ( progress * 100 / totalLength );
console.log(loadingStatus);
document.getElementById('loadingBar').style.width = loadingStatus+'%';
}
document.onreadystatechange = function(){
if(document.readyState == "interactive"){
progress = 0;
var styleElements = document.querySelectorAll('style');
var linkElements = document.querySelectorAll('link');
var scriptElements = document.querySelectorAll('script[src]');
var imgElements = document.querySelectorAll('img');
totalLength = (styleElements.length + linkElements.length + scriptElements.length + imgElements.length);
for(var i=0; i<styleElements.length; i++){
styleElements[i].setAttribute('onload','calc(this);');
}
for(var i=0; i<linkElements.length; i++){
var source = linkElements[i].href;
linkElements[i].remove();
var newLink = document.createElement('link');
newLink.setAttribute('href', source);
newLink.setAttribute('rel', 'stylesheet');
newLink.setAttribute('onload','calc(this);');
document.head.appendChild(newLink);
}
for(var i=0; i<scriptElements.length; i++){
var source = scriptElements[i].src;
scriptElements[i].remove();
var newScript = document.createElement('script');
newScript.setAttribute('src', source);
newScript.setAttribute('onload','calc(this);');
document.head.appendChild(newScript);
}
for(var i=0; i<imgElements.length; i++){
imgElements[i].setAttribute('onload','calc(this);');
}
}
}
实际上这段代码的一些问题是:
- 资源错误(加载失败、404 等)破坏了百分比计算
<style>
元素在百分比计算中被忽略,具体取决于它们的放置位置(如<link>
元素之后或<script>
元素之前)- css链接加载的资源实际上是无法识别的
更新:经过一些测试,我开始认为这一切都是完全没用的,因为删除和读取元素(如脚本)我导致它们被执行了 2 次......
我正在考虑使用文档写入来扫描源代码,替换并做这些东西,但这不仅是一个坏主意,也许这是不可能的,因为我必须在正文的末尾执行它(以获得完整的页面源,头部 + 全身),当所有脚本和东西都已经执行时......
所以..我不知道该怎么办,也许没有办法根据资源负载创建进度条,对吧?