<script>放在head或者body中出现的问题

  今天看js高级编程form表单这一章,看着书上的例子敲代码的时候出现了一点问题,什么问题先不说,先看这段代码?

<!DOCTYPE html>
<html>
<head>
    <title>Form Fields Example</title>
    <script type="text/javascript">
        var form = document.getElementById("myForm");
        console.log(form.elements[‘color‘].length);
    </script>
</head>
<body>
    <form method="post"  id="myForm">
        <ul>
            <li><input type="radio" name="color" value="red">Red</li>
            <li><input type="radio" name="color" value="green">Green</li>
            <li><input type="radio" name="color" value="blue">Blue</li>
        </ul>
    </form>
</body>
</html>

代码就是上面这个样子的,很简单的一个表单里面有一组radio标签,要实现的效果也就是通过表单拿到这一组radio标签,但是我按照上面的写法打出来之后控制台却一直报错,错误信息如下:

意思就是无法读取null的elements属性,开始我还以为是我代码写错了,但是仔细检查之后发现也没错,甚至我还以为是form表单没有写action属性这些造成的,但是一一尝试之后发现还是一直在报相同的错误,没办法了之后去找这本书的示例代码,示例代码如下所示:

<!DOCTYPE html>
<html>
<head>
    <title>Form Fields Example</title>

</head>
<body>
    <form method="post"  id="myForm">
        <ul>
            <li><input type="radio" name="color" value="red">Red</li>
            <li><input type="radio" name="color" value="green">Green</li>
            <li><input type="radio" name="color" value="blue">Blue</li>
        </ul>
    </form>  

    <script type="text/javascript">
        var form = document.getElementById("myForm");
        console.log(form.elements[‘color‘].length);
    </script>
</body>
</html>

拿到示例代码之后发现运行完成正确,没有任何错误,当时我就比较郁闷了,两个代码几乎是完全一样,唯一不一样的就是<script>标签的位置不一样,我按照惯例把<script>标签写在了<head>标签中,示例中是把<script>标签放在了<body>中,然后我就把我的代码也放在<body>中,然后就没有继续出错了,我就感觉很奇怪,因为我记得<script>标签是可以放在页面上的任何位置的,但是为什么放在不同的地方就不一样了呢?为了验证我的猜想,我做了一下几个实验:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<script>
			 console.log(111);	//111
			var colors1 = document.getElementsByName("color");
			console.log(‘--------1----------‘+colors1.length);//--------1----------0
			var form1 = document.getElementById("myForm");
			console.log(‘-----1-------------‘+form1);//-----1-------------null
			var sizeRadio1 = document.getElementsByName("size");
			console.log(‘-----size1------‘+sizeRadio1.length);//-----size1------0
		</script>
	</head>
	<body>
		<ul>
			<li>
				<input type="radio" name="size" value="1" />
				<input type="radio" name="size" value="2" />
				<input type="radio" name="size" value="3" />
				<input type="radio" name="size" value="4" />
			</li>
		</ul>

		<form method="post"  id="myForm">
	        <ul>
	            <li><input type="radio" name="color" value="red">Red</li>
	            <li><input type="radio" name="color" value="green">Green</li>
	            <li><input type="radio" name="color" value="blue">Blue</li>
	        </ul>
	    </form>
	</body>
	<script>
			console.log(222);
			var colors2 = document.getElementsByName("color");
			console.log(‘-------2----------‘+colors2.length);//-------2----------3
			 var form2 = document.getElementById("myForm");
            console.log(‘------------form2----------------------‘+form2.elements.length);//------------form2----------------------3
            var sizeRadio2 = document.getElementsByName("size");
			console.log(‘-----size2------‘+sizeRadio2.length);//-----size2------4
	</script>
