避免看到准备好文档的javascript更改
我试图深入了解我为什么会看到以下情况,以及我如何解决这些问题: 我在下面链接了一个测试页面,它的DOM非常小,我在页面上有一个元素,该元素的初始高度值完全是用CSS设置的,在doc ready上,会触发一个jQuery函数,为该元素指定一个新的高度值,我的问题是,当页面构建时,这种变化在视觉上是明显的,您可以看到元素很快从jQuery函数中获得新的高度值,我的目标是防止出现这种情况,因此当页面加载时,您只能看到带有jQuery高度值的元素。我原以为JavaScript render会阻止页面在浏览器中构建,直到所有doc就绪函数都启动,除非设置了异步或延迟,但现在我假设我错了 编辑: 澄清一下,这只是一个例子,我试图解决的问题与身高无关,我试图找到一个解决办法,解决我的jQuery在docready上应用CSS时存在视觉延迟的问题,并更好地理解延迟存在的原因 整个DOM:避免看到准备好文档的javascript更改,javascript,jquery,dom,onload,jquery-deferred,Javascript,Jquery,Dom,Onload,Jquery Deferred,我试图深入了解我为什么会看到以下情况,以及我如何解决这些问题: 我在下面链接了一个测试页面,它的DOM非常小,我在页面上有一个元素,该元素的初始高度值完全是用CSS设置的,在doc ready上,会触发一个jQuery函数,为该元素指定一个新的高度值,我的问题是,当页面构建时,这种变化在视觉上是明显的,您可以看到元素很快从jQuery函数中获得新的高度值,我的目标是防止出现这种情况,因此当页面加载时,您只能看到带有jQuery高度值的元素。我原以为JavaScript render会阻止页面在浏
<style>
html {
background: #eee;
}
.box {
height: 64px;
width: 50%;
max-width: 280px;
max-width: 1280px;
margin: 64px auto 0 auto;
position: relative;
background: #fff;
box-shadow: 0 0.08em 0.25em 0 rgba(0,0,0,0.3);
}
</style>
<script type='text/javascript' src='[my path]/js/jquery-3.1.1.min.js?ver=3.1.1'></script>
<script type="text/javascript">
jQuery(document).ready(function(){
function adjustBox() {
windowHeight = window.document.documentElement.clientHeight;
$('.box').css('height', windowHeight * 1/2);
}
adjustBox();
});
</script>
<div class="box"></div>
html{
背景:#eee;
}
.盒子{
高度:64px;
宽度:50%;
最大宽度:280px;
最大宽度:1280px;
保证金:64px自动0自动;
位置:相对位置;
背景:#fff;
盒影:0.08em0.25em0 rgba(0,0,0,0.3);
}
jQuery(文档).ready(函数(){
函数调整框(){
windowHeight=window.document.documentElement.clientHeight;
$('.box').css('height',windowHeight*1/2);
}
调整框();
});
如果您想让该框占用户窗口高度的50%,可以使用CSS:
.box {
height: 50vh; // vh => view-height
}
您的示例JavaScript在加载DOM后执行。
这就是为什么加载页面后会看到.box
高度调整。
当您将
标记放在
中并且不使用jQuery.ready()
函数时,可以在页面完全加载之前运行JS
<head>
<script>
// 1
alert('this runs immediately. even before the document has been parsed');
// 2
$(function() {
alert('this runs when the document has been loaded');
});
// 2
$(document).ready(function(){
alert('this runs when the document has been loaded');
});
// 3
$(window).load(function(){
alert('this runs when the document has been loaded AND resources like images has been loaded');
});
</script>
</head>
<body>
<script>
// 2
alert('this runs when the document has been loaded');
</script>
</body>
// 1
警报('这会立即运行。甚至在文档被解析之前');
// 2
$(函数(){
警报(“加载文档后将运行此命令”);
});
// 2
$(文档).ready(函数(){
警报(“加载文档后将运行此命令”);
});
// 3
$(窗口)。加载(函数(){
警报(“当文档已加载且图像等资源已加载时,此命令将运行”);
});
// 2
警报(“加载文档后将运行此命令”);
- 注释为
:JS无法在此处操作文档,因为它尚未加载。您可以重定向或从服务器加载数据等1
- 注释为
:这些基本相同。该文档已准备好由JS进行操作。但这并不意味着所有的资源都是可用的 加载。您无法获得图像的准确高度2
- 注释为
:如果需要获取图像的高度,请使用3
$(窗口)。加载
.box {
height: 50vh; // vh => view-height
}
您的示例JavaScript在加载DOM后执行。
这就是为什么加载页面后会看到.box
高度调整。
当您将
标记放在
中并且不使用jQuery.ready()
函数时,可以在页面完全加载之前运行JS
<head>
<script>
// 1
alert('this runs immediately. even before the document has been parsed');
// 2
$(function() {
alert('this runs when the document has been loaded');
});
// 2
$(document).ready(function(){
alert('this runs when the document has been loaded');
});
// 3
$(window).load(function(){
alert('this runs when the document has been loaded AND resources like images has been loaded');
});
</script>
</head>
<body>
<script>
// 2
alert('this runs when the document has been loaded');
</script>
</body>
// 1
警报('这会立即运行。甚至在文档被解析之前');
// 2
$(函数(){
警报(“加载文档后将运行此命令”);
});
// 2
$(文档).ready(函数(){
警报(“加载文档后将运行此命令”);
});
// 3
$(窗口)。加载(函数(){
警报(“当文档已加载且图像等资源已加载时,此命令将运行”);
});
// 2
警报(“加载文档后将运行此命令”);
- 注释为
:JS无法在此处操作文档,因为它尚未加载。您可以重定向或从服务器加载数据等1
- 注释为
:这些基本相同。该文档已准备好由JS进行操作。但这并不意味着所有的资源都是可用的 加载。您无法获得图像的准确高度2
- 注释为
:如果需要获取图像的高度,请使用3
$(窗口)。加载
您可以执行类似于vue/angular/等的操作。。。并且有一个helper属性,您可以应用它来“隐藏”元素,直到它被完全处理 css js
为什么不将CSS中的高度设置为
50vh
?好吧,我应该澄清一下,这只是一个测试示例,我想了解的问题是如何防止javascript延迟在页面加载时在视觉上生效。您可以始终在中设置元素动画??否则CSS是最好的方法,你的确切问题是什么,通常提供一个例子可以得到与你的需求不相关的答案。你不能阻止javascript运行的延迟。你可以使用一个加载覆盖并隐藏高度设置好后我的问题有点交叉,但高度示例非常接近我真正的代码问题,我一直在假设页面在应用doc-ready JS后在视口中呈现,而不是在应用doc-ready JS之后,所以听起来很简单