Javascript 在创建Id之前使用getElementById

Javascript 在创建Id之前使用getElementById,javascript,html,Javascript,Html,以下代码起作用: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Orientation Test</title> <style> </style> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-m

以下代码起作用:

<!DOCTYPE html>
 <html>

<head>
<meta charset="utf-8" />
<title>Orientation Test</title>

<style>
</style>

<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="initial-scale=1, user-scalable=no">

<style type='text/css'>

    body {font-family:Helvetica,FreeSans,Arial,sans; font-size:18px;}
    h1 {margin:0; font-size:22px;}
    label {font-weight:bold; display:inline-block; width:50%;}
    #wrapper {width:100%; height:100%;}

 </style>

 <script type="text/javascript" src="main.js"></script>
 </head>

 <body>

 <div id="wrapper">
    <h1>Device motion test</h1>
    <p><label for="aX">aX</label><span id="aX"></span></p>
    <p><label for="aY">aY</label><span id="aY"></span></p>
    <p><label for="aZ">aZ</label><span id="aZ"></span></p>

    <p id = "change">0</p>
 </div>
 </body>

 </html>

定向测试
正文{字体系列:Helvetica、FreeSans、Arial、sans;字体大小:18px;}
h1{边距:0;字体大小:22px;}
标签{字体重量:粗体;显示:内联块;宽度:50%;}
#包装{宽度:100%;高度:100%;}
设备运动测试
斧头

阿兹

0

Javascript文件:

 var s$ = function(e) {
 return document.getElementById(e);
 };


 if (window.DeviceMotionEvent) {
 alert('devicemotion supported');
 window.addEventListener('devicemotion', function(ev) {
    var acc = ev.accelerationIncludingGravity;
    dmHdlr(acc.x, acc.y, acc.z);
 }, false);
 }
 else {
 alert("devicemotion not supported on your device or browser.");
 }


var lastDM = new Date().getTime();

function dmHdlr(aX, aY, aZ) {
var currDM = new Date().getTime();
//if (currDM < lastDM + 1000) {return;}
lastDM = currDM;

s$('aX').innerHTML = aX ? aX.toFixed(3) : '?';
s$('aY').innerHTML = aY ? aY.toFixed(3) : '?';
s$('aZ').innerHTML = aZ ? aZ.toFixed(3) : '?';


}
var s$=函数(e){
返回文档.getElementById(e);
};
if(window.DeviceMotionEvent){
警报(“支持设备移动”);
window.addEventListener('devicemotion',函数(ev){
var acc=电动汽车加速度,包括重力;
dmHdlr(附件x、附件y、附件z);
},假);
}
否则{
警报(“您的设备或浏览器不支持devicemotion。”);
}
var lastDM=new Date().getTime();
功能dmHdlr(aX、aY、aZ){
var currDM=new Date().getTime();
//如果(currDM
我不明白这个代码是怎么工作的。在创建所需元素之前,我正在使用document.getElementById函数。在声明某些元素的id之前,我已经将标记放在HTML文件的头中,这段代码如何工作?脚本在创建元素之前运行,但它可以工作吗


谢谢

 if (window.DeviceMotionEvent) {...    

被触发。此时主体已经呈现,并且id存在于DOM中,因此没有问题。只要调用函数时id存在,就可以首先声明函数。在本例中,确实如此。

我可以说,对于Chrome、Firefox和IE9浏览器,所有这些都遵循解析html和执行javascript的顺序

浏览器首先加载html并从页面头部解析其所有标记。在您的html中,它将解析标题标记,然后是元标记,然后是样式标记等。它还解析您在中提到的javascript文件,但不执行

然后构建DOM层次结构,并将CSS属性设置为DOM元素

最后,当DOM就位时,它执行javascript

 if (window.DeviceMotionEvent) {
  ...
 window.addEventListener('devicemotion', function(ev) {
  ...
 }

这就是为什么浏览器在
main.js
中执行
if
条件,并按id获取元素,因为元素已经被浏览器解析。

getElementById()
调用仅在
devicemotion
事件中发生;到那时,文档已经准备好,ID已经存在,等等。对于我来说,将脚本标记放在HTML5文件的末尾,这样我就可以确定我在创建ID后运行代码,这被认为是一种不好的做法吗?不,实际上,将脚本链接到正文底部是一种很好的做法。您可以在头部包含库链接(jQuery.js等),并在结束标记之前添加自定义脚本。谢谢!这让我的事情简单多了。