</html>

  通过上面的代码,我发现了这么个情况,只要是没有操作<body>中标签的script代码放在那里都无所谓,只不过是加载顺序不一样罢了,就行打印111和打印222一样,先打印出来了在head中的111,然后才打印出来了再body中的222,但是在需要操作body中的元素时,在head标签中的script代码就会出问题,就是找不到需要操作的元素,经过我的实验之后我得出的一个结论是:如果需要在script中操作body中的元素,那么必须在要操作的元素加载完成之后才可以,也就是说要把操作元素的js代码放在元素之后。

  后来我在网上查了一下html页面上关于js以及标签的加载顺序,跟我的猜想是一样的,html是从上到下进行加载的,遇到使用连接方式加载的js或者css就发送request请求加载,如果是直接写的代码,那么就直接初始化,如果是函数那么就直接初始化,在触发时直接执行函数,如果在head中操作body中的元素,那么就会出现找不到的情况,因为此时body中的元素还没有加载完成。

我的理解暂时就是这个样子了,如果有说的不对的地方欢迎大家指正。

时间: 2024-10-27 11:56:08

<script>放在head或者body中出现的问题的相关文章

定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = []; var NewArr = []

[翻译]Component Registration in Script System 在脚本系统中注册组件

Component Registration in Script System 在脚本系统中注册组件   To refer to our component from a script, the class, its properties and methods must first be registered in the script system. You may place the registration code in a file with the same name as the

将展示内容(div、iframe)放在Expand控件中

Expand是ArcGIS JavaScript API 4.3推出的一个widget(控件),用于承载一个HTML DOM元素,可以把一个自己编写的div或者是一个其他的Esri widget控件放到Expand里面.Expand在地图上显示为一个小方块按钮,点击可以展开或关闭它所承载的内容.关于Expand控件的详细内容,请查看:https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Expand.

把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案

把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败在python3中调用会成功,但是调用不能成功 解决办法是: 在该文件夹下加入空文件__init__.py python2会把该文件夹整体当成一个包 然后编辑__init__.py 加入__all__ = ["功能名1","功能名2",...../或者类名也行] 再通过from . import 模块名 这样就可以调用包中那些模块功能了 #如果导入这个模块的方式是 from 模块名 import

阿里规范 - 六、工程结构 - (二)二方库依赖 - 9. 【推荐】所有 pom 文件中的依赖声明放在&lt;dependencies&gt;语句块中,所有版本仲裁放在 &lt;dependencyManagement&gt;语句块中。

9. [推荐]所有 pom 文件中的依赖声明放在<dependencies>语句块中,所有版本仲裁放在 <dependencyManagement>语句块中. 说明:<dependencyManagement>里只是声明版本,并不实现引入,因此子项目需要显式的声明依 赖,version 和 scope 都读取自父 pom.而<dependencies>所有声明在主 pom 的<dependencies>里 的依赖都会自动引入,并默认被所有的子项目

JS代码放在head和body中的区别分析

那么有什么不同呢?先看一个例子: 一个二级级联动态下拉列表框,一级分类(即大类别)id="vSort0". 复制代码代码如下: <head> function changelocation(id) {…………} </head> <body><select class="input1" id="vSort0" name="vSort0" onChange="changeloca

script放在body和放在head的区别

放在body中:在页面加载的时候被执行 放在head中:在被调用时被执行 原因: 1.浏览器是从上到下解析HTML的. 2.放在head里的js代码,会在body解析之前被解析:放在body里的js代码,会在整个页面加载完成之后解析. js应该放哪: 1.head中:需调用才执行或事件触发执行的脚本,可以保证脚本在调用之前被加载 2.body中:当页面被加载时执行的脚本,通常被用来生成页面内容 原文地址:https://www.cnblogs.com/tongcc/p/11390484.html

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由Point派生出Circle类,再由Circle派生出Cylinder类.将类的定义部分分别作为3个头文件,对他们的成员函数的定义分别作为3个源文件 1.Point.h文件 1 #ifndef POINT_H 2 #define POINT_H 3 #include<iostream> //头文件也需要包含这个 4 using namespace std; 5

jsp页面中使用javascript获取后台放在request或session中的值

在JSP页面中.常常使用javascript,可是要出javascript获取存储在request,session, application中的值.例如以下是获取request中的值: 如果后台中有: request.setAttribute("value", "123"); 在前台的javascript中有例如以下获取方式: 1 : var val =  "${value}"; 2: var val = "<%=request.