html 元素直到页面加载后才存在,但是您的 js<body>
甚至在浏览器读取标签之前就已执行。您的脚本标签位于<body>
标签之前,因此浏览器首先执行 js 代码。如果您需要将 js 代码的执行延迟到页面加载之后(大多数 js 代码就是这种情况)——并且你不想使用 jquery——那么你可以这样做:
<script type="text/javascript">
window.onload = function() {
//js code here
}
</script>
在页面加载之后的 onload 事件发生之前,该函数不会执行。onload 事件的问题是,所有的图片必须在事件触发之前完全加载,这可能需要很长时间,这将延迟渲染 js 设置的任何样式,或者允许按钮触发 js 设置的 onclick 处理程序。
作为替代方案,您可以将脚本标签放在结束正文标签之前:...
<script type="text/javascript">
//js code here
</script>
</body>
在这种情况下,当遇到 javascript 标签时,页面上的所有 html 都将被浏览器解析,因此所有 html 元素都将存在。<img>
被解析的标签将存在,但浏览器不会等待它们加载 - 浏览器会继续并在图像加载时解析 html 的其余部分。即使还没有看到它的结束标签,甚至 body 元素也存在。
更好的是链接到一个 js 文件,这样你的 js 代码就不会弄乱 html:
<script type="text/javascript" src="myjs.js"></script>
</body>
另外,如果你有这个:
<body class="bgcolor">
...并且您的 js 代码执行此操作:
document.getElementsByTagName('body')[0].className += 'mac-os';
...然后你会得到他的:
<body class="bgcolormac-os">
...这不是你想要的。您需要在其中添加一个空格:
.... += ' mac-os';
...这样你就会得到:
<body class="bgcolor mac-os">
对您的代码风格的评论:您需要添加更多空格,例如:
if (1 == mac) {
document.getElementsByTagName('body')[0].className += 'mac-os';
}
else {
document.getElementsByTagName('body')[0].className += 'win-os';
}
另外,不要使用“拥抱”的 else 子句——它们真的很难看。考虑使用示例中的样式,其中 else 从新行开始。代码清晰是您的目标——而不是最少的字节数。您也可以考虑只缩进 2 个空格——js 语句可能会变得很长,因此节省空间会很有帮助。
并且为了避免重新输入那些长document.get....
语句并使您的代码更易于阅读,您可以执行以下操作:
var mybody = document.getElementsByTagName('body')[0];
if (1 == mac) {
mybody.className += ' mac-os';
}
else {
mybody.className += ' win-os';
}